我们有几个服务器,每个服务器运行一个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 exception: Socket read timed out
。
答案 0 :(得分:1)
你可能会做一些不必要的连接。
make Connection
class static
,无论何时创建新连接,检查旧版本是活动还是关闭,然后您必须创建新连接,否则返回旧连接。
像
if(conn!=null & !conn.isClosed()){
// code for create connection
}
它还取决于数据库端的配置方式,因此请使用系统的DBA进行检查。
我建议使用连接池。
希望这会有所帮助。
答案 1 :(得分:0)
您可能希望为ojdbc驱动程序启用JDBC调试日志记录:http://docs.oracle.com/cd/B28359_01/java.111/b31224/diagnose.htm 这可能会为您提供有关驱动程序正在执行的操作的一些信息。
您是否尝试从客户端计算机远程登录数据库服务器(断言它可以访问)?
答案 2 :(得分:0)
服务器配置错误。由于某种原因,它配置了一个虚拟适配器,它返回了一个无法连接的ip。从外面解决工作正常。不知道为什么它永远不会用错误的IP超时。