Java 驼峰-在处理器内持久化数据库连接
我希望在整个camel路由中保持数据库连接。我已经在路由上定义了名为stageDataSource的数据源。如何在处理器MyDBStageProcessor中使用相同的数据源或更确切地说是相同的数据库连接 我在MyDBStageProcessor中创建了一个新连接并将其关闭。但是,这会让我在Postgres中的连接变得最繁忙。因此,我想在整个路线上使用一个连接 我可以从Exchange对象获取数据库连接吗Java 驼峰-在处理器内持久化数据库连接,java,apache-camel,Java,Apache Camel,我希望在整个camel路由中保持数据库连接。我已经在路由上定义了名为stageDataSource的数据源。如何在处理器MyDBStageProcessor中使用相同的数据源或更确切地说是相同的数据库连接 我在MyDBStageProcessor中创建了一个新连接并将其关闭。但是,这会让我在Postgres中的连接变得最繁忙。因此,我想在整个路线上使用一个连接 我可以从Exchange对象获取数据库连接吗 .to("sql:select t.id, vsts_project_id
.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();
}
}
}
不要这样做,最好使用连接池hikari、c3p0等。。。。如果重用单个连接,您将遇到许多问题-连接对象不是线程安全的,连接超时等。如果不这样做,最好使用连接池hikari、c3p0等。。。。重复使用单个连接时,您将遇到许多问题-连接对象不是线程安全的,连接超时等…谢谢,@Bedla!我已经将代码更改为使用hikari连接池,它似乎已经解决了这个问题。请将其添加为答案,以便接受。。