【发布时间】:2012-06-01 07:10:53
【问题描述】:
我的团队必须进行一些更改并更新旧的 Web 应用程序。此应用程序有一个主线程和 5 到 15 个守护线程,用作工作线程,用于在数据库中检索和插入数据。
所有这些线程都有这种设计(为方便起见,这里简化了):
public MyDaemon implements Runnable {
// initialization and some other stuffs
public void run() {
...
while(isEnabled) {
Engine.doTask1();
Engine.doTask2();
...
Thread.sleep(someTime);
}
}
}
Engine 类提供了一系列静态方法,用于处理 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 语句与 DB 交互。数据源在服务器中配置。
public ThatDataAccessor {
public synchronized void retrieve(DataType data) {
Connection conn = DataSource.getConnection();
// JDBC stuff
conn.close();
}
...
}
问题是主线程需要连接到数据库,当这些守护线程工作时,我们很容易用完池中的可用连接,出现“等待连接超时”异常。此外,有时甚至那些守护线程也会出现同样的异常。
我们必须摆脱这个问题。
我们有一个连接池配置了 20 个连接,不能再添加了,因为“20”是我们的生产环境标准。一些代码块需要同步,即使我们计划只在真正需要的地方移动“synchronized”关键字。但我不认为这会带来真正的不同。
我们在多线程编程方面没有经验,而且我们以前从未遇到过这种连接池问题,这就是为什么我要问:问题是由于这些线程的设计造成的吗?我们没有注意到的缺陷?
我已经一一分析了线程类,只要它们不并行运行,似乎就没有瓶颈可以证明那些“等待连接超时”是合理的。 该应用程序使用 Oracle 11g 在 WebSphere 7 上运行。
【问题讨论】:
标签: java multithreading connection-pooling