IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

[SQLServer] Utilisation d'un pool de connection en standalone


Sujet :

JDBC Java

  1. #1
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut [SQLServer] Utilisation d'un pool de connection en standalone
    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:
    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);		
    	}
    }
    Ç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...

    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?
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  2. #2
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bon en cherchant un chouilla plus loin j'ai trouvé une implémentation qui a l'air de marcher très bien: Apache DBCP.

    Pour info le code équivalent:

    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
    18
    19
     
    try(BasicDataSource ds = new BasicDataSource()){
    	ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    	ds.setUrl("blabla");
     
    	ds.setMinIdle(2);
    	ds.setMaxIdle(5);
    	ds.setMaxOpenPreparedStatements(180);
    	while(count++<MAX_CONN){
    		try(
    			Connection conn = ds.getConnection();
    			Statement stmt = conn.createStatement();
    			ResultSet rs = stmt.executeQuery(query);
    		){
    			rs.next();
     
    		}
    	}
    }
    J'obtiens des résultats un poil plus lents qu'avec une seule connection mais très nettement supérieurs au SQLServerConnectionPoolDataSource

    N'empêche je suis étonné que les API fournies pour SQL Server ne le permettent pas...
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/08/2014, 10h10
  2. Utiliser le pool de connection MySQL de Glassfish depuis une application standalone
    Par stephane.combes dans le forum Glassfish et Payara
    Réponses: 7
    Dernier message: 18/06/2012, 12h52
  3. C3P0 pool de connection il faut l'utiliser ou pas ?
    Par zolive dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/03/2010, 10h49
  4. Utiliser Active Directory pour se connecter
    Par Cerberes dans le forum Connexions aux bases de données
    Réponses: 5
    Dernier message: 30/11/2007, 11h40
  5. [débutant][tomcat][jdbc] pool de connection DBCP
    Par zozolh2 dans le forum JDBC
    Réponses: 6
    Dernier message: 19/05/2004, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo