已将键 [HikariDataSource (HikariPool-1)] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@20f78dcb] 绑定到线程
首先,我使用了为与 JDBC 模板一起使用而创建的事务管理器。
@Bean
@Primary
public PlatformTransactionManager dbTxManager() {
return new DataSourceTransactionManager(clientDestinationDataSource());
}
但是,在这种情况下,无法保存到数据库(相反,读取没有错误):
抛出异常;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为“transactionManager”的 bean 可用:没有为限定符“transactionManager”找到匹配的 TransactionManager bean - 限定符不匹配,bean 名称也不匹配!
在事务注释中显式指定正确的管理器并不能解决问题。
ClientRepositry repo;
@Transactional("dbTxManager")
@Override
public Long processClient(Client client){
repo.findById(client.getId())
...
repo.save(client); //error
}
我决定设置一个单独的EntityManager。
@EnableJpaRepositories(
entityManagerFactoryRef = "clientEntityManagerFactory",
transactionManagerRef = "transactionManagerSimple",
basePackages = "com.integration")
@EnableTransactionManagement
@Configuration
public class DbConfiguration {
@Bean
public HikariDataSource clientDataSource(DataSourceProperties clientDestinationDbProps) {
return clientDestinationDbProps
.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
@Bean
public LocalContainerEntityManagerFactoryBean clientEntityManagerFactory(HikariDataSource clientDataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(clientDataSource);
entityManagerFactoryBean.setPackagesToScan(
"com.integration.domain",
"com.integration.repository"
);
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
entityManagerFactoryBean.setJpaProperties(properties);
return entityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager transactionManagerSimple(EntityManagerFactory clientEntityManagerFactory) {
return new JpaTransactionManager(clientEntityManagerFactory);
}
}
数据处理时,无法开启交易。
抛出异常;嵌套异常是 org.springframework.transaction.CannotCreateTransactionException: 无法打开 JPA EntityManager 进行事务;嵌套异常是 java.lang.IllegalStateException:键 [HikariDataSource (HikariPool-1)] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@20f78dcb] 已经绑定到线程
你有什么想法如何解决这个问题吗?
要解决与此主题相关的错误,需要显式指定产生该错误的事务管理器。
@Transactional(value = "transactionManagerSimple")
@Override
public Long processClient(Client client) {
...