当前位置: 首页 > 知识库问答 >
问题:

Camel-在处理器内保持数据库连接

龚伯寅
2023-03-14

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

我在MyDBStageProcencer中创建了一个新的连接并关闭了它。但是,它在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();
        }
    }
}


共有1个答案

茅昀
2023-03-14

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

 类似资料:
  • 我遇到了这个问题:对于Vaadin7,我已经配置了我的持久性。xml,下面是代码 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“version=“2.0” 当我创建一个新的JPA容器并将其绑定到一个表时,我会在MSSQL活动监视器上看到我的新连接,但如果会话超时或注销,我仍然会在SQL上看到连接。 如果我在应用程序中重新登录,

  • 问题内容: 我目前正在以内存模式测试H2 DB。我建立了一个连接 我想使用dbunit进行一些导入并设置dbUnits db连接 还有我想稍后查询的导入 所以我的问题是,在内存模式下,什么时候可以关闭连接?通常我会做这样的事情 但是在内存中,如果连接关闭,我会丢失数据吗?那么在我结束程序之前,它应该保持打开状态吗? 问题答案: 从H2文档中: 默认情况下,关闭与数据库的最后一个连接会关闭数据库。对

  • 我正在尝试修复与MySQL数据库的连接问题。几个小时后,我的服务器意外地关闭了与MySQL数据库的连接。 这是我的错误代码: 通用域名格式。mysql。jdbc。例外。jdbc4。CommunicationsException:从服务器成功接收到的最后一个数据包是37521865毫秒前。最后一个成功发送到服务器的数据包是37521865毫秒前。长于服务器配置的“等待超时”值。在应用程序中使用之前,

  • 问题内容: 背景: 我正在一个将Django与Postgres数据库一起使用的项目。在某些情况下,我们也会使用mod_wsgi,因为我的一些网络搜索都提到了它。在Web表单提交中,Django视图启动了一个需要大量时间的工作(比用户希望等待的时间还长),因此我们通过后台的系统调用来启动该工作。现在正在运行的作业需要能够读取和写入数据库。因为这项工作需要很长时间,所以我们使用多重处理来并行运行它的各

  • JsonArrayParser JSON 数组 类名:\Imi\Server\DataParser\JsonArrayParser::class 支持注入的属性: 名称 描述 默认值 options JSON 序列化时的参数 0 depth 设置最大深度。 必须大于0。 512 JsonObjectParser JSON 对象 类名:\Imi\Server\DataParser\JsonObjec

  • JsonArrayParser JSON 数组 类名:\Imi\Server\DataParser\JsonArrayParser::class 支持注入的属性: 名称 描述 默认值 options JSON 序列化时的参数 0 depth 设置最大深度。 必须大于0。 512 JsonObjectParser JSON 对象 类名:\Imi\Server\DataParser\JsonObjec