Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用会话工厂关闭连接_Java_Spring_Hibernate_Spring Mvc_Hibernate Annotations - Fatal编程技术网

Java 如何使用会话工厂关闭连接

Java 如何使用会话工厂关闭连接,java,spring,hibernate,spring-mvc,hibernate-annotations,Java,Spring,Hibernate,Spring Mvc,Hibernate Annotations,我不熟悉SpringMVC和hibernate 如何在spring 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" xmln

我不熟悉SpringMVC和hibernate

如何在spring 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>

/WEB-INF/jdbc.properties
${hibernate.dial}
符合事实的
事后交易
符合事实的
我的服务级别:

@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);

}
@服务
公共类KQTravelogService实现IKQTravelogService{
@自动连线
爱达荷州ikqtraveldao;
@交易的
公共无效服务添加新车(kqvehicle obj){
//TODO自动生成的方法存根
iDao.新增车辆(obj);
}
@交易的
公共列表servicefetchallvehicle(){
返回iDao.fetchallvehicle();
}
@交易的
公共无效服务添加新车辆通行费(kqvehicletariff obj,字符串电价){
iDao.addnewvehicletariff(obj,关税);
}
dao 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();

            }


        }
公共类kqtraveldao实现ikqtraveldao{
私有HibernateTemplate HibernateTemplate;
@自动连线
public void setSessionFactory(SessionFactory SessionFactory){
试一试{
hibernateTemplate=新的hibernateTemplate(sessionFactory);
}捕获(例外情况w){
}
}
@凌驾
公共车辆添加新车(kqvehicle obj){
hibernateTemplate.save(obj);
}
@抑制警告(“未选中”)
@凌驾
公共列表fetchallvehicle(){
列表li=null;
li=hibernateTemplate.find(“来自kqvehicle”);
返回李;
}
@凌驾
公共无效添加新车辆通行费(kqvehicletariff obj,字符串电价){
尝试
{
hibernateTemplate.getSessionFactory()
.openSession()
.createSQLQuery(“插入“+关税+”值(?,,,,?,?)”)
.setParameter(0,obj.getId())
.setParameter(1,obj.getVehicletype())
.setParameter(2,obj.getrupes())
.setParameter(3,obj.getDateupto())
.setParameter(4,obj.getDatetimedetermined())
.executeUpdate();
}
捕获(例外e)
{
}
最后
{
hibernateTemplate.getSessionFactory().close();
}
}
一些朋友告诉我,因为我没有使用singleton,连接关闭…所以,我得到了太多的连接错误…请建议我如何解决这个问题


我的代码需要做哪些更改…

问题出在dao中,您的保存方法正在破坏springs正确的tx管理。当您使用Spring管理连接和会话时,千万不要调用
openSession()

而是使用一个
HibernateCallback
,它将为您提供一个spring管理的会话

@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
,您应该使用
SessionFactory
上的
getCurrentSession()
方法针对普通hibernate API编写代码。有关更多信息,请参阅

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();
    }
}
公共类kqtraveldao实现ikqtraveldao{
私人会话工厂会话工厂;
@自动连线
public void setSessionFactory(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
@凌驾
公共车辆添加新车(kqvehicle obj){
sessionFactory.getCurrentSession().save(obj);
}
@抑制警告(“未选中”)
@凌驾
公共列表fetchallvehicle(){
返回sessionFactory.getCurrentSession()
.createQuery(“来自kqvehicle”)
.list();
}
@凌驾
公共无效添加新车辆通行费(kqvehicletariff obj,字符串电价){
sessionFactory.getCurrentSession()
.createSQLQuery(“插入“+关税+”值(?,,,,?,?)”)
.setParameter(0,obj.getId())
.setParameter(1,obj.getVehicletype())
.setParameter(2,obj.getrupes())
.setParameter(3,obj.getDateupto())
.setParameter(4,obj.getDatetimedetermined())
.executeUpdate();
}
}

只需在dao中自动连接sessionfactory并删除方法集sessionfactory

@Autowired
private SessionFactory sessionfactory;
您可以通过在方法中调用
sessionfactory.getCurrentSession().close()
来关闭连接


会话工厂是应用程序中的“单例”。

谢谢Deinum,请您解释什么是单例对象以及我们在上面的代码中使用了单例对象的位置。您的代码已经使用了单例对象,所以不确定您想解释什么。嗨,Deinum,我已经按照您上面提到的更改了我的应用程序,但现在我仍然得到了s类似的问题。我发布了另一个关于堆栈溢出的查询,请访问。此链接..如果你有多个dao,你应该更改所有dao。我只有一个dao类,我已经按照你建议的方式更改了我应用程序中的所有内容。但我仍然收到了这些错误org.springframework.transaction.CannotCreateTransactionException:无法操作n事务的Hibernate会话;org.Hibernate.TransactionException:JDBC开始失败:java.net.SocketTimeoutException:读取超时com.mchange.v2.resourcepool.TimeoutException:客户端在等待从com.mchange.v2.resourcepool获取资源时超时。BasicResourcePool@1c5950a9--等待可用时超时()