2011-08-28 11 views
5

No estoy muy seguro de cómo formular la pregunta, así que no dude en decirme que estoy pensando completamente equivocado.JDBCTemplate con TransactionTemplate y Connection Pool, cuyo origen de datos es

Quiero usar el JdbcTemplate y el TransactionTemplate. Empiezo por iniciar mi grupo de conexiones como fuente de datos y también creo un administrador de transacciones como fuente de datos.

 BoneCPConfig connectionPoolConfig = new BoneCPConfig(); 
    connectionPoolConfig.setJdbcUrl(...); 
    connectionPoolConfig.setUsername(...); 
    connectionPoolConfig.setPassword(...); 
    connectionPoolConfig.setMinConnectionsPerPartition(...); 
    connectionPoolConfig.setMaxConnectionsPerPartition(...); 
    dataSource = new BoneCPDataSource(connectionPoolConfig); 
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); 
    definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); 
    transactionManager.setDataSource(dataSource); 

pero ahora quiero crear mi TransactionTemplate y JdbcTemplate:

transactionTemplate = new TransactionTemplate(transactionManager); 
JdbcTemplate jdbc = new JdbcTemplate(transactionManager.getDataSource()); 

Ahora hilos Mulitple acceso transactionTemplate y jdbc. ¿Este código garantiza que todo lo hecho en doInTransaction utiliza la misma conexión para todas las llamadas jdbc?

Es la conexión de alguna manera vinculada internamente, porque parece que JdbcTemplate y TransactionTemplate podrían usar cualquier conexión que quisieran. ¿Mi código es correcto/guardar?

Respuesta

5

Todo esto debería estar bien. La parte crítica es que JdbcTemplate y DataSourceTransactionManager se suministran con el mismo objeto DataSource, que usted ha hecho.

¿Este código garantiza que todo lo realizado en doInTransaction utiliza la misma conexión para todas las llamadas jdbc? ¿La conexión está de alguna manera vinculada internamente, porque parece que JdbcTemplate y TransactionTemplate podrían usar cada conexión que quisieran?

Internamente, Primavera utiliza la lógica de sincronización compleja operación para asegurarse de que las transacciones, las conexiones y las fuentes de datos están correctamente sincronizados (si está interesado, echar un vistazo a TransactionSynchronizationManager, aunque se advirtió, es temible).

Mientras opere a través de las API TransactionTemplate y JdbcTemplate, funcionará sin ningún esfuerzo de su parte. Sin embargo, si comienza a buscar manualmente las conexiones desde el DataSource, entonces todas las apuestas estarán desactivadas.

Cuestiones relacionadas