微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Camel jdbc:如果mysql连接关闭,如何重置数据源?

我们开发了一个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] 举报,一经查实,本站将立刻删除。

相关推荐