Java 为什么我可以访问两个数据源,尽管只设置了一个事务管理器?
我试图学习如何处理多个事务,但它们的行为对我来说真的不是直观的 我配置了两个不同的数据集和两个单独的配置(事务管理器+实体管理器) 应用程序属性Java 为什么我可以访问两个数据源,尽管只设置了一个事务管理器?,java,spring-boot,hibernate,transactions,spring-transactions,Java,Spring Boot,Hibernate,Transactions,Spring Transactions,我试图学习如何处理多个事务,但它们的行为对我来说真的不是直观的 我配置了两个不同的数据集和两个单独的配置(事务管理器+实体管理器) 应用程序属性 spring.datasource.url=jdbc:firebirdsql:111.111.111.1/7700:C:/dummy/dummy.fdb?encoding=WIN1250 spring.datasource.driverClassName:org.firebirdsql.jdbc.FBDriver spring.datasource
spring.datasource.url=jdbc:firebirdsql:111.111.111.1/7700:C:/dummy/dummy.fdb?encoding=WIN1250
spring.datasource.driverClassName:org.firebirdsql.jdbc.FBDriver
spring.datasource.username:username
spring.datasource.password:mypassword
spring.datasource80950.url=jdbc:firebirdsql:111.111.111.2/7700:C:/dummy/dummy2.fdb?encoding=WIN1250
spring.datasource80950.driverClassName:org.firebirdsql.jdbc.FBDriver
spring.datasource80950.username:username
spring.datasource80950.password:mypassword
spring.jpa.hibernate.ddl-auto:update
spring.jpa.show-sql: true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.FirebirdDialect
第一种配置:
@Configuration
@EnableJpaRepositories(basePackages = {"com.lerkom.backend.defaultRepo"},
entityManagerFactoryRef = "primaryEntityManager",
transactionManagerRef = "primaryTransactionManager")
@EnableTransactionManagement
class PrimaryTsConfiguration {
@Autowired
Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan("com.backend.defaultRepo" );
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
properties.put("hibernate.dialect",
env.getProperty("spring.jpa.hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Bean(name = "defaultDs")
@Primary
public DataSource primaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean(name="primaryTransactionManager")
@Autowired
@Primary
DataSourceTransactionManager primaryTransactionManager(@Qualifier("defaultDs") DataSource datasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
return txm;
}
}
@Configuration
@EnableJpaRepositories(basePackages = {"com.backend.nurseRepo"},
entityManagerFactoryRef = "secondaryEntityManager",
transactionManagerRef = "secondaryTransactionManager")
@EnableTransactionManagement
public class SecondaryTmConfiguration {
@Autowired
Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean secondaryEntityManager() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondaryDataSource());
em.setPackagesToScan("com.lerkom.backend.nurseRepo" );
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
properties.put("hibernate.dialect",
env.getProperty("spring.jpa.hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Bean(name = "secondDs")
public DataSource secondaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource80950.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource80950.url"));
dataSource.setUsername(env.getProperty("spring.datasource80950.username"));
dataSource.setPassword(env.getProperty("spring.datasource80950.password"));
return dataSource;
}
@Bean(name="secondaryTransactionManager")
@Autowired
DataSourceTransactionManager secondaryTransactionManager(@Qualifier ("secondDs") DataSource datasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
return txm;
}
}
@配置
@EnableJParepositions(basePackages={“com.lerkom.backend.defaultRepo”},
entityManagerFactoryRef=“primaryEntityManager”,
transactionManagerRef=“primaryTransactionManager”)
@启用事务管理
类主配置{
@自动连线
环境环境;
@豆子
@初级的
public LocalContainerEntityManagerFactoryBean primaryEntityManager(){
LocalContainerEntityManagerFactoryBean em
=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan(“com.backend.defaultRepo”);
冬眠盲蝽
=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”,
getProperty(“spring.jpa.hibernate.hbm2ddl.auto”);
properties.put(“hibernate.dial”,
env.getProperty(“spring.jpa.hibernate.dial”);
em.setJpaPropertyMap(属性);
返回em;
}
@Bean(name=“defaultDs”)
@初级的
公共数据源primaryDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“spring.dataSource.driverClassName”);
setUrl(env.getProperty(“spring.dataSource.url”);
setUsername(env.getProperty(“spring.dataSource.username”);
setPassword(env.getProperty(“spring.dataSource.password”);
返回数据源;
}
@Bean(name=“primaryTransactionManager”)
@自动连线
@初级的
数据源TransactionManager primaryTransactionManager(@Qualifier(“defaultDs”)数据源数据源){
DataSourceTransactionManager txm=新的DataSourceTransactionManager(数据源);
返回txm;
}
}
第二种配置:
@Configuration
@EnableJpaRepositories(basePackages = {"com.lerkom.backend.defaultRepo"},
entityManagerFactoryRef = "primaryEntityManager",
transactionManagerRef = "primaryTransactionManager")
@EnableTransactionManagement
class PrimaryTsConfiguration {
@Autowired
Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan("com.backend.defaultRepo" );
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
properties.put("hibernate.dialect",
env.getProperty("spring.jpa.hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Bean(name = "defaultDs")
@Primary
public DataSource primaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean(name="primaryTransactionManager")
@Autowired
@Primary
DataSourceTransactionManager primaryTransactionManager(@Qualifier("defaultDs") DataSource datasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
return txm;
}
}
@Configuration
@EnableJpaRepositories(basePackages = {"com.backend.nurseRepo"},
entityManagerFactoryRef = "secondaryEntityManager",
transactionManagerRef = "secondaryTransactionManager")
@EnableTransactionManagement
public class SecondaryTmConfiguration {
@Autowired
Environment env;
@Bean
public LocalContainerEntityManagerFactoryBean secondaryEntityManager() {
LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondaryDataSource());
em.setPackagesToScan("com.lerkom.backend.nurseRepo" );
HibernateJpaVendorAdapter vendorAdapter
= new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto",
env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
properties.put("hibernate.dialect",
env.getProperty("spring.jpa.hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Bean(name = "secondDs")
public DataSource secondaryDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource80950.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource80950.url"));
dataSource.setUsername(env.getProperty("spring.datasource80950.username"));
dataSource.setPassword(env.getProperty("spring.datasource80950.password"));
return dataSource;
}
@Bean(name="secondaryTransactionManager")
@Autowired
DataSourceTransactionManager secondaryTransactionManager(@Qualifier ("secondDs") DataSource datasource) {
DataSourceTransactionManager txm = new DataSourceTransactionManager(datasource);
return txm;
}
}
@配置
@EnableJpaRepositories(basePackages={“com.backend.nurseRepo”},
entityManagerFactoryRef=“secondaryEntityManager”,
transactionManagerRef=“secondaryTransactionManager”)
@启用事务管理
公共类SecondaryTmConfiguration{
@自动连线
环境环境;
@豆子
public LocalContainerEntityManagerFactoryBean secondaryEntityManager(){
LocalContainerEntityManagerFactoryBean em
=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(secondaryDataSource());
em.setPackagesToScan(“com.lerkom.backend.nurseRepo”);
冬眠盲蝽
=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
映射属性=新的HashMap();
properties.put(“hibernate.hbm2ddl.auto”,
getProperty(“spring.jpa.hibernate.hbm2ddl.auto”);
properties.put(“hibernate.dial”,
env.getProperty(“spring.jpa.hibernate.dial”);
em.setJpaPropertyMap(属性);
返回em;
}
@Bean(name=“secondDs”)
公共数据源secondaryDataSource(){
DriverManager数据源dataSource=新的DriverManager数据源();
setDriverClassName(env.getProperty(“spring.datasource80950.driverClassName”);
setUrl(env.getProperty(“spring.datasource80950.url”);
setUsername(env.getProperty(“spring.datasource80950.username”);
setPassword(env.getProperty(“spring.datasource80950.password”);
返回数据源;
}
@Bean(name=“secondaryTransactionManager”)
@自动连线
数据源TransactionManager secondaryTransactionManager(@Qualifier(“secondDs”)数据源数据源){
DataSourceTransactionManager txm=新的DataSourceTransactionManager(数据源);
返回txm;
}
}
然后,我在我的服务上使用@Transactional注释:
@Service
@Transactional("secondaryTransactionManager")
public class AlertService {
@Autowired
AlertsDao alertsDao;
@Autowired
OptionsDao optionsDao;
public void test() {
List<OptionsEntity> options = optionsDao.findAll();
List<AlertsEntity> alerts = alertsDao.findAll();
}
}
@服务
@事务性(“secondaryTransactionManager”)
公共类警报服务{
@自动连线
AlertsDao AlertsDao;
@自动连线
选项dao选项dao;
公开无效测试(){
List options=optionsDao.findAll();
List alerts=alertsDao.findAll();
}
}
在这里我真的很惊讶。我希望@Transactional上的设置(“secondaryTransactionManager”)只会打开到我的第二个数据源(名为secondDs)的连接。
但我同时获得选项和警报值。我不明白它如何从第一个数据源获取数据
DAO是一种假设
@Repository
public interface OptionsDao extends JpaRepository<OptionsEntity, String> {
}
@存储库
公共接口选项DAO扩展了JpaRepository{
}
@存储库
公共接口警报DAO扩展了JpaRepository{
}
请帮助我理解这一点:)
提前谢谢