Configurar el tiempo de espera de red para la conexión JDBC

Estoy tratando de establecer un tiempo de espera de red mi conexión de base de datos Oracle en Java. Sin embargo, estoy recibiendo un error. A continuación se muestra el código de muestra y su respectiva excepción.

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); } 

La excepción que recibo es:

 Exception in thread "main" java.lang.AbstractMethodError:oracle.jdbc.driver.T4CConnection.setNetworkTimeout(Ljava/util/concurrent/Executor;I)V at ke.co.smart.Switch.(Switch.java:524) at ke.co.smart.Switch.main(Switch.java:161) Java Result: 1 

Creo que tiene que ver con un método que es abstracto (lea AbstractMethodError). Lo que probablemente podría causar este error ya que solo he implementado el método que creo que ya está definido en Java, y por lo tanto, no se niega a comstackr.

NB: Java no permite la comstackción de clases concretas si hay métodos abstractos.

setNetworkTimeout() se introdujo en JDBC 4.1 y no estaba presente en JDBC 4.0.

Querrá ojdbc7 ya que JDBC 4.1 solo entró con Java 7 si desea usar el método setNetworkTimeout() .

El problema subyacente es que agregar métodos a las interfaces en las especificaciones posteriores puede hacer que las implementaciones más antiguas de esas interfaces rompan con los errores. Una de las nuevas características de los próximos 8 métodos por defecto de Java 8, hará que este problema sea un poco menos problemático.


Aparentemente, también hay una propiedad de controlador JDBC para Oracle que puede modificar los tiempos de espera del socket.

También puede intentar usar esta propiedad Oracle JDBC para establecer el tiempo de espera del socket si está utilizando el controlador delgado:

 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("", props); 

De la documentación de Oracle: “setNetworkTimeout arroja una SQLException si: se produce un error de acceso a la base de datos, se llama a este método en una conexión cerrada, el ejecutor es NULL”. Este último parece ser tu caso.

Este es un caso clásico de evolución de software. El proveedor de JDBC aún no le ha dado la implementación del método en el contenedor que está utilizando. Parece que tu biblioteca JDBC es bastante antigua y puedes probar la última.

Descargue la última de aquí: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

Pruebe este enfoque tomado de aquí :

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