【问题标题】:Too many connections Hibernate and mysql太多的连接 Hibernate 和 mysql
【发布时间】:2013-11-12 07:06:03
【问题描述】:

我完全不知所措,我正在使用 hibernate 和 mysql 运行批处理作业,几个小时后我收到一个异常,说我正在使用许多连接。我已经阅读了所有关于 SO 的文章,但似乎没有一篇与我有关。我正在使用具有非常简单配置的 Tapestry-hibernate,http://tapestry.apache.org/using-tapestry-with-hibernate.html。不,我在哪里创建一个新的 SessionFactory,一旦应用程序启动,我只需将休眠会话注入我的类。

这是我当前与 mysql 的连接视图。

我的批处理作业是线程化的,每次启动新线程时,threads_connected 似乎都会增加。

我的 cfg.xml 文件。

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.datasource">jdbc/company</property>
    <property name="hbm2ddl.auto">validate</property>
    <property name="hibernate.show_sql">false</property>

    <property name="hibernate.search.default.directory_provider">filesystem</property>
    <property name="hibernate.search.default.indexBase">/users/george/Documents/indexes </property>

    <property name="hibernate.cache.use_second_level_cache">true</property>
    <property name="hibernate.cache.use_query_cache">false</property>
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
</session-factory>

类中基本会话使用示例-“请注意以下代码不是生产代码,仅用于说明会话使用。

private final Session session;

public LineReaderParserImpl(Session session) {
    this.session = session;
}

public void parse() {
    exec.submit(new Runnable() {
        public void run() {
          for (int i = 0; i < 10000; i++) {
            Object object = session.createCriteria()...

            session.save(object);
            session.getTransaction().commit();

            if (currentRow % 250 == 0 || currentRow == totalRows) {
                try {
                    session.getTransaction().commit();
                } catch (RuntimeException ex) {
                    try {
                        session.getTransaction().rollback();
                    } catch (RuntimeException rbe) {
                        throw ex;
                    } finally {
                        session.clear();
                        session.beginTransaction();
                    }
                }
            }  
         }              
    }
}

【问题讨论】:

  • 为什么最后会有`session.beginTransaction();` - 你不想关闭
  • 当我关闭它时它崩溃了,所以我开始下一次迭代的事务。这是不正确的吗?严重:空 org.hibernate.SessionException:会话已关闭!在 org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129) 在 org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:731) 在 org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:727) ) at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:723) at $Session_1332660432a2a61f.saveOrUpdate(Unknown Source) at $Session_1332660432a2a5de.saveOrUpdate(Unknown Source)
  • 这是错误的。关闭您的连接(释放到池)并在使用它之后(不是最终)并在需要使用之前打开它(从池中获取)。
  • @user2310289 我修复了与此处找到的最佳答案 stackoverflow.com/questions/16593965/… 匹配的事务,这似乎解决了连接的递增线程,现在我只需要解决递增连接。这可能是chandan回答的结果。

标签: java mysql hibernate tapestry


【解决方案1】:

tapestry-hibernate 提供的休眠会话是 PerThread 范围的。 PerThread 范围内的服务通过 PerthreadManager.cleanupThread() 进行清理。 Tapestry 自动清理请求线程和由 ParallelExecutor 管理的线程。如果您正在管理自己的线程,则必须显式调用 PerthreadManager.cleanupThread()。

【讨论】:

  • 感谢 lance,按照上面的 user2310289 建议修复了我的事务,修复了我的线程连接问题。我整晚都在运行批处理作业而没有用完连接。我确实注意到终端中的连接似乎增加了,但我不相信这有意义吗?我只是将 PerthreadManager.cleanupThread() 添加到线程的末尾吗?
  • Lance,在 nabble 上发现了一个不错的小帖子,apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/…
  • finally 块中的 cleanupThread()。或者使用为你做这件事的 ParallelExecutor。
  • 您可能会发现调用HibernateSessionManager.commit()HibernateSessionManager.abort() 而不是session.getTransaction().commit()session.getTransaction().rollback() 更简洁。这就是@CommitAfter 的最终运作方式。
  • 我是否也应该从 HibernateSessionManager 中获取会话,还是应该继续将 Session 注入我的班级并使用它?
【解决方案2】:

考虑到 Session 对象不是线程安全的,您定义被注入的会话对象的方式可能有问题。

实现者并不是线程安全的。相反,每个线程/事务都应该从 SessionFactory 获取自己的实例。

【讨论】:

  • 有趣,你认为这可能是连接的线程继续爬升的原因吗?老实说,如果它真的很重要,我真的不知道这意味着什么。
  • 如果您不关闭会话,那么所有会话都会用完,因为在您的实现中,也许您正在创建并返回一个新会话,即使之前的会话没有关闭。
  • 同样值得一试 sessionFactory.getCurrentSession()
  • 这是不正确的,tapestry-hibernate 提供了一个线程安全的单例休眠会话。它代理到 PerThreadValue。我在这个线程上的回答中有更多详细信息
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2012-06-02
  • 2013-05-07
相关资源
最近更新 更多