gpt4 book ai didi

java - Oracle JDBC DriverManager.getConnection() 挂起

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:42 26 4
gpt4 key购买 nike

我们有几台服务器,每台服务器都运行 Oracle 数据库 11g 版本 11.2.0.1.0 - 64 位。我们通过 JDBC 进行连接,如下所示:

public Connection createConnection(String drvClass, String connURL, String user, String pass)
throws ClassNotFoundException, SQLException {
Class.forName(drvClass);
Connection conn = DriverManager.getConnection(connURL, user, pass);
for (SQLWarning warn = conn.getWarnings(); warn != null; warn = warn.getNextWarning()) {
System.out.println("SQL Warning:");
System.out.println("State : " + warn.getSQLState());
System.out.println("Message: " + warn.getMessage());
System.out.println("Error : " + warn.getErrorCode());
}
return conn;
}

drvClass 将是 oracle.jdbc.OracleDriver。尝试连接的程序在每台服务器上运行。可以从具有完全相同连接属性的其他程序访问该数据库。

也可以让这个程序在另一台服务器上运行并让它连接到有问题的数据库。它可以建立连接。如果该程序在本地服务器上运行,则该程序无法运行。我们尝试了 IP 和服务器名。

在一台服务器上,代码卡在 DriverManager.getConnection() 处,我无法找出原因。有谁知道这可能是什么原因造成的吗?

数据库日志中没有与此相关的条目。

阻塞线程的堆栈跟踪:

"pool-27-thread-1" - Thread t@1483
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Packet.java:239)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:255)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:973)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:291)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at com.companyname.DBConnectionInternal.DBConnection.createConnection(DBConnection.java:19)
at com.companyname.exportadapter.ExportCollector.initDatabase(ExportCollector.java:259)
at com.companyname.exportadapter.ExportCollector.run(ExportCollector.java:120)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Locked ownable synchronizers:
- locked <50be77> (a java.util.concurrent.ThreadPoolExecutor$Worker)
<小时/>

如果我设置DriverManager.setLoginTimeout(10)然后我得到Io 异常:套接字读取超时

最佳答案

您可能会建立一些不必要的联系。

使连接静态,每当您创建新连接时,请检查旧连接是否处于 Activity 状态或关闭,然后您必须创建新连接,否则返回旧连接。

喜欢

 if(conn!=null & !conn.isClosed()){ 
// code for create connection
}

这还取决于数据库端的配置方式,因此请与您系统的 DBA 进行检查。

我建议使用连接池。

希望这有帮助。

关于java - Oracle JDBC DriverManager.getConnection() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23868433/

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