J'essaie de définir un délai d'attente réseau pour ma connexion à la base de données Oracle en Java. Cependant, je reçois une erreur. Vous trouverez ci-dessous un exemple de code et son exception respective.
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);
}
L'exception que je reçois est:
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
Je crois que cela a à voir avec une méthode abstraite (lire AbstractMethodError). Ce qui pourrait probablement causer cette erreur car je n’ai implémenté que la méthode que j’estime déjà définie en Java et qui ne refuse donc pas la compilation.
NB: Java ne permet pas la compilation de classes concrètes s'il existe des méthodes abstraites.
setNetworkTimeout()
a été introduit dans JDBC 4.1 et n'était pas présent dans JDBC 4.0.
Vous voudrez ojdbc7 puisque JDBC 4.1 n’est entré avec Java 7 que si vous voulez utiliser la méthode setNetworkTimeout()
.
Le problème sous-jacent est que l'ajout de méthodes à des interfaces dans des spécifications ultérieures peut entraîner la rupture des implémentations plus anciennes de ces interfaces avec des erreurs. L’une des nouvelles fonctionnalités de la prochaine version de Java 8, les méthodes par défaut, permettra, espérons-le, de réduire légèrement le problème.
Apparemment, il existe également une propriété de pilote JDBC pour Oracle pouvant modifier les délais d'attente de socket.
Vous pouvez également essayer d'utiliser cette propriété Oracle JDBC pour définir le délai d'expiration du socket si vous utilisez le pilote léger:
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);
Dans la documentation Oracle: "setNetworkTimeout lève une exception SQLException si: une erreur d'accès à la base de données se produit, cette méthode est appelée sur une connexion fermée, l'exécuteur est NULL". Ce dernier semble votre cas.
C'est un cas classique d'évolution du logiciel. Le fournisseur JDBC n'a pas encore indiqué l'implémentation de la méthode dans le fichier jar que vous utilisez. On dirait que votre bibliothèque JDBC est assez ancienne et vous pouvez essayer la dernière.
Téléchargez le dernier ici: http://www.Oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
Essayez cette approche prise de ici :
conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);