Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用静态连接时数据库挂起_Java_Database_Static_Database Connection - Fatal编程技术网

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

Java 使用静态连接时数据库挂起,java,database,static,database-connection,Java,Database,Static,Database Connection,我这里有一个基本问题-我正在使用一个名为XpressMP的新数据库 我编写了一个多线程程序,将大量记录插入数据库。在连接数据库时,我注意到一件最重要的事情: 在我的程序中,如果我使用下面的内容- class Task implements Runnable { private Connection dbConnection = null; private PreparedStatement preparedStatement = null; //other stuff

我这里有一个基本问题-我正在使用一个名为
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) {
            }
        }
    }
  }
}
它工作正常,我正在关闭最后一个区块中的每个连接。我可以在数据库中插入更多的行

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

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,他们正在与拥有该数据库的人员交谈


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

您正在不同线程之间共享一个对象引用变量。。。有时,一个连接对象被创建,在它被关闭(其引用被设置为null)之前,另一个线程启动,创建另一个对象,并且从不关闭旧的对象。所以,那个连接仍然是活动的,在某个时间点,太多的连接将被打开,你们的DBMS可能崩溃,抛出一些错误,比如“太多连接”。问题不在于驱动器,而在于代码。请注意,某些线程也可能关闭由另一个线程创建的连接


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

JDBC不是线程安全的,因此您不应该并行使用来自多个线程的一个连接对象,无论它是否存储在静态字段中。一旦这样做,就可能有一个线程会在其他线程的查询中间发送它的查询,因此数据库将接收完整的垃圾,如果数据库不可靠,这个垃圾可能会破坏数据库。有时,一个连接对象被创建,在它关闭之前,另一个线程启动,创建另一个对象,而从不关闭旧的对象。所以,那个连接仍然是活动的,在某个时间点上,太多的连接将被打开,你们的DBMS将崩溃,抛出一些错误,比如“太多连接”。问题不在于你的驱动器,而在于你的代码。问题在于,它没有引发任何异常。数据库被挂起。。你不能在那上面做任何事。。只是您需要重新启动整个数据库。@TechGeeky:在这种情况下,您的DBMS可能无法处理此问题,但我坚持认为,在您的特定情况下,您的代码是不正确的。您是否尝试对其他DBMS执行相同的操作?我想你也会有同样的问题。我想我知道为什么您没有看到DBMS错误。我正在更新我的答案。是的,我试着用Oracle数据库做同样的事情。。Oracle db正在引发异常,并且它也没有被挂起。我仍然可以让我们从sql开发者那里选择db。我知道使用静态连接不好。@TechGeeky:所以,您有两个问题:代码和DBMS。