.net 如何测试OracleConnection是否为;未连接到Oracle;?

.net 如何测试OracleConnection是否为;未连接到Oracle;?,.net,windows,oracle,odp.net,.net,Windows,Oracle,Odp.net,我们正在编写一个通过ODP.Net在Oracle队列上等待的服务。我们正试图最好地处理会话或网络中断 如果我终止会话,队列上的等待将返回“通信通道上的EOF”,从那时起,所有使用连接的尝试都会出现“未连接到Oracle”异常 是否有一种简单的方法来测试如果使用该连接,是否会给出“未连接到Oracle”?注意:(connection.State==ConnectionState.Open)返回true,即使该连接未连接到Oracle 提前谢谢- sh-决定将我最后的评论作为答案。如果有人有更好的选

我们正在编写一个通过ODP.Net在Oracle队列上等待的服务。我们正试图最好地处理会话或网络中断

如果我终止会话,队列上的等待将返回“通信通道上的EOF”,从那时起,所有使用连接的尝试都会出现“未连接到Oracle”异常

是否有一种简单的方法来测试如果使用该连接,是否会给出“未连接到Oracle”?注意:(connection.State==ConnectionState.Open)返回true,即使该连接未连接到Oracle

提前谢谢-


sh-

决定将我最后的评论作为答案。如果有人有更好的选择,我很乐意听到

我执行这些测试以确定最便宜的“ping”查询:

  • 使用ExecuteScalar从dual中选择*
  • 使用ExecuteOnQuery从dual中选择*
  • 使用ExecuteScalar从dual中选择sysdate
  • 使用ExecuteOnQuery从dual中选择sysdate
  • 我每次迭代1000次,并运行了4次

    结果:它们都差不多。在我的系统上,大约每秒8.5次迭代(太糟糕了)。我认为数据库性能是目前为止最具决定性的因素,因此使用ExecuteScalar或ExecuteOnQuery(甚至ExecuteReader)可能不会影响性能


    我还尝试了“从双精度中选择0”,结果相同。

    运行
    select*from-dual
    查询并检查它是否引发任何异常。好的-建议不错。你知道这是否是最有效的方法吗?我们在一个紧密的循环中运行,将定期执行此操作,并且它将在99.9%以上的时间内返回成功,因此高效地执行此操作非常重要。大多数连接池实现使用该方法通过一些简单的查询来“ping”数据库,以检查连接是否仍处于活动状态,如果没有-则使连接无效并重新连接。另一个想法:-您可以使用标准API检索一些数据库元数据,如果连接断开,则调用会抛出错误。如果启用“验证连接字符串”选项,ODP.NET连接池本身将执行SELECT SYSDATE from DUAL。您是否考虑过让连接池为您完成这项工作?我不使用连接池,因为我总是有一个活动会话在Oracle队列上等待(这是系统服务)。如果会话丢失,则此等待通常返回“通信信道上的EOF”。我想只要我得到EOF,我就可以关闭连接,如果它关闭了,我可以在处理循环的顶部重新打开它。我想我刚刚回答了我自己的问题——一个良好的睡眠对你有多么大的好处;或者类似的东西。我自己没有试过。