【问题标题】:Setting Network Timeout for JDBC connection为 JDBC 连接设置网络超时
【发布时间】:2013-09-20 06:43:43
【问题描述】:

我正在尝试用 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 不允许编译具体类。

【问题讨论】:

  • Oracle驱动的版本是多少?也许较新的版本实现了该方法。 (注意:文件名“ojdbc6”或“ojdbc5”中的数字不是驱动程序版本)。
  • 如果您真的想解决 DCD(死连接检测)问题,您应该切换到 OCI 驱动程序并在 OCI 级别(在 sqlnet.ora 中)进行配置。 “最好的”方式是使用 TCP keepalive 技术。但这需要 DBA 和 Unix 管理员的帮助。

标签: java database oracle jdbc


【解决方案1】:

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

如果您想使用 setNetworkTimeout() 方法,您将需要 ojdbc7,因为 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);

【讨论】:

  • 您在哪里可以找到 JDBC 4.1 驱动程序,或者我如何确定我有它?我猜oracle.com/technetwork/database/features/jdbc/… 但它不是写成 4.1。
  • @Adrien 对于 Oracle,支持 JDBC 4.1 的最新最好的驱动程序是 here
  • 这是“2000”miliseundum 还是 secundum?
  • 对于那些想在连接url中添加连接属性的人:jdbc:oracle:thin:@host:1521:DB:oracle.net.CONNECT_TIMEOUT=2000;
  • @jumping_monkey,试试这个:spring.datasource.hikari.data-source-properties.oracle.net.CONNECT_TIMEOUT=2000
【解决方案2】:

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

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

试试这个取自here的方法:

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

【讨论】:

  • 问题不在于 jdbc 库的时代,我使用的是 ojdbc6,它是 JDBC 4.0 的实现,因此是最新的库。
  • ojdbc6 没有必要实现整个 JDBC 4.0 规范;可能是已实现该功能的次要版本之一。为什么不尝试下载最新的,它更有可能解决您的问题。
  • 不走运,只是尝试了没有成功,导致同样的错误。
  • @patwanjau 当您执行 JDBC jar 文件时,它会报告哪个驱动程序版本?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2012-06-14
    • 2012-09-06
    • 2016-03-11
    相关资源
    最近更新 更多