0

我正在使用 Hibernate+Spring MVC 开发应用程序。在登录页面,我只是查询一个用户表并验证用户是否有效。使用我的 Spring 和 Hibernate 配置,它可以顺利运行。但问题是有一次,我创建了一个会话工厂,下次我尝试验证时。它不获取用户详细信息。代码运行良好,没有任何错误被抛出。我也尝试取消选中二级缓存,但问题仍然存在。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@//localhost:1521/XE"></property>
<property name="username" value="testdata"></property>
<property name="password" value="testdata"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="org.test.model"></property>
<property name="hibernateProperties">
    <props>
        <prop key="dialect">org.hibernate.dialect.OracleDialect</prop>
        <prop key="hibernate.cache.use_second_level_cache">false</prop>
    </props>
</property>
</bean>
package org.test.dao.impl;

import javax.transaction.Transaction;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.test.dao.DaoMethods;
import org.test.model.Sla_Users;

@Repository
public class DaoMethodsImpl implements DaoMethods{

@Autowired
private SessionFactory sessionFactory;


public SessionFactory getSessionFactory() {
    return sessionFactory;
}

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

@Override
public int getUsersCount() {
    System.out.println("INSIDE REPO->GETUSERSCOUNT"+getSessionFactory());
    String sql = "select count(*) from Sla_Users";
    Query query = getSessionFactory().openSession().createQuery(sql);
    return ((Long) query.uniqueResult()).intValue();
}

@Override
public Sla_Users getUser(String username) {
    System.out.println("INSIDE REPO->GETUSERPASSWORD"+getSessionFactory());
    Session validateSession = this.getSessionFactory().openSession();
    System.out.println(validateSession);
    Sla_Users user = null;
    try
    {
        user= (Sla_Users) validateSession.get(Sla_Users.class, username);
    }
    catch(Exception ex)
    {
        System.out.println("exception fetching user at login: "+ex);
    }
    finally
    {
        validateSession.close();
        this.getSessionFactory().close();
        System.out.println(validateSession+":"+getSessionFactory());
    }
    //Sla_Users user = (Sla_Users)this.getSessionFactory().openSession().get(Sla_Users.class, username);
    return user;
}

}

那是我使用的xml。我知道我错过了休眠的一些基本部分,因为它发生在我在我的应用程序中检索的所有值。第一次创建会话工厂,每次都按计划​​进行,但下一次我查询数据库时 ... booom .... 不成比例。最可悲的是,我什至不会得到例外。代码只是停止运行(等待来自 db 的响应)。

帮帮我,伙计们。

4

2 回答 2

1

感谢您的回复。我终于弄清楚了原因。

这不是由于会议。一旦我打开它,我就没有将连接返回到池,这使连接池饿死。

一旦我将以下内容添加到我的 spring xml 中的休眠属性,一切都很好。

<prop key="hibernate.connection.release_mode">after_transaction</prop> 
于 2013-06-10T05:54:26.603 回答
0

发生的事情是您在不使用连接池的情况下打开会话而不是关闭它。因此,当您执行第二个请求时,您正在等待第一个会话关闭以便打开一个新会话。您应该做的是使用 :sessionFactory.getCurrentSession()或在您的请求结束时使用关闭会话session.close()

此外,您不应该像@Jukka 的评论中提到的那样关闭 sessionFactory。因此,您必须删除该行this.getSessionFactory().close();

于 2013-06-03T15:05:33.333 回答