2013-09-16 3 views
5

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

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

Какова версия драйвера Oracle? Возможно, более новая версия реализует этот метод. (примечание: номера в имени файла «ojdbc6» или «ojdbc5» являются ** не ** версией драйвера). –

+0

Если вы действительно хотите решить проблемы с DCD (обнаружение мертвых соединений), вам следует переключиться на драйверы OCI и настроить его на уровне OCI (в sqlnet.ora). «Лучший» способ - использовать технику TCP keepalive. Но для этого нужна помощь администраторов баз данных и Unix. – ibre5041

ответ

7

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

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

Основная проблема заключается в том, что добавление методов к интерфейсам в более поздних спецификациях может привести к поломке старых версий этих интерфейсов с ошибками. Одна из новых возможностей предстоящих 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); 
+0

Где вы находите драйвер JDBC 4.1 или как я могу быть уверен, что он у меня есть? Я предполагаю, что http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html, но он не написан 4.1. – Adrien

+0

@Adrien Для Oracle последние и самые большие драйверы с поддержкой JDBC 4.1 [здесь] (http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html) , – prunge

+0

это «2000» milisecundum, или secundum? – victorio

0

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

Скачать последние один здесь: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

Попробуйте этот подход, взятый из here:

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

Проблема не в возрасте библиотеки jdbc, я использую ojdbc6, который представляет собой реализацию JDBC 4.0 и, следовательно, новейшую библиотеку. –

+0

Не обязательно, чтобы ojdbc6 реализовал всю спецификацию JDBC 4.0; может быть одной из второстепенной версии, которая реализовала это. Почему бы вам не попробовать скачать последнюю версию, скорее всего, она решит вашу проблему. – gyan

+0

Не повезло, просто попробовал с этим без успеха, результаты в той же ошибке. –

1

Из документации Оракула: «setNetworkTimeout бросает SQLException если: возникает ошибка доступа к базе данных, этот метод вызывается в закрытом соединении, исполнитель имеет NULL ". Последнее кажется вашим делом.

Смежные вопросы