设置JDBC连接的网络超时

Pat*_*k W 14 java database oracle jdbc

我正在尝试使用Java设置网络超时我的Oracle数据库连接.但是,我收到了一个错误.下面是示例代码,它是相应的例外.

try{
    conn = new Database("oracle").connect();
    conn.setNetworkTimeout(null, 30000); //I don't have an Executor, so the field is set to null
    System.out.println(Switch.date() + " -> Database Connection Initialized");
}
catch(SQLException ex){
    Logger.getLogger(Switch.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)

我得到的例外是:

Exception in thread "main" java.lang.AbstractMethodError:oracle.jdbc.driver.T4CConnection.setNetworkTimeout(Ljava/util/concurrent/Executor;I)V
   at ke.co.smart.Switch.<init>(Switch.java:524)
   at ke.co.smart.Switch.main(Switch.java:161)
Java Result: 1
Run Code Online (Sandbox Code Playgroud)

我认为它与抽象方法有关(读取AbstractMethodError).什么可能导致这个错误,因为我只实现了我认为已经在Java中定义的方法,因此,不拒绝编译.

注意:如果有抽象方法,Java不允许编译具体类.

pru*_*nge 20

setNetworkTimeout() 在JDBC 4.1中引入,并且在JDBC 4.0中不存在.

您将需要ojdbc7,因为如果您想使用setNetworkTimeout()方法,JDBC 4.1仅随Java 7一起提供.

根本问题是在以后的规范中向接口添加方法可能导致这些接口的较旧实现中断错误.即将推出的Java 8默认方法的新功能之一,有望使这个问题略微减少.


显然,Oracle还有一个JDBC驱动程序属性,可以修改套接字超时.

如果使用瘦驱动程序,还可以尝试使用此Oracle JDBC属性设置套接字超时:

Properties props = new Properties();
props.setProperty("user", "dbuser");
props.setProperty("password", "dbpassword");
props.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT, "2000");

Connection con = DriverManager.getConnection("<JDBC connection string>", props);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些想要将连接属性添加到连接url的人:`jdbc:oracle:thin:@host:1521:DB:oracle.net.CONNECT_TIMEOUT = 2000;` (7认同)