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.