6

¿Puede alguien explicar cómo se puede usar la agrupación de conexiones preparada con dbcp? (con algún código de ejemplo si es posible). He descubierto cómo activarlo, pasando un KeyedObjectPoolFactory a PoolableConnectionFactory. Pero, ¿cómo deberían definirse las declaraciones preparadas específicas después de eso? Ahora solo estoy usando PoolingDataSource para obtener conexiones desde el grupo. ¿Cómo uso las declaraciones preparadas del grupo?Uso de la agrupación de PreparedStatement en dbcp

+0

¿Qué está pasando para KeyedObjectPoolFactory? El constructor de GenericKeyedObjectPoolFactory requiere un KeyedPoolableObjectFactory, y no veo cómo crear uno de los que usará la conexión para la que se diseñó PreparedStatement. –

Respuesta

6

Hablando bien acerca de cómo obtener conexión del grupo de servidores y obtener conexión "no compartida", ¿hay algún cambio en su código :)? Apuesto a que no. De la misma manera con las declaraciones preparadas. Tu código no debería cambiar Entonces, no hay un ejemplo de código útil para esto.

Debe leer documentos para su implementación de JDBC Datasource y ver lo que los desarrolladores tienen que decir sobre la agrupación. No hay otra fuente de información confiable sobre esto.

De here: Este componente también tiene la capacidad de agrupar declaracionesprepared. Cuando se habilita una piscina declaración se crea para cada conexión y PreparedStatements creado por uno de los métodos siguientes se pondrán en común:

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

lo tanto, que acaba de seguir usando la llamada prepareStatement() y el DBCP, en teoría, tener cuidado de agrupación (es decir, si está intentando crear "select * from users u where u.name like: id", primero intentará encontrar esta declaración en el grupo)

+0

¿De verdad? Entonces, ¿por qué PoolableConnectionFactory tiene un parámetro para la agrupación de sentencias? Claramente debe haber alguna forma de configurarlo. Apache, como de costumbre, no sirve de nada. – sproketboy

+0

@Dan: ¿Te interesa expandir tu comentario? ¿Con qué parte de mi respuesta no estás de acuerdo? Si vuelve a leer la pregunta, el autor ya sabe cómo habilitar el agrupamiento para las declaraciones. Él se pregunta acerca de los cambios que debe hacer en el código, si corresponde. –

+1

Lo siento fue de mal humor debido a la falta de documentación habitual en Apache. – sproketboy

1

Aquí está el código básico que uso.

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

Esto no puede ser correcto. Al pasar el nulo para el tercer argumento de PoolableConnectionFactory, se desactiva el almacenamiento en caché PreparedStatement, según 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, boolean, boolean). ¿Qué debería usarse para ese argumento? –

0

La cosa es que si se utiliza una sola Connection, puede cachear PreparedStatement s si desea o no, la única manera posible impacto en esto es utilizar DataSource propiedades o para utilizar la API específica del proveedor. Pero estas declaraciones no son visibles por otras conexiones y si prepara la misma declaración usando otra conexión, la volverá a crear. Así que las agrupaciones de conexiones como DBCP bajo el capó permiten la reutilización de PreparedStatement entre diferentes conexiones (usa la interfaz PooledConnection en lugar de simple Connection), hacen un seguimiento de todas las declaraciones preparadas por todas las conexiones.

ACTUALIZACIÓN: parece que estaba equivocado en esta información, al menos no pude encontrar esta funcionalidad en C3P0.