Oracle JDBC DriverManager.getConnection()挂起

时间:2014-05-26 10:49:33

标签: java oracle jdbc oracle11gr2

我们有几个服务器,每个服务器运行一个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

3 个答案:

答案 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超时。