【问题标题】:Oracle Connections from c#来自 c# 的 Oracle 连接
【发布时间】:2017-11-30 23:39:21
【问题描述】:

我有动态仪表板,每 3 秒有 20 个从 oracle 到 c# winforms 的查询。

目前我使用如下;

OracleConnection con = new OracleConnection(oradb);
con.Open();
OracleCommand cmd1 = new OracleCommand(getSystime, con);
OracleDataReader dr1 = cmd1.ExecuteReader();
dr1.Read();
.
.
.
.
.
.
OracleCommand cmd15 = new OracleCommand(getSqltime, con);
OracleDataReader dr15 = cmd15.ExecuteReader();
dr15.Read();

con.Dispose();
con.Close();

目前,当我检查时,该应用程序有 9 个非活动会话,并且大约有 100 个打开的光标。数字没有增加。即使我在 1 小时后检查,我的应用程序中有 9 个活动/非活动和近 100 个 open_cursor。

这将是我的第一个应用程序,所以我没有任何经验。

我该如何解释它?

【问题讨论】:

  • 我猜 OracleCommand 实现了 IDisposable 接口,它允许你将代码包装在 using 语句中,然后你确定它会在它完成后被释放
  • @WernfriedDomscheit 你能不能用我上面的代码写一个答案,我可以接受

标签: c# .net oracle winforms


【解决方案1】:

不确定我是否理解您的问题,但 尝试使用

OracleDataAdapter

而不是

OracleDataReader

我的理解是DataReader比DataAdapter快,但是DataReader工作在连接模式。 DataAdapter/DataSet 在断开模式下工作。

这可能是您在一段时间后没有收到查询的原因。

【讨论】:

    【解决方案2】:

    阅读完内容后,您应该始终Close()OracleDataReader。并用using {} 包围它,因为它实现了IDisposable

    using ( OracleConnection con = new OracleConnection(oradb) ) {
       con.Open();
       OracleCommand cmd1 = new OracleCommand(getSystime, con);
       using ( OracleDataReader dr1 = cmd1.ExecuteReader() ) {
          dr1.Read();
          ...
          dr1.Close();
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多