如何在多线程Java应用程序中安全地使用OracleDriver.defaultConnection()?

时间:2014-09-17 02:31:28

标签: java multithreading oracle11g jvm database-connection

我有一个多线程应用程序,它使用OracleDriver.defaultConnection()连接到数据库。 这行代码用于多个代码块,这些代码块由不同的线程访问。 我收到错误:检测到Java线程死锁

这是一段代码示例:

    private void function1() {
         //something here
         Connection conn = OracleDriver.defaultConnection();

         // something here
         conn.execute();
         conn.close();
   } 

第二段代码在一个单独的类中:

    private void function2() {

         //something here
         Connection conn = OracleDriver.defaultConnection();

         // something here
         conn.execute();
         conn.close();
    }

如何使此连接“线程安全”? 另外,我读到defaultConnection()返回一个静态对象。那么这可能是由于一个线程关闭连接而另一个线程正在使用它而引起的吗?

我不能使用任何需要我输入数据库用户名和密码的连接方法。

提前致谢!

1 个答案:

答案 0 :(得分:1)

Java提供了许多处理并发的方法(synchronized,ReentrantLock,ReadWriteLock)

考虑文件说:

  

oracle.jdbc.OracleDriver类defaultConnection()方法是Oracle扩展,并且始终返回相同的连接对象。

因为它总是返回相同的连接对象,所以可以在其上进行同步:

Connection conn = OracleDriver.defaultConnection();
synchronized (conn) {
    // something here
    conn.execute();
}

但是,由于以下原因,您需要删除所有conn.close()调用:

  

如果你确实调用了close()方法,请注意以下事项:通过defaultConnection()方法获得的所有连接实例(实际上都引用同一个连接对象)将被关闭,无法继续使用,状态和资源清理视情况而定。之后执行defaultConnection()将导致新的连接对象。

     

即使连接对象已关闭,也不会关闭与数据库的隐式连接。