2014-01-31 41 views
1

我是新的春天mvc和休眠。如何关闭连接使用会话工厂

如何在春季mvc应用中关闭连接。我对这个问题感到非常沮丧。

这是我的代码:

调度的servlet:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="com.kqics" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
     p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> 

    <bean id="userService" class="com.kqics.dao.kqtraveldao"> 
    </bean> 

    <bean id="viewResolver1" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
     <property name="order" value="1"/> 
     <property name="basename" value="views"/> 
    </bean> 

    <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> 

    <import resource="db-config.xml" /> 

</beans> 

dbconfig.xml

<?xml version="1.0" encoding="UTF-8"?> 

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

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"><value>/WEB-INF/jdbc.properties</value></property> 
</bean> 


<bean id="dataSourceBean" lazy-init="true" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 

     <property name="driverClass" value="${jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}"/> 


     <property name="acquireIncrement" value="${jdbc.acquireIncrement}" /> 
     <property name="minPoolSize" value="${jdbc.minPoolSize}" /> 
     <property name="maxPoolSize" value="${jdbc.maxPoolSize}" /> 
     <property name="maxIdleTime" value="${jdbc.maxIdleTime}" /> 
     <property name="numHelperThreads" value="${jdbc.numHelperThreads}" /> 


    </bean> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
       p:dataSource-ref="dataSourceBean" 
       p:packagesToScan="com.kqics" > 

     <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> --> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.connection.release_mode">after_transaction</prop> 
     <prop key="hibernate.connection.shutdown">true</prop> 
     </props> 
     </property> 

    </bean> 

    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 
    <tx:annotation-driven/> 

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

    </bean> 


</beans> 

我的服务类:

@Service 
public class kqtravellogservice implements ikqtravellogservice { 

@Autowired 
ikqtraveldao iDao; 

@Transactional 
public void serviceaddnewvehicle(kqvehicle obj) { 
    // TODO Auto-generated method stub 

    iDao.addnewvehicle(obj); 

} 

@Transactional 
public List<kqvehicle> servicefetchallvehicle() { 

    return iDao.fetchallvehicle(); 
} 

@Transactional 
public void serviceaddnewvehicletariff(kqvehicletariff obj,String tariff) { 

    iDao.addnewvehicletariff(obj,tariff); 

} 

道IMPL

public class kqtraveldao implements ikqtraveldao { 

    private HibernateTemplate hibernateTemplate; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     try { 
      hibernateTemplate = new HibernateTemplate(sessionFactory); 

     } catch (Exception w) { 
     } 

    } 


    @Override 
    public void addnewvehicle(kqvehicle obj) { 


     hibernateTemplate.save(obj); 

    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<kqvehicle> fetchallvehicle() { 

     List<kqvehicle> li=null; 

    li=hibernateTemplate.find("from kqvehicle"); 


    return li; 
    } 

    @Override 
     public void addnewvehicletariff(kqvehicletariff obj, String tariff) { 

      try 
      { 
      hibernateTemplate.getSessionFactory() 
      .openSession() 
      .createSQLQuery("insert into "+tariff+" values(?,?,?,?,?)") 
      .setParameter(0, obj.getTid()) 
      .setParameter(1, obj.getVehicletype()) 
      .setParameter(2, obj.getRupees()) 
      .setParameter(3, obj.getDateupto()) 
      .setParameter(4, obj.getDatetimedetermined()) 
      .executeUpdate(); 
      } 
      catch(Exception e) 
      { 

      } 
      finally 
      { 
       hibernateTemplate.getSessionFactory().close(); 

      } 


     } 

一些朋友,因为我没有使用单,关闭连接告诉我..所以,我得到了太多的连接错误......请咨询我如何解决这个问题?

什么是我的代码需要更改....

回答

0

问题是在你的道,你的保存方法是破坏弹簧适当的tx管理。当您使用Spring来管理连接和会话时,请不要致电openSession()

取而代之的是使用HibernateCallback,它会给你一个春季管理会话。

@Override 
public void addnewvehicletariff(final kqvehicletariff obj, final String tariff) { 
    hibernateTemplate.execute(new HibernateCallback() { 
     public Object doInHibernate(Session session) { 
      session.createSQLQuery("insert into "+tariff+" values(?,?,?,?,?)") 
      .setParameter(0, obj.getTid()) 
      .setParameter(1, obj.getVehicletype()) 
      .setParameter(2, obj.getRupees()) 
      .setParameter(3, obj.getDateupto()) 
      .setParameter(4, obj.getDatetimedetermined()) 
      .executeUpdate(); 
     } 
    } 
} 

另外一个需要注意的是,你不应该使用HibernateTemplate了,你应该使用getCurrentSession()方法上SessionFactory编写针对使用Hibernate API代码。有关更多信息,请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-hibernate-straight

public class kqtraveldao implements ikqtraveldao { 

    private SessionFactory sessionFactory; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory=sessionFactory; 
    } 

    @Override 
    public void addnewvehicle(kqvehicle obj) { 
     sessionFactory.getCurrentSession().save(obj); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<kqvehicle> fetchallvehicle() { 
     return sessionFactory.getCurrentSession() 
      .createQuery("from kqvehicle") 
      .list(); 
    } 

    @Override 
    public void addnewvehicletariff(kqvehicletariff obj, String tariff) { 
     sessionFactory.getCurrentSession() 
     .createSQLQuery("insert into "+tariff+" values(?,?,?,?,?)") 
     .setParameter(0, obj.getTid()) 
     .setParameter(1, obj.getVehicletype()) 
     .setParameter(2, obj.getRupees()) 
     .setParameter(3, obj.getDateupto()) 
     .setParameter(4, obj.getDatetimedetermined()) 
     .executeUpdate(); 
    } 
} 
+0

谢谢Deinum,你能解释一下单身对象和我们在上面代码中使用** singleton对象**的情况。 –

+0

你的代码已经使用了一个单例,所以不知道你想要解释什么。 –

+0

嗨Deinum,我已经改变了我的应用程序,如上所述,但现在仍然有类似的问题。我已经发布另一个查询堆栈溢出请访问。这个链接.. http://stackoverflow.com/questions/21520106/tomcat-server-not-loading-more-than-2-applications/21520369?noredirect=1#21520369 –

0

只是自动装配在DAO SessionFactory并删除方法设置会话工厂。

@Autowired 
private SessionFactory sessionfactory; 

您可以通过在您的方法中调用sessionfactory.getCurrentSession().close()来关闭连接。

Session工厂是您的应用程序中的“单例”。

相关问题