我们开发了一个Camel包(在Karaf中部署),预计每隔24小时从MySQL中获取数据并将其推送到S3。但是,如果MySQL在内部关闭了连接,如果它闲置了8个小时,那么在下一次计划执行时,它会开始抛出一个错误。请参阅下面的代码片段。骆驼jdbc:如果mysql连接关闭,我该如何重置数据源
属性:
MySqlDriver=com.mysql.jdbc.Driver
MySqlDatabaseURL=jdbc:mysql://x.x.x.x/dbname?autoReconnect=true
MySqlUsername=sm*****
MySqlPassword=*******
激活:
public class Activator implements BundleActivator {
public CamelContext context = null;
public void start(BundleContext bundleContext) throws Exception {
DataSource dataSource = UDMSUtils.createDataSource(UDMSUtils.getProperty(UDMSConstants.MYSQL_DATABASE_URL));
SimpleRegistry simpleRegistry = new SimpleRegistry();
simpleRegistry.put(UDMSConstants.UDMS_DATA_SOURCE, dataSource);
context = new OsgiDefaultCamelContext(bundleContext, simpleRegistry);
context.addRoutes(new CreativeRoutes());
context.start();
}
}
大厦数据来源:
public static DataSource createDataSource(String connectURI) {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(getProperty(UDMSConstants.MYSQL_DRIVER));
ds.setUsername(getProperty(UDMSConstants.MYSQL_USERNAME));
ds.setPassword(getProperty(UDMSConstants.MYSQL_PASSWORD));
ds.setUrl(connectURI);
ds.setMaxWait(-1); // Waits indefinately
return ds;
}
路线:
from("timer://Timer?repeatCount=1").to("direct:record_count").end();
from("direct:record_count")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setBody(query);
}
})
.routeId("record_count")
.to("jdbc:" + UDMSConstants.UDMS_DATA_SOURCE)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
// ...
}
);
任何人都可以请建议,在上面的代码中需要做什么修改,以便只要我们需要连接就保持活动状态。
请注意:我们无权更改mysql.properties
,因此我们需要在我们的代码中处理此操作。
为什么你不使用连接池和借用自动测试(或任何其称为)设置为true。 – vikingsteve
感谢Steve(@vikingsteve),当我创建一个dataSource对象时,我添加了这一行:'ds.setTestOnBorrow(true);',现在正在测试它,将在完成测试后将我的发现放入。 –