C# 在Oracle数据库连接丢失后恢复NHibernate

C# 在Oracle数据库连接丢失后恢复NHibernate,c#,sql,oracle,nhibernate,database-connection,C#,Sql,Oracle,Nhibernate,Database Connection,我有一个长期运行的应用程序,它使用NHibernate.ISessionFactory连接到Oracle数据库 有时数据库会脱机(例如周末维护),但即使数据库重新联机,后续查询也会失败,出现以下异常(也会显示内部异常): 重新启动应用程序可以恢复功能,但我希望应用程序能够通过“重置”连接,在不重新启动的情况下自动应对 当我遇到此异常时,我已尝试使用我的ISessionFactory执行以下操作: sf.EvictQueries(); sf.Close(); sf = null; sf = <

我有一个长期运行的应用程序,它使用
NHibernate.ISessionFactory
连接到Oracle数据库

有时数据库会脱机(例如周末维护),但即使数据库重新联机,后续查询也会失败,出现以下异常(也会显示内部异常):

重新启动应用程序可以恢复功能,但我希望应用程序能够通过“重置”连接,在不重新启动的情况下自动应对

当我遇到此异常时,我已尝试使用我的
ISessionFactory
执行以下操作:

sf.EvictQueries();
sf.Close();
sf = null;
sf = <create new session factory>
sf.executeQueries();
sf.Close();
sf=null;
sf=
但在重新创建
ISessionFactory
后,会看到相同的异常。我假设这是因为NHibernate正在某种连接池中缓存底层断开的连接

我如何说服NHibernate创建真正的新连接(甚至完全重置所有状态),从而允许我的应用程序在不重新启动应用程序的情况下自行修复连接问题

编辑:
在A_J的回答之后,请注意,我已经在为每个数据库请求使用(var session=\u sessionFactory.OpenSession())调用

我怀疑您正在启动时打开
ISession
(调用
ISessionFactory.OpenSession()
)并在应用程序结束时关闭它。对于任何长时间运行的应用程序来说,这都是错误的方法

您应该在较低的时间级别管理连接。在web应用程序中,这通常是按请求处理的。在你的情况下,你应该找到它应该是什么。如果您的windows服务在指定的时间后执行某些活动,则计时器滴答事件是一个好地方

我无法建议您的申请中的位置;你需要自己去发现

编辑1 看看你的编辑和评论,我不认为这与NHibernate有任何关系。可能是连接池正在向NHibernate返回断开连接/过时连接


参考并接受答案。

连接池是ADO.Net的责任,而不是NHibernate。我应该在问题中提到,我使用(var session=\u sessionFactory.OpenSession())调用
处理每个请求。因此,没有长时间运行的会话(据我所知),只有长时间运行的SessionFactory。谢谢-我将更新问题以澄清。谢谢链接。测试花了几天时间,因为我只是一夜之间失去了数据库连接。我注意到我的连接字符串有
最小池大小
,但没有
最大池大小
。通过阅读,我想如果我将
Max Pool Size
设置为N,那么第二天早上可能会进行N次(自动)重试,我会回到工作状态。然而,似乎将
Max Pool Size
设置为10实际上解决了这个问题——甚至不需要任何重试——第二天早上查询“正常工作”。我不明白这一点,所以我会在接下来的几天里关注它……但它似乎奏效了。
sf.EvictQueries();
sf.Close();
sf = null;
sf = <create new session factory>