在我的独立应用程序中,一次生成超过1000个线程,每个线程都拥有自己的Hibernate会话。但在这种情况下,会话数量会超过引发错误的数据库最大连接限制。
我试图设置.getCurrentSession()
而不是.openSession()
,但它没有带来任何影响,因为Hibernate无论如何都为每个新线程打开了新的会话。
我怎样才能解决这个问题?我能以某种方式设置并发连接的插槽数吗?对于例如传递100个连接并让另外900个等待直到这100个将被关闭以进一步处理它?</ p>
答案 0 :(得分:3)
使用连接池可以帮助解决这个问题。
以下是关于设置连接池Can you only have one hibernate session per thread in java?
的帖子大多数人都使用连接池,比如可以使用的C3P0 确保会话重用并加快代码速度。
我使用的最佳结构是创建一个SessionFactory 应用程序启动,因为这会将连接池设置为 数据库。然后,利用单一模式来保持单一 SessionFactory,为您执行的每个事务请求新会话 来自单个SessionFactory。 Hibernate将利用底层 连接池,用于处理会话重用以实现速度和优化。
这是关于各种连接池库的另一篇文章。
默认情况下,Hibernate具有获取数据源的能力 通过设置来自JNDI的实现(javax.sql.DataSource) 属性适当
答案 1 :(得分:2)
您可以使用&#39; ExecutorService&#39;管理1000个线程,限制只运行100个线程,其他线程将保留在队列中。
但是,我认为在你的应用中拥有这么多线程并不好。我假设您正在开发一个Web服务应用程序,并且可能同时有1000个请求进入,而旧的学校解决方案是创建1000个线程来处理它。但epoll会更好,你可以考虑一些NIO框架,如MINA / Netty。