我有一个java应用程序,其中线程是套接字连接,它捕获数据并通过放入队列使用生产者和消费者概念传递给另一个线程进行数据处理。问题是数据库处理线程有时无法运行,我注意到有一些结果集和语句尚未关闭。这可能是它失败的原因,还是有其他原因。我怎么知道它失败了是使用isAlive方法来检查数据库处理线程,它显示没有值意味着死亡。
我的代码片段。
private LinkedBlockingQueue<String> databaseQueue = new LinkedBlockingQueue<String>();
class DatabaseProcessor implements Runnable {
public void run()
{
try
{
createConnection();
while (true)
{
message = databaseQueue.take();
//all the database processing here with multiple queries and resultsets
}
}
catch (Exception e)
{
e.printStackTrace(System.out);
try
{
dbconn.rollback();
}
catch (Exception rollback)
{
rollback.printStackTrace(System.out);
}
}
}
}
答案 0 :(得分:5)
谁知道你没有查看所有代码?
未能关闭各种稀缺资源,而不仅仅是那些与数据库相关的资源,最终表现为疲惫和不可用。与数据库的连接是有限的。结果集是游标,也是有限的。
您应该在创建它们的方法范围内关闭资源。在try块中获取 并在finally块中关闭它们,包含在各个try / catch块中。
答案 1 :(得分:2)
我非常怀疑resultSet
和statement
未被关闭是它失败的原因。我怀疑这是问题的症状。其中一个线程上的某些部分数据处理是抛出异常而数据库连接没有被关闭。
try { .. } finally { close database connections... }
个代码。这将确保他们被关闭。