18

我正在尝试用 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)。什么可能导致这个错误,因为我只实现了我认为已经在 J​​ava 中定义的方法,因此不会拒绝编译。

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

4

3 回答 3

26

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);
于 2013-09-16T08:57:44.890 回答
2

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

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

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

conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);
于 2013-09-16T07:42:30.897 回答
1

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

于 2015-12-14T16:47:30.183 回答