Hibernate使用很多线程

时间:2015-03-08 14:27:42

标签: java multithreading hibernate postgresql

在我的独立应用程序中,一次生成超过1000个线程,每个线程都拥有自己的Hibernate会话。但在这种情况下,会话数量会超过引发错误的数据库最大连接限制。

我试图设置.getCurrentSession()而不是.openSession(),但它没有带来任何影响,因为Hibernate无论如何都为每个新线程打开了新的会话。

我怎样才能解决这个问题?我能以某种方式设置并发连接的插槽数吗?对于例如传递100个连接并让另外900个等待直到这100个将被关闭以进一步处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

使用连接池可以帮助解决这个问题。

以下是关于设置连接池Can you only have one hibernate session per thread in java?

的帖子
  

大多数人都使用连接池,比如可以使用的C3P0   确保会话重用并加快代码速度。

     

我使用的最佳结构是创建一个SessionFactory   应用程序启动,因为这会将连接池设置为   数据库。然后,利用单一模式来保持单一   SessionFactory,为您执行的每个事务请求新会话   来自单个SessionFactory。 Hibernate将利用底层   连接池,用于处理会话重用以实现速度和优化。

这是关于各种连接池库的另一篇文章。

  

默认情况下,Hibernate具有获取数据源的能力   通过设置来自JNDI的实现(javax.sql.DataSource)   属性适当

hibernate default connection pooling

答案 1 :(得分:2)

您可以使用&#39; ExecutorService&#39;管理1000个线程,限制只运行100个线程,其他线程将保留在队列中。

但是,我认为在你的应用中拥有这么多线程并不好。我假设您正在开发一个Web服务应用程序,并且可能同时有1000个请求进入,而旧的学校解决方案是创建1000个线程来处理它。但epoll会更好,你可以考虑一些NIO框架,如MINA / Netty。