休眠 - 连接太多

Posted

技术标签:

【中文标题】休眠 - 连接太多【英文标题】:Hibernate - Too Many Connections 【发布时间】:2016-04-20 09:21:57 【问题描述】:

我有一个用于 android 应用程序的 RESTful API。 一切正常,但一段时间后我的数据库连接用完了。

我正在使用 mysql Workbench 监控客户端连接,每次我登录用户时,连接数都会增加。 (它们都没有被重新使用或关闭)。

这是我的示例选择查询以根据他的身份验证令牌获取用户信息:

    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>

【问题讨论】:

您能发布您的休眠配置使用的连接设置吗? 【参考方案1】:

在休眠配置文件中设置连接池属性。有关连接池,请参阅 this 链接。

除此之外,您还可以编写自己的连接关闭逻辑,如下所示:

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

如果这能解决您的问题,请告诉我。

【讨论】:

【参考方案2】:

将这些放入您的配置 xml 并尝试,

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

【讨论】:

以上是关于休眠 - 连接太多的主要内容,如果未能解决你的问题,请参考以下文章

使用休眠时数据库连接过多

如何从休眠会话中获取 jdbc 连接? [复制]

龙目岛与休眠

休眠不关闭连接

一对多的连接列为空休眠

可空多对一的休眠默认连接