【问题标题】:c# / oracle: open/close connectionc#/oracle:打开/关闭连接
【发布时间】:2012-09-19 05:58:48
【问题描述】:

我需要有关数据库连接和我的 winapp 的帮助。

我有一个 Windows 应用程序 (C#),在我登录后,它开始在 Oracle 数据库中运行 5 或 6 个不同的查询,每 5-10 秒一次。应用程序是 24/7。

这样做的正确方法是什么? 我应该在登录期间打开连接并且在关闭应用程序之前永远不要关闭它,还是应该在每次运行查询时打开和关闭连接? 例如:

//first query
conn.Open();
DataSet ds1 = new DataSet();

string sql = "SELECT * FROM table1";

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.CommandType = CommandType.Text;
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(ds1, "Result1");
conn.Dispose();

return ds1;

//second query    
conn.Open();
DataSet ds2 = new DataSet();

string sql = "SELECT * FROM table2";

OracleCommand cmd = new OracleCommand(sql, conn);
cmd.CommandType = CommandType.Text;
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.Fill(ds2, "Result2");
conn.Dispose();

return ds2;

最好的方法是什么?

【问题讨论】:

  • 你能告诉我们连接池是否打开。这将决定最终的解决方案。
  • 它已启用 - 我相信 ODT 中的默认设置。

标签: c# winforms oracle


【解决方案1】:

您在应用程序中使用的 Oracle OleDB 提供程序实现了池化。因此,当您创建和关闭连接时,您只需从“真实连接”池中获取/释放连接。

这使得创建和处理 Connection 对象成为一项非常便宜的操作。如果我是你,我会打开一个连接,执行我的一批查询,并在我完成并进入睡眠状态(即使是几秒钟)后关闭+释放该连接。

【讨论】:

  • 只有在你打开它的情况下。我不相信它是默认的
  • 应该是这样,除非您有充分的理由不这样做。他没有提到这一点。
  • 这就是我要使用的。我也是使用block实现的,所以不用担心conn.open / conn.dispose...
【解决方案2】:

当然,另一种选择是为每个“批次”查询建立一个连接

但是,如果您经常访问数据库,那么听起来您需要在应用程序期间建立永久连接。

我当然认为您的示例只是示例,您实际上并没有使用原始 SQL 访问数据库。

【讨论】:

    【解决方案3】:

    我建议你使用using 阻止clean 你的non managed object

    using(var connection = new OracleConnection("..."))
    {
     .....
    
    }
    

    注意:在处理结束时对您的对象使用执行处置

    链接:http://msdn.microsoft.com/fr-fr/library/yh598w02(v=vs.80).aspx

    【讨论】:

    • 是的,我可以使用块来实现,但是,如果我错了,请纠正我,每次都会打开和关闭连接。问题是,如果我每隔几秒钟做一次,这有多聪明?
    • @Alex 您创建连接对象并在查询结束时进行清理,以优化您对连接池的管理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多