gpt4 book ai didi

java - 使用静态连接时数据库挂起

转载 作者:行者123 更新时间:2023-12-02 07:17:19 24 4
gpt4 key购买 nike

我有一个基本问题 - 我正在使用一个名为 XpressMP 的新数据库。

我编写了一个多线程程序来将大量记录插入数据库。在连接数据库时我注意到一件最重要的事情:

在我的程序中,如果我使用如下所示的内容-

class Task implements Runnable {

private Connection dbConnection = null;
private PreparedStatement preparedStatement = null;

//other stuff

@Override
public void run() {

try {

dbConnection = getDBConnection();

} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {
}
}
if (dbConnection != null) {
try {
dbConnection.close();
dbConnection = null;
} catch (SQLException e) {
}
}
}
}
}

它工作正常,我正在关闭最后一个 block 中的每个连接。我可以向数据库插入更多行。

但是一旦我开始有意地在多个线程中使用静态连接(我不应该这样做)-

class Task implements Runnable {

private static Connection dbConnection = null;
private static PreparedStatement preparedStatement = null;

//other stuff

@Override
public void run() {

try {

dbConnection = getDBConnection();

} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {

}
}
if (dbConnection != null) {
try {
dbConnection.close();
dbConnection = null;
} catch (SQLException e) {
}
}
}
}
}

整个数据库挂起。在重新启动数据库之前,我无法使用该数据库。这意味着我的 JDBC 驱动程序存在一些问题。我已经向 DBA 告知了这个问题,他们正在与拥有该数据库的人员进行交谈。

但我的问题是它为什么挂起。出于什么原因?

最佳答案

你在不同的线程之间共享一个对象引用变量...有时,一个连接对象被创建,在它关闭之前(并且它的引用被设置为空),另一个线程启动,创建另一个对象并且从不关闭旧的对象一。因此,该连接仍然处于 Activity 状态,并且在某些时候,将会打开太多连接,并且您的 DBMS 可能会崩溃,并出现一些错误,例如“连接太多”。问题不是你的驱动器,而是你的代码。请注意,某些线程也可能会关闭另一个线程创建的连接!

我认为您没有看到抛出的异常,因为您的外部 try 中没有 catch 。当您尝试创建连接时,将引发异常。尝试在那里放置一个 catch 以显示堆栈跟踪。如果您的数据库检测到此问题,它就会起作用(它可能会起作用)。

关于java - 使用静态连接时数据库挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14765066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com