Jus*_*tin 2 .net oracle connection session wcf
我有一个WinForms应用程序,当它第一次启动时,首先创建一个OracleConnection,然后调用一个将记录写入user_session表的存储过程.OracleConnection是一个故意永远不会被处理的类的静态成员,因为我们希望连接在应用程序的生命周期中存在.从本质上讲,这个想法是在任何时候跟踪谁在使用该应用程序.当应用程序关闭时,它会调用另一个存储过程从user_session表中删除该记录.
这一切都运行良好,但我们想要迎合应用程序崩溃的罕见(?)场合,并且我们的user_session表中的记录不会被清除.为此,我们有另一个存储过程来检查Oracle v $会话视图中存在哪些会话,如果它在user_session中找到v $ session中不存在的会话,则会清除user_session中的记录.这似乎也很好用.
但是现在,我们有一个新的WCF服务,托管在IIS 6.它还具有与WinForms应用程序相同的启动逻辑 - 它创建OracleConnection并且在服务关闭之前不会处理它.
但由于某种原因,这项服务在v $ session中的记录正在消失.这种情况相当随机发生,但是经常发生(通常在服务运行几个小时后).这会导致我们的存储过程从user_sessions表中清除服务的会话,而不应该这样,我正在尝试修复它.
所以,关于我的问题:OracleConnections最终会超时,也许是因为它们闲置太久了?如果是这样,这次超时配置在哪里?如果没有,为什么我的会话会从v $ session中删除?
我原以为如果没有处理OracleConnection,那么会话(在v $ session中)会无限期地挂起(或直到进程被关闭/终止).这似乎是WinForms应用程序中的工作方式.但这并不是我们在WCF服务方面的经验:正如我已经解释过的那样,尽管OracleConnection仍然处于打开状态,但会话才会消失.(我已经尝试过监听StateChange事件,如果由于某种原因OracleConnection被关闭,但事件永远不会触发,所以连接肯定仍然是打开的.我们还配置了IIS以不终止空闲进程,所以它是不喜欢在我们不知情的情况下关闭服务.)
提前致谢.
如果您提到您使用的oracle rdbms版本,它
会有所帮助.... 此外,网络情况也会产生影响.是否正在使用防火墙?
有几个原因可以清除空闲连接:
默认情况下不启用2和3.如果是,请相应更改.
对于1,您首先要知道防火墙是否到位.如果是这样,您可以启用死客户端检测.这应该在服务器上完成,它会定期ping到客户端以查看它是否仍然存在.
罗纳德,我希望这会有所帮助