2011-08-28 11 views
5

Nie jestem do końca pewien, jak sformułować pytanie, więc możesz mi powiedzieć, że kompletnie się mylę.JDBCTemplate z TransactionTemplate i pulą połączeń, którego źródło danych należy użyć

Chcę użyć JdbcTemplate i TransactionTemplate. Zacznę od zainicjowania mojej puli połączeń jako źródła danych i utworzenia menedżera transakcji jako źródła danych, jak również?

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

Ale teraz chcę utworzyć mój TransactionTemplate i JdbcTemplate:

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

Teraz mulitple wątki dostępu transactionTemplate i jdbc. Czy ten kod gwarantuje, że wszystko wykonane w doInTransaction używa tego samego połączenia dla wszystkich wywołań jdbc?

Czy połączenie jest w jakiś sposób połączone wewnętrznie, ponieważ wygląda na to, że JdbcTemplate i TransactionTemplate mogą korzystać z dowolnych połączeń. Czy mój kod jest poprawny/zapisać?

Odpowiedz

5

To wszystko powinno być w porządku. Najważniejszą częścią jest to, że JdbcTemplate i DataSourceTransactionManager są dostarczane z tym samym obiektem DataSource, który zrobiłeś.

Czy ten kod gwarantuje, że wszystko wykonane w doInTransaction używa tego samego połączenia dla wszystkich wywołań jdbc? Czy połączenie jest w pewien sposób połączone wewnętrznie, ponieważ wygląda tak, jakby JdbcTemplate i TransactionTemplate mogły używać tego, co każde wymagane połączenie.

Wewnętrznie Wiosna wykorzystuje złożoną logikę synchronizacji transakcji upewnij się, że transakcje, połączenia i źródła danych są prawidłowo zsynchronizowane (jeśli jesteś zainteresowany, rzucić okiem na TransactionSynchronizationManager, choć ostrzegam, że to przerażające).

Jeśli działasz za pośrednictwem interfejsów API TransactionTemplate i JdbcTemplate, będzie to działało bez żadnego wysiłku z Twojej strony. Jeśli jednak ręcznie rozpoczniesz pobieranie połączeń z poziomu DataSource, wszystkie zakłady są wyłączone.

Powiązane problemy