JDBCTemplate с TransactionTemplate и Connection Pool, какой источник данных использовать - PullRequest
6 голосов
/ 28 августа 2011

Я не совсем уверен, как сформулировать вопрос, поэтому не стесняйтесь сказать мне, что я совершенно не прав.

Я хочу использовать JdbcTemplate и TransactionTemplate. Я начинаю с инициализации своего пула соединений как источника данных и создания менеджера транзакций как источника данных?

        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);

Но теперь я хочу создать свой TransactionTemplate и JdbcTemplate:

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

Теперь несколько потоков обращаются к transactionTemplate и jdbc. Гарантирует ли этот код, что все, что сделано в doInTransaction, использует одно и то же соединение для всех вызовов jdbc?

Является ли соединение каким-либо образом связанным внутри, потому что похоже, что JdbcTemplate и TransactionTemplate могут использовать любое соединение, которое они хотят. Мой код правильный / сохранить?

1 Ответ

6 голосов
/ 28 августа 2011

Все должно быть хорошо. Критическая часть состоит в том, что JdbcTemplate и DataSourceTransactionManager поставляются с тем же объектом DataSource, который вы сделали.

Гарантирует ли этот код, что все, что делается в doInTransaction, использует одинаковое соединение для всех вызовов jdbc? Является ли соединение каким-либо образом связанным внутри, потому что это выглядит так, как будто JdbcTemplate и TransactionTemplate могут использовать то, что хочет каждое соединение.

Внутренне Spring использует сложную логику синхронизации транзакций, чтобы убедиться, что все транзакции, соединения и источники данных правильно синхронизированы (если вам интересно, взгляните на TransactionSynchronizationManager, хотя и предупреждайте, это страшно).

Пока вы работаете через API TransactionTemplate и JdbcTemplate, он будет работать без каких-либо усилий с вашей стороны. Если вы начнете вручную получать соединения с DataSource самостоятельно, тогда все ставки отключены.

...