Настройка тайм-аута сети для подключения JDBC

Я пытаюсь установить сетевое тайм-аут моего подключения к базе данных Oracle на Java. Однако я получаю ошибку. Ниже приведен пример кода, и это соответствующее исключение.

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 не разрешает компиляцию конкретных классов, если существуют абстрактные методы.

3 ответов


setNetworkTimeout() был введен в JDBC 4.1 и не присутствовал в JDBC 4.0.

вам понадобится ojdbc7, так как JDBC 4.1 пришел только с Java 7, Если вы хотите использовать setNetworkTimeout() метод.

основная проблема заключается в том, что добавление методов к интерфейсам в более поздних спецификациях может привести к сбою старых реализаций этих интерфейсов с ошибками. Одна из новых функций предстоящего Java 8, методы по умолчанию, надеюсь, сделает это немного меньше проблема.


по-видимому, существует также свойство драйвера JDBC для Oracle, которое может изменять таймауты сокетов.

вы также можете попробовать использовать это свойство 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);

из документации 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);