我们开发了一个Camel软件包(部署在Karaf中),预计每24小时从MySQL提取数据并将其推送到S3.但是,如果MysqL在8小时内空闲,内部关闭连接,因此在下一次计划执行时,它会开始抛出错误.请参阅我们的代码中的以下片段.
属性:
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,因此我们需要在代码中处理这个问题.
解决方法:
我刚才有类似的问题. VikingSteve也是他建议你做的事情.由于我使用的是Osgi蓝图,我在XML中完成了所有配置,因此我按照以下方式解决了这个问题.
1)将Apache Commons DBCP依赖项添加到您的pom:
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
2)在camel route / blueprint文件中声明连接池,如下所示:
<bean id="MydataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton" >
<property name="driverClassName" value="com.MysqL.jdbc.Driver"/>
<property name="url" value="jdbc:MysqL://DB-001:3306/Customer"/>
<property name="username" value="sys_ETL"/>
<property name="password" value="Blah"/>
<property name="initialSize" value="4"/>
<property name="maxActive" value="32"/>
<property name="maxIdle" value="16"/>
<property name="minIdle" value="8"/>
<property name="timeBetweenevictionRunsMillis" value="1800"/>
<property name="minevictableIdleTimeMillis" value="1800"/>
<property name="testOnBorrow" value="true"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnReturn" value="true"/>
<property name="validationQuery" value="SELECT 1"/>
<property name="maxWait" value="1000"/>
<property name="removeAbandoned" value="true"/>
<property name="logAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="30000"/>
</bean>
此步骤将创建一个数据库连接池作为bean,然后我可以在我的路由中使用它.这个bean的名字是Mydatasource我稍后会使用这个信息.另请注意我在配置中为连接池设置的属性.这些属性允许我的连接池增长和缩小,并且即使在空闲之后连接也不会过时.
3)创建POJO以使用此连接池:
public class Account@R_384_4045@ionToDatabase {
private BasicDataSource dataSource;
public BasicDataSource getDataSource() {
return dataSource;
}
public void setDataSource(BasicDataSource dataSource) {
this.dataSource = dataSource;
}
@Handler
public void PersistRecord
(
@Body AccountRecordBindy msgBody
, @Headers Map hdr
, Exchange exch
) throws Exception
{
Connection conn = null;
PreparedStatement stmt=null;
try
{
conn= dataSource.getConnection();
stmt =conn.prepareStatement("SOME INSERT STATEMENT");
stmt.setString(1,msgBody.getAccountNumber().trim());
stmt.setString(2,msgBody.getrecordtype().trim() );
stmt.setString(3,msgBody.getSequenceNumber().trim());
stmt.setString(4,msgBody.getTitle().trim());
stmt.setString(5,msgBody.getCustomerType().trim());
stmt.setString(6,msgBody.getName().trim());
stmt.setString(7,msgBody.getAccountAddress1().trim());
stmt.executeUpdate();
}
catch (Exception e)
{
throw new Exception(e.getMessage());
}
finally
{
try
{
if (stmt!=null)
{
stmt.close();
stmt= null;
}
if (conn!=null)
{
conn.close();
conn= null;
}
}
catch(sqlException e)
{
throw new Exception(e.getMessage());
}
}
}
}
此POJO具有名为datasource的属性,其类型为org.apache.commons.dbcp.BasicDataSource.我现在可以将Mydatasource bean注入此POJO,以便我的类可以访问连接池.
4)将POJO转换为bean并注入连接池:
<bean id="AccountPersist" class="Account@R_384_4045@ionToDatabase">
<property name="dataSource" ref="MydataSource"/>
</bean>
如果您正在进行文本文件处理并希望使用并发插入等,则必须使用此技术.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。