【问题标题】:How to disable connection pool?如何禁用连接池?
【发布时间】:2015-12-26 18:24:33
【问题描述】:

我的应用程序用来连接数据库的连接字符串如下:

    private const string oradb = "Data Source=(DESCRIPTION=(ADDRESS_LIST="
                    + "(ADDRESS=(PROTOCOL=TCP)(HOST=host.name)(PORT=1521)))"
                    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=service.name)));"
                    + "User Id=myusername;Password=mypass;";

在我的应用程序的所有数据库访问点中,我使用以下模式:

        OracleConnection conn = new OracleConnection(oradb);

        try
        {
            Console.WriteLine("Opening DB Connection...");
            conn.Open();

            string queryString = string.Format(@"SELECT ...");

            using (OracleCommand command = new OracleCommand(queryString, conn))
            {
                using (OracleDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                     ...
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception occured during DB access: {0}", e.Message);
            dbr.Error = e.Message;
        }
        finally
        {
            Console.WriteLine("Closing DB connection");
            conn.Close();
            conn.Dispose();
        }

确保我正确处理异常并在 try/catch/finally 关闭和处置连接对象。但是,我经常收到我正在举行 oracle 会话的 oracle 服务消息。此外,如果我只是让我的应用程序打开并在第二天尝试进行操作,我第一次收到ora-12537 network session end of file 异常,然后第二次尝试正在经历。经过一番阅读,看起来我必须禁用连接池。如果这是解决的正确方法,如何禁用池?如果不是,那么还有什么可能是错的?

【问题讨论】:

  • 不完全符合您的要求,但是....OracleConnection.ClearPool(conn);
  • 我必须在哪里做?我可以在连接字符串中指定根本不使用池吗?
  • 不知道,因此评论,而不是答案。我想你可以在Close()之后清空池子
  • 附注:当OracleConnection(即DbConnection)实现IDisposable时,您可以使用using模式,而不是在CloseDispose中调用finally块。
  • @Micke:它会吞下异常,我不会有关于它们的信息,对吧?

标签: c# oracle odp.net


【解决方案1】:

您可以在连接字符串中添加Pooling=False,但这意味着每次都会创建一个新连接。

+ "User Id=myusername;Password=mypass;Pooling=False;";

看看这个article,它可能对您的问题有所帮助。另外,看看这个网站页面,特别是Using Connection Pooling 部分

【讨论】:

  • 没有办法使用池并避免在服务器上留下打开的会话,对吧?
  • @Pablo 服务器上有哪些打开的会话?连接池没有任何问题,实际上它通过重用连接减少会话。连接池是最重要的可扩展性机制之一。你确定你没有试图解决错误的问题吗?
  • 我收到了来自 oracle 的自动电子邮件,告诉我我正在举行一个会话。但是,我所有的交易都发生在几秒钟内,以关闭/处理连接结束。
  • 您是否通过打开/关闭连接来破坏数据库?
  • @christiandev:我带来了一个“模板”的 sn-p,我在原始帖子中如何打开/关闭连接。
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多