gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:31:41 25 4
gpt4 key购买 nike

我有一个多线程应用程序,它使用 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() 返回一个静态对象。那么这是否是由于一个线程关闭连接而另一个线程正在使用它而导致的呢?

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

提前致谢!

最佳答案

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

考虑到文档中说:

The oracle.jdbc.OracleDriver class defaultConnection() method is an Oracle extension and always returns the same connection object.

由于它始终返回相同的连接对象,因此您可以对其进行同步:

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

但是,您需要删除所有 conn.close() 调用,因为:

If you do call the close() method, be aware of the following: All connection instances obtained through the defaultConnection() method, which actually all reference the same connection object, will be closed and unavailable for further use, with state and resource cleanup as appropriate. Executing defaultConnection() afterward would result in a new connection object.

Even though the connection object is closed, the implicit connection to the database will not be closed.

关于java - 如何在多线程 Java 应用程序中安全地使用 OracleDriver.defaultConnection()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25881353/

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