我试图在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.<init>(Switch.java:524)
at ke.co.smart.Switch.main(Switch.java:161)
Java Result: 1
我认为它与抽象方法(读取AbstractMethodError)有关。什么可能导致这个错误,因为我只实现了我认为已经在Java中定义的方法,因此,不会拒绝编译。
N.B。:如果有抽象方法,Java不允许编译具体类。
答案 0 :(得分:15)
setNetworkTimeout()
在JDBC 4.1中引入,并且在JDBC 4.0中不存在。
您将需要ojdbc7,因为如果您想使用setNetworkTimeout()
方法,JDBC 4.1仅随Java 7一起提供。
底层问题是在以后的规范中向接口添加方法可能会导致这些接口的旧实现中断错误。即将推出的Java 8默认方法的新功能之一,有望使这个问题略微减少。
显然,Oracle还有一个JDBC驱动程序属性可以修改套接字超时。
如果您使用的是瘦驱动程序,也可以尝试使用this Oracle JDBC property设置套接字超时:
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);
答案 1 :(得分:1)
从Oracle的文档:&#34; setNetworkTimeout在以下情况下抛出SQLException:发生数据库访问错误,在关闭的连接上调用此方法,执行程序为NULL&#34;。后者似乎是你的情况。
答案 2 :(得分:0)
这是软件演变的经典案例。 JDBC提供程序尚未在您使用的jar中提供该方法的实现。看起来您的JDBC库已经很老了,您可以尝试使用最新的库。
从这里下载最新版本:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
尝试从here获取此方法:
conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);