gpt4 book ai didi

spring - 如何在 spring-servlet.xml 中映射多个数据源?

转载 作者:行者123 更新时间:2023-12-02 03:15:08 24 4
gpt4 key购买 nike

我需要在我的项目中使用 hibernate 连接多个数据库。我尝试使用 2 个数据源 bean 标记,但它不起作用会引发错误。但是,如果我给 1 个数据源 bean,它就可以正常工作。在这里,我显示我的属性文件和 servlet.xml 文件。

数据库.properties:

#mySQL DB Properties
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/abc
database.user=root
database.password=pass
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update


#DB2DB Properties
db2.driver=com.ibm.db2.jcc.DB2Driver
db2.url=jdbc:db2://123.141.74.323:50000/DB
db2.user=user
db2.password=pass
db2hibernate.dialect=org.hibernate.dialect.DB2Dialect
db2hibernate.show_sql=true
db2hibernate.hbm2ddl.auto=update

spring-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<!--Properties file -->
<context:property-placeholder location="classpath:resources/database.properties" />

<!--Packages to scan -->
<context:component-scan base-package="com.gcs.*" />

<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>

<tx:annotation-driven transaction-manager="hibernateTransactionManager1"/>

<!--View Resolver -->

<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.tiles2.TilesView
</value>
</property>
</bean>
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
<!--End of View Resolver -->

<!-- mySQL DataSource -->

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.user}" />
<property name="password" value="${database.password}" />
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>com.gcs.beans.SystemBean</value>
<value>com.gcs.beans.TemplateBean</value>
<value>com.gcs.beans.LoginBean</value>
<value>com.gcs.beans.TestSuitBean</value>
</list>
</property>
<property name="hibernateProperties">
<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 id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<!-- End of mySQL DataSource -->

<!-- DB2 DataSource -->

<bean id="DB2dataSource" class="com.ibm.db2.jcc.DB2DataSource">
<property name="driverClassName" value="${db2.driver}" />
<property name="url" value="${db2.url}" />
<property name="username" value="${db2.user}" />
<property name="password" value="${db2.password}" />
</bean>

<bean id="DB2sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="DB2dataSource" />
<property name="annotatedClasses">
<list>
<value>com.gcs.beans.AudTrailBean</value>
<value>com.gcs.beans.AudTrailDtlBean</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${db2hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${db2hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${db2hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>

<bean id="hibernateTransactionManager1"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="DB2sessionFactory" />
</bean>

<!-- End of DB2 DataSource -->

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- one of the properties available; the maximum file size in bytes -->
<property name="maxUploadSize" value="10000000" />
</bean>

</beans>

如果我注释第二个数据源 bean 意味着它工作正常,但我没有注释第二个数据源 bean 意味着它抛出错误。下面我显示了错误。

错误:

root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gcsController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.gcs.service.LoginService com.gcs.controller.GcsController.loginService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.gcs.dao.LoginDao com.gcs.service.LoginServiceImpl.loginDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginDao': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.gcs.dao.LoginDaoImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DB2sessionFactory' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Cannot resolve reference to bean 'DB2dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'DB2dataSource' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'driverClassName' of bean class [com.ibm.db2.jcc.DB2DataSource]: Bean property 'driverClassName' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:871)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:443)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:459)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:340)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:307)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)

我不知道我哪里弄错了。我希望任何人都可以帮助我找到错误。

最佳答案

您的 spring-servlet.xml 看起来不错。当您尝试注入(inject) sessionFactory 时出现错误。请尝试以下代码。

@Transactional(value ="hibernateTransactionManager",propagation = Propagation.REQUIRED)
public class FirstDao extends HibernateDaoSupport{


@Autowired
public void init(@Qualifier("sessionFactory1") SessionFactory sessionFactory) {
setSessionFactory(sessionFactory);
}


public SampleEstimate fetchEstimate(long objectId){
SampleEstimate estimate=(SampleEstimate) getSessionFactory().openSession().getNamedQuery("SampleEstimate.findOne").
setLong("objectId",objectId).list().get(0);
return estimate;
}

public void saveGroup(SampleEstimateGroup group){
getHibernateTemplate().saveOrUpdate(group);
}

}

另一个 Dao 中的 Second Session 工厂注入(inject)

    @Transactional(value = "hibernateTransactionManager1",propagation = Propagation.REQUIRED,readOnly = false)
public class SecondDao extends HibernateDaoSupport {

@Autowired
@Qualifier("secondSessionFactory")
public void init(SessionFactory sessionFactory){
setSessionFactory(sessionFactory) ;
}

public SecondDbEntity getSecondDbEntity(){
return (SecondDbEntity)getHibernateTemplate().findByNamedQuery("SecondDbEntity.findAll").get(0);
}
}

希望这会有所帮助..

关于spring - 如何在 spring-servlet.xml 中映射多个数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37452215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com