【发布时间】:2014-07-10 10:43:05
【问题描述】:
我们开发了一个 Camel 捆绑包(部署在 Karaf 中),预计每 24 小时从 MySQL 拉取数据并将其推送到 S3。但是由于 MySQL 如果空闲 8 小时会在内部关闭连接,因此在下一次计划执行时它开始抛出错误。请从我们的代码中查看下面的 sn-ps。
属性:
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。
-
感谢 Steve (@vikingsteve),我在创建 dataSource 对象时添加了这一行:
ds.setTestOnBorrow(true);,我现在正在测试它,我会在完成测试后将我的发现放入。
标签: java mysql jdbc apache-camel apache-karaf