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です。アプリケーションで取得したすべての値に対して発生しているため、休止状態の基本的な部分が欠落していることはわかっています。セッションファクトリが初めて作成されたときは、毎回計画どおりに進みますが、次回データベースにクエリを実行すると...ブーム....バランスが崩れます。最も悲しいことは、例外さえ取得しないことです。コードは実行を停止します (db からの応答を待ちます)。

みんな助けて。

4

2 に答える 2

1

回答ありがとうございます。やっと理由がわかりました。

セッションのせいではありません。プールを開いた後、接続をプールに戻していなかったため、接続プールが枯渇していました。

spring xml の hibernate プロパティに以下を追加すると、すべてうまくいきました。

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