JDBC Oracle et timeout

Vous avez ajouté un timeout dans votre data source mais il n’est pas pris en compte ?
Je vous propose une méthode pour que le timeout soit appliqué.

Pour obtenir une connexion :

OracleDataSource ods = new OracleDataSource();
ods.setServerName(ipAddr);
ods.setPortNumber(port);
ods.setDriverType("thin");
ods.setServiceName("test");
ods.setUser("scott");
ods.setPassword("tiger");
ods.setLoginTimeout(timeOut);
connection = ods.getConnection();

Afin de tester la prise en compte et la portée du timeout, j’ai effectué des tests avec diverses valeurs de timeout dans diverses situations.

  • Tests avec une adresse non attribuée (il n’y a pas de machine) :
[192.168.0.127:1521, timeout:30000] duree: 21020 ms
[192.168.0.127:1521, timeout: 1000] duree: 21017 ms
[192.168.0.127:1521, timeout:  500] duree: 21020 ms
[192.168.0.127:1521, timeout:  200] duree: 21014 ms
[192.168.0.127:1521, timeout:  100] duree: 21007 ms
  • Tests avec une machine qui n’a pas de listener Oracle :
[127.0.0.1:1521, timeout:30000] duree: 1006 ms
[127.0.0.1:1521, timeout: 1000] duree: 1009 ms
[127.0.0.1:1521, timeout:  500] duree: 1015 ms
[127.0.0.1:1521, timeout:  200] duree: 1007 ms
[127.0.0.1:1521, timeout:  100] duree: 1016 ms
  • Tests avec une machine qui a un listener actif:
[bddServer:1521, timeout:30000] duree: 34 ms
[bddServer:1521, timeout: 1000] duree: 37 ms
[bddServer:1521, timeout:  500] duree: 34 ms
[bddServer:1521, timeout:  200] duree: 34 ms
[bddServer:1521, timeout:  100] duree: 34 ms

Le constat est le suivant : la modification de l a valeur du timeout n’a aucun impact.
Voici la modification que je vous propose :

OracleDataSource ods = new OracleDataSource();
ods.setServerName(ipAddr);
ods.setPortNumber(port);
ods.setDriverType("thin");
ods.setServiceName("test");
ods.setUser("scott");
ods.setPassword("tiger");
ods.setLoginTimeout(timeOut);
Properties properties = new Properties();
properties.setProperty("oracle.jdbc.ReadTimeout", timeOut + "");
properties.setProperty("oracle.net.READ_TIMEOUT", timeOut + "");
properties.setProperty("oracle.net.CONNECT_TIMEOUT", timeOut + "");
properties.setProperty("SetBigStringTryClob", "true");
properties.setProperty("SetBigStringUseClob", "true");
properties.setProperty(oracle.net.ns.SQLnetDef.TCP_CONNTIMEOUT_STR, timeOut + "");
ods.setImplicitCachingEnabled(true);
ods.setConnectionCachingEnabled(true);
ods.setConnectionProperties(properties);
connection = ods.getConnection();

Les résultats des mêmes tests que précédemment :

  • Tests avec une adresse non attribuée (il n’y a pas de machine) :
[192.168.0.127:1521, timeout:30000] duree: 21033 ms
[192.168.0.127:1521, timeout: 1000] duree: 1005 ms
[192.168.0.127:1521, timeout:  500] duree:  506 ms
[192.168.0.127:1521, timeout:  200] duree:  206 ms
[192.168.0.127:1521, timeout:  100] duree:  105 ms
  • Tests avec une machine qui n’a pas de listener Oracle :
[127.0.0.1:1521, timeout:30000] duree: 1007 ms
[127.0.0.1:1521, timeout: 1000] duree: 1010 ms
[127.0.0.1:1521, timeout:  500] duree:  506 ms
[127.0.0.1:1521, timeout:  200] duree:  206 ms
[127.0.0.1:1521, timeout:  100] duree:  107 ms
  • Tests avec une machine qui a un listener actif:
[bddServer:1521, timeout:30000] duree: 39 ms
[bddServer:1521, timeout: 1000] duree: 40 ms
[bddServer:1521, timeout:  500] duree: 37 ms
[bddServer:1521, timeout:  200] duree: 39 ms
[bddServer:1521, timeout:  100] duree: 38 ms

Cette fois, les temps de réponse prennent clairement en compte la valeur de timeout.