设置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); } 

我得到的例外是:

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

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

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

setNetworkTimeout()是在JDBC 4.1中引入的,并且在JDBC 4.0中不存在。

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

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


显然,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("", props); 

从Oracle的文档:“setNetworkTimeout在以下情况下抛出SQLException:发生数据库访问错误,在关闭的连接上调用此方法,执行程序为NULL”。 后者似乎是你的情况。

这是软件演变的经典案例。 JDBC提供程序尚未在您使用的jar中提供该方法的实现。 看起来您的JDBC库已经很老了,您可以尝试使用最新的库。

从这里下载最新版本: http : //www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

尝试从这里采取这种方法:

 conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);