it-swarm.com.de

Festlegen des Netzwerk-Timeouts für die JDBC-Verbindung

Ich versuche, ein Netzwerk-Timeout für meine Oracle-Datenbankverbindung in Java festzulegen. Ich bekomme jedoch einen Fehler. Nachfolgend finden Sie Beispielcode und die entsprechende Ausnahme.

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

Die Ausnahme, die ich bekomme, ist:

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

Ich glaube, es hat mit einer Methode zu tun, die abstrakt ist (lesen Sie AbstractMethodError). Was wahrscheinlich zu diesem Fehler führen könnte, da ich nur die Methode implementiert habe, die meiner Meinung nach bereits in Java definiert ist, und daher die Kompilierung nicht ablehnt.

N.B .: Java erlaubt keine Kompilierung konkreter Klassen, wenn abstrakte Methoden vorhanden sind.  

10
Pat Wanjau

setNetworkTimeout() wurde in JDBC 4.1 eingeführt und war in JDBC 4.0 nicht vorhanden. 

Sie wollen ojdbc7, da JDBC 4.1 nur mit Java 7 kam, wenn Sie die setNetworkTimeout()-Methode verwenden möchten.

Das zugrunde liegende Problem ist, dass das Hinzufügen von Methoden zu Schnittstellen in späteren Spezifikationen dazu führen kann, dass ältere Implementierungen dieser Schnittstellen mit Fehlern brechen. Eine der neuen Funktionen von Java 8, die Standardmethoden, wird dies hoffentlich etwas einfacher machen.


Offenbar gibt es auch eine JDBC-Treibereigenschaft für Oracle, die Socket-Timeouts ändern kann.

Sie können auch versuchen, diese Oracle-JDBC-Eigenschaft zu verwenden, um das Socketzeitlimit festzulegen, wenn Sie den Thin-Treiber verwenden:

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);
14
prunge

Aus der Dokumentation von Oracle: "setNetworkTimeout löst eine SQLException aus, wenn: ein Datenbankzugriffsfehler auftritt, diese Methode bei einer geschlossenen Verbindung aufgerufen wird, der Executor NULL ist". Letzteres scheint Ihr Fall zu sein.

1
Ga Sacchi

Dies ist ein klassischer Fall der Softwareentwicklung. Der JDBC-Provider hat die Implementierung der Methode noch nicht in dem von Ihnen verwendeten Jar angegeben. Sieht so aus, als wäre Ihre JDBC-Bibliothek ziemlich alt und Sie können die neueste Version ausprobieren.

Laden Sie die neueste Version von hier herunter: http://www.Oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

Versuchen Sie diesen Ansatz aus hier :

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