【问题标题】:Unable to retrieve the result set from database the second time i query it from my application第二次从我的应用程序中查询时,无法从数据库中检索结果集
【发布时间】:2013-05-29 14:46:57
【问题描述】:

我正在使用 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 的响应)。

帮帮我。

【问题讨论】:

  • 你能提供你用来请求数据库的代码吗?有一件事很尴尬,那就是你的 spring 配置中存在 jdbc 模板。
  • @benzonico:请您现在检查一下。我在一个阶段声明了模板,但我没有使用它。太糟糕了,我只是离开了它(它是不可见的)。会很高兴把它拿下来。但我不认为,这会导致任何问题。会吗?
  • 您正在关闭会话工厂。见stackoverflow.com/questions/4699381/…

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


【解决方案1】:

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

这不是由于会话。一旦我打开它,我就没有将连接返回到池中,这使得连接池处于饥饿状态。

在我的 spring xml 中将以下内容添加到休眠属性后,一切正常。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 嗨苯佐尼科,非常感谢您的回答。问题是,应用程序有经常访问数据库的查询。我在想休眠中的某种缓存可以避免查询一次又一次地访问数据库。我会给你一个小问题示例:当我登录时,控制台显示从 db 检索用户详细信息的日志。第二次,它工作正常并且以类似的方式。但第三次,它击中了数据库,控制台没有显示任何内容,并且 d 应用程序只是加载而没有从数据库中检索 2。我会尝试你的解决方案,但请随时在 dis 上提出建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多