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