第二次从我的应用程序中查询结果集时,无法从数据库中检索结果集

时间:2013-06-03 12:40:04

标签: database spring hibernate model-view-controller caching

我正在使用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。我知道我错过了hibernate的一些基本部分,因为它发生在我的应用程序中检索的所有值。第一次创建会话工厂,每次都按计划​​进行,但下次我查询db ... booom ....不成比例。最可悲的是,我甚至不会得到例外。代码停止运行(等待来自db的响应)。

帮帮我们。

2 个答案:

答案 0 :(得分:1)

感谢您的回复。我终于找到了原因。

这不是因为会议。我打开它后没有将连接返回到池中,这使连接池变得饥饿。

一旦我在spring xml中将以下内容添加到hibernate属性中,一切都运行良好。

<prop key="hibernate.connection.release_mode">after_transaction</prop> 

答案 1 :(得分:0)

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

在请求结束时关闭会话

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