首页 > 解决方案 > Camel - 在处理器内保持数据库连接

问题描述

我想在整个骆驼路线中保持数据库连接。我在路由上定义了名为“stageDataSource”的数据源。如何在处理器“MyDBStageProcessor”中使用相同的数据源或更确切地说是相同的数据库连接?

我在 MyDBStageProcessor 中创建了一个新连接并将其关闭。但是,它最大化了我在 Postgres 中的连接。因此,我想在整个路线上使用单个连接。

我可以从 Exchange 对象获取数据库连接吗?

        .to("sql:select t.id, vsts_project_id from table_name ?dataSource=stageDataSource")
        .to("log:?level=INFO&showBody=true")
        .split(body())
            .setHeader(Exchange.HTTP_METHOD, constant("GET"))
            .setHeader("Authorization", simple("Basic "+encodedToken))
            .setHeader("Content-Type", simple("application/json"))
            .setHeader("Accept", simple("application/json"))
            .setHeader("project_id",simple("${body[vsts_project_id]}"))
            .setHeader("team_id",simple("${body[id]}"))
            .setBody().simple("${body[vsts_project_id]}/${body[id]}")
            .setHeader(Exchange.HTTP_URI, simple(vstsServerURL + "/" + vstsCollectionName + "/${body}/_apis/work/teamsettings/iterations?api-version=5.0"))
            .to(vstsServerURL + "/" + vstsCollectionName + "/${body}/_apis/work/teamsettings/iterations?api-version=5.0").convertBodyTo(String.class)
            //.to("log:?level=INFO&showBody=true")
            .process(new MyDBStageProcessor())          
        .end()
        .to("log:?level=INFO&showBody=true");
---------------------------------------------------------------------------
public class MyDBStageProcessor implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        System.out.println("Inside MyDBStageProcessor");
        String input = (String) exchange.getIn().getBody().toString();
        //JSONObject jsonObject = new JSONObject(exchange.getIn().getBody());
        System.out.println("Body: " + input);
        JSONObject jsonObject = new JSONObject(input);
        DataSource dataSource = DBCPDataSourceFactory.getDataSource(); 
        Connection dbconn = dataSource.getConnection(); //how to use the same connection from the Camel route?
        try {
         // do some db work
        }
        catch(SQLException sqle) {
            sqle.printStackTrace();
        }
        finally {
            dbconn.close();
        }
    }
}


标签: javaapache-camel

解决方案


不要这样做,最好使用连接池(hikari,c3p0,...)。重用单个连接,你会遇到很多问题——连接对象不是线程安全的,连接超时等。


推荐阅读