Tôi đang sử dụng cấu hình dựa trên Spring Java để định cấu hình nhiều cơ sở dữ liệu với dữ liệu Spring. Trong tệp cấu hình, tôi đang tạo hai data source
cho MySQL
và MSSQL-Server
. Khi cố gắng để tiêm phụ thuộc vào người quản lý đơn vị sử dụng @Resource
chú tôi đang nhận được ngoại lệ sau đây:Chú thích tài nguyên: Không có loại đậu đủ điều kiện [javax.sql.DataSource] được định nghĩa: bean kết hợp đơn dự kiến nhưng tìm thấy 2
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: mysql_datasource,secure_datasource
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1016)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:815)
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:743)
Tiếp theo là mã của tôi:
@Bean(name="secure_datasource")
public DataSource dataSource(){
try{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl(environment.getProperty("sc.db.url"));
dataSource.setDriverClass(environment.getProperty("sc.db.driver.class"));
dataSource.setUser(environment.getProperty("sc.db.username"));
dataSource.setPassword(environment.getProperty("sc.db.password"));
dataSource.setIdleConnectionTestPeriod(60);
dataSource.setMaxPoolSize(10);
dataSource.setMaxStatements(7);
dataSource.setMinPoolSize(1);
return dataSource;
}catch(Exception ex){
throw new RuntimeException(ex);
}
}
.................
@Bean(name="mysql_datasource")
public DataSource dataSource(){
try{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setJdbcUrl(environment.getProperty("db.url"));
dataSource.setDriverClass(environment.getProperty("db.driver.class"));
dataSource.setUser(environment.getProperty("db.username"));
dataSource.setPassword(environment.getProperty("db.password"));
dataSource.setIdleConnectionTestPeriod(60);
dataSource.setMaxPoolSize(100);
dataSource.setMaxStatements(50);
dataSource.setMinPoolSize(10);
return dataSource;
}catch(Exception ex){
throw new RuntimeException(ex);
}
}
.......
@Resource(value="mysql_datasource")
@Bean(name="entity_manager_factory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource){
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
factoryBean.setPackagesToScan(environment.getProperty("package.scan"));
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
return factoryBean;
}
Tôi cũng cố gắng sử dụng @Qualifier
chú thích như đề nghị tôi liên kết này nhưng vẫn gặp lỗi. Using 2 beans of the same type: javax.sql.DataSource in Spring
Tôi đã thêm chỉ thị @Primary nhưng khi tôi làm người quản lý giao dịch, cả hai nhà máy phiên của họ đều sử dụng nguồn dữ liệu chính. Có cách nào để nói cụ thể cho sessionfactory sử dụng nguồn dữ liệu nào không? – Sakib
Chúng tôi có thể cần một chút mã của bạn để tìm ra từ, như bạn có thể thấy trong đoạn mã trên, trình quản lý phiên được chỉ định trong quá trình tạo trình quản lý giao dịch. –