【问题标题】:C# How to "verify" that new connections are actually getting reused from connection poolC#如何“验证”新连接实际上是从连接池中重用的
【发布时间】:2012-01-25 12:43:51
【问题描述】:

我有一个简单的 C# 代码,我试图在其中多次打开和关闭连接。如何确保我的新连接来自连接池并且不会访问数据库?

using System;
using System.Data;
using System.Data.Odbc;
using System.Collections.Generic;

namespace LBSService
{
    class MyClass    {
        public static OdbcConnection connection = null;       
        public void TestConnection()
        {
            string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                        Database=my_database;Uid=informix;
                                        Pwd=Some@123";

            for (int i = 1; i <= 50; i++)
            {
                string StrQuery = "select * from capture_files";
                connection = new OdbcConnection(connectionstring);
                connection.Open();
                connection.Close();
            }
        }
    }
}

我有必须打开 ODBC 连接的限制,因此首选与 ODBC 相关的答案。

我的“连接”对象中是否有任何数据成员,或者我可以实际看到池中有多少未使用的连接以及我的应用程序使用了多少。

提前谢谢...

【问题讨论】:

    标签: c# database connection odbc pooling


    【解决方案1】:

    “我怎样才能确保我的新连接来自连接 池并且它没有访问数据库”

    这是一个稍微错误的逻辑。连接池位于客户端。即使您重用池中的连接,任何命令仍然需要访问数据库。

    如果您有完全相同相同的连接字符串(甚至大小写),那么您将重用池中的连接(前提是它已打开,即默认)。

    连接池存在的原因是因为建立连接需要一些开销。

    SQL Server Connection Pooling:

    连接到数据库服务器通常包括几个 耗时的步骤。物理通道,例如套接字或命名 管道必须建立,与服务器的初始握手必须 发生时,必须解析连接字符串信息, 连接必须由服务器验证,必须运行检查 加入当前事务,依此类推。

    实际上,大多数应用程序只使用一种或几种不同的 连接的配置。这意味着在申请期间 执行时,将重复打开许多相同的连接,并且 关闭。为了最小化打开连接的成本,ADO.NET 使用 称为连接池的优化技术。

    连接池减少了新连接的次数 必须打开。池子保持物理的所有权 联系。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当用户 在连接上调用 Open,池化程序会寻找可用的 池中的连接。如果一个池连接可用,它 将其返回给调用者,而不是打开新连接。当。。。的时候 应用程序在连接上调用 Close,pooler 将其返回给 池化的活动连接集,而不是关闭它。一旦 连接被返回到池中,它已准备好在 下一次公开通话。

    只有具有相同配置的连接才能被池化。网络 同时保留多个池,每个配置一个。 连接由连接字符串分隔到池中,并由 使用集成安全性时的 Windows 标识。连接是 还根据它们是否参与交易进行汇总。

    【讨论】:

      【解决方案2】:

      您可以查看 ADO.net Performancecounters 以确保只有一次活动的数据库连接

      【讨论】:

        【解决方案3】:

        你可以在你的函数中使用计时来添加和删除连接字符串:

        Pooling=false;
        

        如果时间不同 - 没有这个字符串的连接会被重用

        像这样:

        public long TestConnection(bool usepooling)
        {
          string connectionstring = @"Dsn=my_database.IServer;Host=IServer;
                                            Database=my_database;Uid=informix;
                                            Pwd=Some@123;Pooling="+usepooling.ToString;
        
        
          Stopwatch sw = new Stopwatch();
          for (int i = 1; i <= 50; i++)
          {
            string StrQuery = "select * from capture_files";
            connection = new OdbcConnection(connectionstring);
            sw.Start();
            connection.Open();
            connection.Close();
            sw.Stop();
          }
        
          return sw.ElapsedMilliseconds;
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-05-07
          • 2021-09-18
          • 2010-11-08
          • 2015-12-17
          • 2011-03-06
          • 1970-01-01
          • 2013-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多