簡體   English   中英

休眠-連接過多

[英]Hibernate - Too Many Connections

我有一個用於Android應用程序的RESTful API。 一切工作正常,但是一段時間后,我的數據庫連接用完了。

我正在使用MySQL Workbench監視客戶端連接,每次登錄用戶時,連接號都會增加。 (它們都沒有被重復使用或關閉)。

這是我的示例Select查詢,以根據用戶的身份驗證令牌獲取用戶信息:

    Session session = HibernateUtil.getSessionFactory().openSession();

    String sql = "SELECT * FROM user WHERE token = :token";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(User.class);
    query.setParameter("token", authToken);
    List results = query.list();

    if(results.isEmpty()){
        session.close();
        return null;
    }
    else {
        session.close();
        return (User) results.get(0);
    }

HibernateUtil.java類的設置如下:

public class HibernateUtil {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;

public static SessionFactory createSessionFactory() {
    Configuration configuration = new Configuration();
    configuration.configure();
    serviceRegistry = new ServiceRegistryBuilder().applySettings(
            configuration.getProperties()). buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    return sessionFactory;
}

public static SessionFactory getSessionFactory() {
    if(sessionFactory != null)
        return sessionFactory;
    else
        return createSessionFactory();
}

即使我正在執行session.close(); 客戶端連接不斷增加,直到達到MySQL閾值為止,這給了我太多連接的錯誤。

我到處尋找嘗試找到答案的方法很多,但似乎沒有任何幫助...感謝任何指導!

謝謝邁克

編輯:

這是我的配置文件(hibernate.cgf.xml)

 <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>
    <property name="hibernate.c3p0.min_size">0</property>
    <property name="hibernate.c3p0.max_size">1</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.max_statements">50</property>
    <property name="hibernate.c3p0.timeout">1800</property>
    <property name="hibernate.c3p0.maxConnectionAge">0</property>

在休眠配置文件中設置連接池屬性。 有關連接池,請參考鏈接。

除此之外,您可以編寫自己的連接關閉邏輯,如下所示:

private void closeSessionFactory(SessionFactory factory) { 
   if(factory instanceof SessionFactoryImpl) {
      SessionFactoryImpl sf = (SessionFactoryImpl)factory;
      ConnectionProvider conn = sf.getConnectionProvider();
      conn.close();
   }
   factory.close();
}

讓我知道是否可以解決您的問題。

將它們放在您的配置xml中並嘗試,

<prop key="hibernate.connection.release_mode">after_statement</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM