Bonjour,
j'ai une application java standalone qui effectue des requêtes en boucle sur une base SQLServer, et le design actuel fait qu'une connexion est ouverte/fermée à chaque requête.
Je voudrai donc utiliser un pool de connexion, et du coup j'essaye d'instancier un DataSource qui ferait ça pour moi:
Ça marche bien, mais de toute évidence chaque appel à ds.getConnection() ouvre une nouvelle connexion: non seulement la boucle est beaucoup plus lente que la même en gardant la même connexion, mais en plus le print m'imprime des chaînes du genre "ConnectionID:20 ClientConnectionId: f4e2c1c5-53e3-4e5c-bcf0-2b77edf0a56b" qui indiquent que la connexion a un nouvel ID à chaque fois...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SQLServerConnectionPoolDataSource ds = new SQLServerConnectionPoolDataSource(); ds.setURL("jdbc:sqlserver://monServer;instanceName=monInstance;database=maDatabase;user=monUser;password=monPassword"); //Récupération du DS String query = "..."; //Une requete bidon qui fonctionne int count = 0; int MAX_CONN = 1000; while(count++<MAX_CONN){ try( Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); ){ System.out.println(conn.getClass()+ " - "+conn); } }
Quelqu'un a-t-il réussi à implémenter un VRAI pool de connexions avec cette méthode?
Pour donner une idée des performances que j'ai:
En utilisant directement le DriverManager.getConnection, ma boucle dure 35 secondes environ
En utilisant la méthode ci-dessus, ma boucle dure 40 secondes (plus lent que la méthode manuelle!!!)
En gardant la même connexion, je tombe à 8 secondes (ce qui est donc plus ou moins ma cible)
J'ai toujours la possibilité d'implémenter mon propre pool de connexions ou de chercher une solution pour conserver ma connexion d'un appel à l'autre, mais en 2016 ça me semble quand même bien dommage.
Quelqu'un a une idée?
Partager