Настройка таймаута сети для соединения 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, и, следовательно, не отказывается от компиляции.
NB: 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);
Это классический случай эволюции программного обеспечения. Поставщик JDBC еще не дал реализацию метода в используемом вами банке. Похоже, ваша библиотека JDBC довольно старая, и вы можете попробовать самую последнюю.
Загрузите последнюю версию здесь: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Попробуйте этот подход, взятый отсюда:
conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);
Из документации Oracle: "setNetworkTimeout создает исключение SQLException, если: возникает ошибка доступа к базе данных, этот метод вызывается при закрытом соединении, исполнитель имеет значение NULL". Последнее кажется вашим делом.