我的团队必须进行一些更改并更新旧的Web应用程序。这个应用程序有一个主线程和5到15个守护进程线程,用作工作者来检索和插入数据库中的数据。多线程环境中的连接池超时问题
所有这些线程有这样的设计(这里简化为方便起见):
public MyDaemon implements Runnable {
// initialization and some other stuffs
public void run() {
...
while(isEnabled) {
Engine.doTask1();
Engine.doTask2();
...
Thread.sleep(someTime);
}
}
}
引擎类提供了一系列用于maipulate DataAccessor类的其他方法静态方法,其中一些方法,一直静:
public Engine {
public static doTask1() {
ThisDataAccessor.retrieve(DataType data);
// some complicated operations
ThisDataAccessor.insertOrUpdate(DataType data);
}
public static doTask2() {
ThatDataAccessor da = new ThatDataAccessor();
da.retrieve(DataType data);
// etc.
}
...
}
DataAccessor类通常使用包含在同步方法中的简单JDBC语句(某些类为静态)与数据库进行交互。数据源在服务器中配置。
public ThatDataAccessor {
public synchronized void retrieve(DataType data) {
Connection conn = DataSource.getConnection();
// JDBC stuff
conn.close();
}
...
}
的问题是,主线程需要连接到数据库,当这些守护线程正在努力,我们很容易跑出来,从池中的可用连接,让“等待连接超时”异常。另外,有时甚至这些守护进程线程也会得到相同的异常。我们不得不摆脱这个问题。
我们有一个配置了20个连接的连接池,由于“20”是我们的生产环境标准,所以不能再添加任何连接池。一些代码块需要同步,即使我们计划只在真正需要的地方移动“synchronized”关键字。但我认为这不会造成真正的差异。
我们不是在多线程编程经验,我们从未遇到过这种连接前池的问题,这就是为什么我问:的问题是由于这些线程的设计?有没有我们没有注意到的缺陷?
我有一个一个的配置线程类,只要他们没有并行运行,似乎没有任何瓶颈来证明那些“等待连接超时”的理由。 该应用程序使用Oracle 11g在WebSphere 7上运行。
我正在使用简单的JDBC,但我觉得问题与您所暴露的相似。代码的某些部分非常混乱,许多团队和开发人员都在努力,并且在某些情况下,我们发现了一些纠结和嵌套的try-catch块......我们将去寻找那些未关闭的连接,希望能够解决问题。 :) – javatutorial