【问题标题】:declaration of 2 dataSources in dispacher Servlet - Spring Mvc在调度程序 Servlet 中声明 2 个数据源 - Spring Mvc
【发布时间】:2016-05-16 15:36:17
【问题描述】:

我的应用程序中有 2 个不同的数据库,(我正在使用 spring Mvc``hibernate )一个在本地主机中,另一个是远程数据库。我是否可以在dispacher Servlet 中声明两个数据源,如下所示:

 <context:component-scan base-package="com.testcode.controller" />
    <context:component-scan base-package="com.testcode.services" />
    <context:component-scan base-package="com.testcode.dao" />

 <bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />

    <property name="prefix">
        <value>/WEB-INF/views/jsp/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>

<!-- declare beans -->
<bean id="serverService" class="com.testcode.services.ServerServiceImpl">
    <property name="serverDao" ref="serverDao"></property>
</bean>

<bean id="serverDao" class="com.testcode.dao.ServerdaoImpl">
    <property name="sessionFactory" ref="SessionFactory2" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/database1" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://192.168.1.8:3306/database2" />
    <property name="username" value="root" />
    <property name="password" value="root" />
</bean>

<bean id="SessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>
            <value>com.testcode.domain.User</value>


        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
            </prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="SessionFactory2"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource2" />
    <property name="annotatedClasses">
        <list>
            <value>com.testcode.domain.Server</value>


        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
            </prop>
            <prop key="hibernate.current_session_context_class ">thread</prop>

            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>


<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/images/**" location="/resources/core/images/" />


<mvc:annotation-driven />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory" />
</bean>

<bean id="transactionManager2"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="SessionFactory2" />
</bean>

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

当我尝试将服务器插入远程数据库中的表时,我遇到了这个错误:

 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread

这个问题是由于定义了 2 个数据源还是什么?

编辑

这是serverDaoImpl

@Repository("serverDao")
public class ServerdaoImpl implements ServersDao{

 private SessionFactory sessionFactory;
 public void setSessionFactory(SessionFactory sf){

         this.sessionFactory = sf;
     }

@Override
public void insertServer(Server server) {
     Session session = this.sessionFactory.getCurrentSession();
     session.persist(server);
}

 @SuppressWarnings("unchecked")
@Override
public List<Server> getServerList() {
     Session session = this.sessionFactory.getCurrentSession();
        List<Server> serverList = session.createQuery("from servers").list();
        return serverList;
}

@Override
public void updateServer(Server server) {
     Session session = this.sessionFactory.getCurrentSession();
        session.update(server);     
}

这是serverServiceImpl

@Service("serverService")
public class ServerServiceImpl implements ServerService {

private ServersDao serverdao;

public void setServerDao(ServersDao serverdao) {
    this.serverdao = serverdao;
}

@Override
@Transactional
public void insertServer(Server server) {
    this.serverdao.insertServer(server);
}

@Override
@Transactional
public List<Server> getServerList() {
    return this.serverdao.getServerList();
}

【问题讨论】:

    标签: hibernate spring-mvc


    【解决方案1】:

    你没有在&lt;tx:annotation-driven transaction-manager="transactionManager" /&gt;中指定transactionManager2

    请注意您的定义也正确

    <mvc:annotation-driven />
    <context:component-scan base-package="" />
    

    还要检查 &lt;beans:prop key="hibernate.current_session_context_class"&gt;thread&lt;/beans:prop&gt; 是否已添加到 hibernate.properties 文件中

    请在您的 Service 或 DAO 方法中指定 @Transactional

    【讨论】:

    • 我试图添加这个` ` 但它不起作用是我已经定义了base-packages 我将编辑帖子
    • 检查 thread 是否已经在 hibernate.properties 中定义
    • 我正在使用 spring Mvc 我没有 hibernate.properties file hibernate's configuration 在具有 id 的 bean 中:sessionFactory
    • 添加 thread 并始终调用 getCurrentSession() 而不是 openSession()
    • 也用@Transactional注释你的服务或dao方法
    【解决方案2】:

    我已经解决了这个问题,现在我可以同时使用这两个数据源了。 问题是TransactionManagerTransactionManager2 之间的冲突

    我在 serverService 中添加了@Transactional(value="TransactionManager2")

    希望这对将来的某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 2014-07-06
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2014-05-27
      相关资源
      最近更新 更多