Spring 多数据源配置问题
在我的项目中,我使用了两个oracle数据源,一个是Im使用的Spring 多数据源配置问题,spring,oracle,hibernate,jpa,Spring,Oracle,Hibernate,Jpa,在我的项目中,我使用了两个oracle数据源,一个是Im使用的LocalSessionFactoryBean,另一个是LocalContainerEntityManagerFactoryBean 我正在相应地映射数据源,但当我试图获取LocalSessionFactoryBean的sessionFactory时,数据源的详细信息是另一个的。别担心我做错了什么 <tx:annotation-driven transaction-manager="xxxTransactionManager"
LocalSessionFactoryBean
,另一个是LocalContainerEntityManagerFactoryBean
我正在相应地映射数据源,但当我试图获取LocalSessionFactoryBean
的sessionFactory时,数据源的详细信息是另一个的。别担心我做错了什么
<tx:annotation-driven transaction-manager="xxxTransactionManager" />
<bean id="xxxEntityManagerFactoryBean"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:persistence.xml" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>
<bean class="org.modelmapper.ModelMapper" id="modelMapper"/>
<bean id="xxxEntityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="xxxEntityManagerFactoryBean" />
</bean>
<bean id="xxxTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="xxxEntityManagerFactoryBean" />
<property name="nestedTransactionAllowed" value="true" />
<property name="dataSource" ref="dataSource" />
<property name="jpaDialect" ref="jpaDialect" />
</bean>
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
${hibernate.dial}
${hibernate.show_sql}
${hibernate.hbm2ddl.auto}
在导入的另一个xml文件中
<bean id="sessionFactoryNew"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource1" />
<property name="packagesToScan" value="com.citi.aml.npa.domain.api" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
</bean>
<bean id="xxxTransactionManagerNew"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryNew" />
<qualifier value="xxxtransaction"/>
</bean>
${hibernate.show_sql}
${hibernate.dial}
在app context.xml中,我有如下数据源
<beans profile="local">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.oracle.driverClassName}" />
<property name="username" value="${db.oracle.username}" />
<property name="password" value="${db.oracle.password}" />
<property name="url" value="${db.oracle.url}" />
</bean>
<context:property-placeholder location="classpath*:/config/local/yyy.properties" ignore-unresolvable="true"/>
</beans>
<beans profile="local">
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.oracle.driverClassName}" />
<property name="username" value="${db.oracle.username}" />
<property name="password" value="${db.oracle.password}" />
<property name="url" value="${db.oracle.url}" />
</bean>
<context:property-placeholder location="classpath*:/config/local/xxx_db.properties" ignore-unresolvable="true"/>
</beans>
在我的生活中
@Repository
public class OracledbTestRepository implements TestRepository {
@Autowired
@Qualifier(value = "sessionFactoryNew")
SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
@Override
public List<xxx> getTestData() {
Session session = sessionFactory.getCurrentSession();
System.out.println(sessionFactory);
List<xxx> xxxTestDatas = session.createCriteria(xxx.class).list();
return xxxTestDatas;
}
}
@存储库
公共类OracledbTestRepository实现TestRepository{
@自动连线
@限定符(value=“sessionFactoryNew”)
会话工厂会话工厂;
@抑制警告(“未选中”)
@凌驾
公共列表getTestData(){
Session Session=sessionFactory.getCurrentSession();
系统输出打印LN(会话工厂);
List xxxTestDatas=session.createCriteria(xxx.class.List();
返回xxxTestDatas;
}
}
任何帮助都将不胜感激。您的bean配置在我看来有点不可靠。您有两个同名的不同配置文件。如果这两个数据源需要同时运行,那么将数据库属性合并到一个文件中,并将两个数据源配置放在同一个profile元素中会更简单 因此,对于consolidated database.properties,请执行以下操作:
db1.oracle.url=jdbc:oracle:thin:@server1...
db1.oracle.username=foo
...
db2.oracle.url=jdbc:oracle:thin:@server2...
db2.oracle.username=bar
<beans profile="local">
<context:property-placeholder location="classpath*:/config/local/database.properties" ignore-unresolvable="true"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db1.oracle.driverClassName}" />
<property name="username" value="${db1.oracle.username}" />
<property name="password" value="${db1.oracle.password}" />
<property name="url" value="${db1.oracle.url}" />
</bean>
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db2.oracle.driverClassName}" />
<property name="username" value="${db2.oracle.username}" />
<property name="password" value="${db2.oracle.password}" />
<property name="url" value="${db2.oracle.url}" />
</bean>
</beans>
对于bean配置,请使用如下内容:
db1.oracle.url=jdbc:oracle:thin:@server1...
db1.oracle.username=foo
...
db2.oracle.url=jdbc:oracle:thin:@server2...
db2.oracle.username=bar
<beans profile="local">
<context:property-placeholder location="classpath*:/config/local/database.properties" ignore-unresolvable="true"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db1.oracle.driverClassName}" />
<property name="username" value="${db1.oracle.username}" />
<property name="password" value="${db1.oracle.password}" />
<property name="url" value="${db1.oracle.url}" />
</bean>
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db2.oracle.driverClassName}" />
<property name="username" value="${db2.oracle.username}" />
<property name="password" value="${db2.oracle.password}" />
<property name="url" value="${db2.oracle.url}" />
</bean>
</beans>
我觉得你的bean配置有点不稳定。您有两个同名的不同配置文件。如果这两个数据源需要同时运行,那么将数据库属性合并到一个文件中,并将两个数据源配置放在同一个profile元素中会更简单 因此,对于consolidated database.properties,请执行以下操作:
db1.oracle.url=jdbc:oracle:thin:@server1...
db1.oracle.username=foo
...
db2.oracle.url=jdbc:oracle:thin:@server2...
db2.oracle.username=bar
<beans profile="local">
<context:property-placeholder location="classpath*:/config/local/database.properties" ignore-unresolvable="true"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db1.oracle.driverClassName}" />
<property name="username" value="${db1.oracle.username}" />
<property name="password" value="${db1.oracle.password}" />
<property name="url" value="${db1.oracle.url}" />
</bean>
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db2.oracle.driverClassName}" />
<property name="username" value="${db2.oracle.username}" />
<property name="password" value="${db2.oracle.password}" />
<property name="url" value="${db2.oracle.url}" />
</bean>
</beans>
对于bean配置,请使用如下内容:
db1.oracle.url=jdbc:oracle:thin:@server1...
db1.oracle.username=foo
...
db2.oracle.url=jdbc:oracle:thin:@server2...
db2.oracle.username=bar
<beans profile="local">
<context:property-placeholder location="classpath*:/config/local/database.properties" ignore-unresolvable="true"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db1.oracle.driverClassName}" />
<property name="username" value="${db1.oracle.username}" />
<property name="password" value="${db1.oracle.password}" />
<property name="url" value="${db1.oracle.url}" />
</bean>
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db2.oracle.driverClassName}" />
<property name="username" value="${db2.oracle.username}" />
<property name="password" value="${db2.oracle.password}" />
<property name="url" value="${db2.oracle.url}" />
</bean>
</beans>