我有一个长时间运行的应用程序,使用NHibernate.ISessionFactory
连接到Oracle数据库。
偶尔会出现数据库离线的情况(例如周末维护),但即使数据库恢复在线,后续查询仍会失败,并显示以下异常(也显示内部异常):
NHibernate.Exceptions.GenericADOException: could not execute query
[ select .....]
>> Oracle.ManagedDataAccess.Client.OracleException: ORA-03135: Connection lost contact
>> OracleInternal.Network.NetworkException: ORA-03135: Connection lost contact
>> System.Net.Sockets.SocketException: An established connection
was aborted by the software in your host machine
重新启动应用程序可以恢复功能,但我希望应用程序能够在不重启的情况下自动适应,并"重置"连接。当遇到此异常时,我已尝试使用我的ISessionFactory尝试以下操作:
sf.EvictQueries();
sf.Close();
sf = null;
sf = <create new session factory>
在重新创建ISessionFactory
后仍然看到相同的异常。我认为这是因为NHibernate在某种连接池中缓存了底层损坏的连接?
如何说服NHibernate创建一个真正新的连接(或者甚至只是完全重置所有状态),从而允许我的应用程序自行修复连接问题,而无需重新启动应用程序?
编辑:
根据A_J的答案,请注意我已经为每个数据库请求调用using(var session = _sessionFactory.OpenSession())
。