6

Quelqu'un peut-il expliquer comment le regroupement de connexions exactement préparé à l'aide de dbcp peut être utilisé? (avec un exemple de code si possible). J'ai compris comment l'activer - en passant une KeyedObjectPoolFactory à la PoolableConnectionFactory. Mais comment les instructions préparées spécifiques doivent-elles être définies après cela? En ce moment j'utilise seulement un PoolingDataSource pour obtenir des connexions du pool. Comment utiliser les instructions préparées du pool?Utilisation de la mise en pool PreparedStatement dans dbcp

+0

Que transmettez-vous pour KeyedObjectPoolFactory? Le constructeur de GenericKeyedObjectPoolFactory nécessite une KeyedPoolableObjectFactory, et je ne vois pas comment créer l'un de ceux qui utiliseront la connexion pour laquelle PreparedStatement est destiné. –

Répondre

6

En parlant bien d'obtenir une connexion du pool par rapport à une connexion "non-pooled", avez-vous des changements dans votre code :)? Je parie que non. De la même manière avec les déclarations préparées. Votre code ne devrait pas changer. Donc, il n'y a pas d'exemple de code utile à cela.

Vous devriez lire des documents pour votre implémentation de la source de données JDBC et voir ce que les développeurs ont à dire sur le pooling. Il n'y a pas d'autre source d'informations fiables à ce sujet.

De here: Ce composant a également la capacité de regrouper PreparedStatements. Lorsqu'elle est activée, un pool de déclaration sera créé pour chaque connexion et PreparedStatements créé par l'une des méthodes suivantes seront mises en commun:

* public PreparedStatement prepareStatement(String sql) 
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 

Donc, vous continuez à l'aide d'appel et que votre dbcp prepareStatement() sera en théorie prendre en charge pooling (c.-à-d. si vous essayez de créer "select * from users où u.name like: id", il essaiera de trouver cette instruction dans le pool)

+0

Vraiment? Alors pourquoi la PoolableConnectionFactory a-t-elle un paramètre pour le pooling d'instructions? De toute évidence, il doit y avoir un moyen de le mettre en place. Apache - comme d'habitude - ne sert à rien. – sproketboy

+0

@Dan: Voulez-vous développer votre commentaire? Dans quelle partie de ma réponse n'êtes-vous pas d'accord? Si vous relisez la question, l'auteur sait déjà comment activer la mise en pool des instructions. Il s'interroge sur les changements qu'il doit apporter dans le code, le cas échéant. –

+1

Désolé était juste grincheux en raison du manque habituel de documentation à Apache. – sproketboy

1

Voici le code de base que j'utilise.

GenericObjectPool connectionPool = new GenericObjectPool(null); 
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30); 
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30); 
    connectionPool.setNumTestsPerEvictionRun(3); 
    connectionPool.setTestOnBorrow(true); 
    connectionPool.setTestWhileIdle(false); 
    connectionPool.setTestOnReturn(false); 

    props = new Properties(); 
    props.put("user", username); 
    props.put("password", password); 
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props); 

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true); 
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool); 
+2

Cela ne peut pas être vrai. Passer null pour le troisième argument de PoolableConnectionFactory désactive la mise en cache PreparedStatement, conformément à http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/PoolableConnectionFactory.html#PoolableConnectionFactory(org.apache.commons.dbcp. ConnectionFactory, org.apache.commons.pool.ObjectPool, org.apache.commons.pool.KeyedObjectPoolFactory, java.lang.String, booléen, booléen). Qu'est-ce qui devrait être utilisé pour cet argument? –

0

La chose est si vous utilisez un seul Connection, il cache PreparedStatement s si vous voulez ou non, le seul moyen d'avoir un impact sur est d'utiliser DataSource propriétés ou à utiliser l'API spécifique au fournisseur. Mais ces instructions ne sont pas visibles par d'autres connexions et si vous préparez la même instruction en utilisant une autre connexion, elle la recréera à nouveau. Donc, les pools de connexion comme DBCP sous le capot permettent de réutiliser PreparedStatement entre différentes connexions (il utilise l'interface PooledConnection au lieu du simple Connection), ils gardent une trace de toutes les instructions préparées par toutes les connexions.

MISE À JOUR: il semble que j'avais tort sur cette information, au moins je ne pouvais pas trouver cette fonctionnalité dans C3P0.

Questions connexes