我遇到的问题是,当使用NHibernate连接到Oracle11g数据库时,池中的旧连接没有被关闭。
我很确定所有NHibernate会话都已正确配置,但连接仍然处于INACTIVE
状态。我知道这将是因为连接池,但是在一段时间后它们应该被删除吗?如果不是,我怎么能配置这种情况。
我尝试将以下设置添加到我的连接字符串中:
Max Pool Size=10;
Connection Lifetime=120;
Incr Pool Size=1;
Decr Pool Size=10;`
这似乎停止了正在创建的连接数,我想因为这个增加的大小是1的增量,但是一旦连接被放回池中它们就永远不会被关闭。
我查看了v $ session表,其中一些LASST_CALL_ET
值高达786465或9天!!
我相当确定所有会话都在处理中,以下是代码示例:
public class DoSomethingToDb(ISessionFactory sessionFactory)
{
using (ISession session = sessionFactory.OpenSession())
{
session.Transaction.Begin();
//Do Stuff
session.Transaction.Commit();
}
}
如何设置我的程序/ NHibernate / Ado.Net / Oracle以关闭不再使用的连接。
我们正在测试的服务器昨天崩溃,因为有超过800个INACTVIE
连接而且不能再发布了。
答案 0 :(得分:1)
您遇到问题的原因是您的 Decr Pool Size 值过大。由于 Decr池大小与最大池大小相同,因此无法关闭所有连接,除非所有连接都可以关闭。
当我将此值设置为1时,永远需要释放未使用的连接。我目前将我的设置为5,并且每次减少之间的时间仍然相同,但它会立即释放更多。
Pooling=true;
Min Pool Size=0;
Max Pool Size=10;
Incr Pool Size=1;
Decr Pool Size=3;
此外,如果连接生命周期设置为120,则不会让任何会话开放超过2分钟。
答案 1 :(得分:0)
如果你能在hibernate中做到这一点会让我感到惊讶,因为我认为连接是泄漏的连接。由于某种原因,他们失去了控制,不会被重复使用。
您可以做的是在Oracle数据库的资源管理器中配置会话空闲超时。见Managing Resources with Oracle Database Resource Manager
确保为池池会话定义了资源使用者组,并且空闲超时足够大,不会意外中断正在运行的健康会话。
Oracle数据库资源管理器是一个非常灵活且功能强大的工具,可以通过多种方式帮助您的系统。
答案 2 :(得分:0)
似乎问题是由交易的使用引起的。从上面的代码中删除事务产生了以下内容:
public class DoSomethingToDb(ISessionFactory sessionFactory)
{
using (ISession session = sessionFactory.OpenSession())
{
//Do Stuff
session.Flush();
}
}
这似乎没有引起任何问题。