C#如何“;验证”;新连接实际上是从连接池中重新使用的

本文关键字:连接 新使用 实际上 验证 如何 新连接 | 更新日期: 2023-09-27 18:21:28

我有一个简单的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相关的答案是首选的。

在我的"连接"对象中是否有任何数据member,或者在哪里我可以真正看到池中有多少未使用的连接,以及我的应用程序使用了多少。

提前感谢。。。

C#如何“;验证”;新连接实际上是从连接池中重新使用的

"我如何确保我的新连接来自连接池,并且它没有命中数据库"

这是一个有点错误的逻辑。连接池位于客户端。即使重用池中的连接,任何命令都必须访问数据库。

如果恰好具有相同的连接字符串(甚至大小写),则您将重用池中的连接(前提是它已打开,这是默认设置)。

连接池存在的原因是,设置连接需要一些开销。

SQL Server连接池:

连接到数据库服务器通常包括几个耗时的步骤。物理通道,如套接字或命名的管道必须建立,与服务器的初始握手必须发生时,必须解析连接字符串信息连接必须由服务器进行身份验证,必须对在当前事务中登记,等等。

在实践中,大多数应用程序只使用一种或几种不同的连接的配置。这意味着在应用过程中执行时,许多相同的连接将被重复打开关闭为了最大限度地降低打开连接的成本,ADO.NET使用称为连接池的优化技术。

连接池减少了新连接的次数必须打开。池友保留实体的所有权联系它通过保持一组活动状态来管理连接每个给定连接配置的连接。每当用户在连接时调用Open,池友会查找可用的池中的连接。如果池连接可用将其返回给调用者,而不是打开新的连接。当应用程序在连接上调用Close,pooler将其返回活动连接的池集,而不是关闭它连接返回到池中,就可以在下一个Open call。

只有具有相同配置的连接才能被池化。ADO.NET同时保留多个池,每个配置一个池。连接按连接字符串和使用集成安全时的Windows标识。连接是也根据它们是否被登记在事务中进行池化。

您可以查看ADO.net性能计数器,以确保只有一次活动的数据库连接

您可以在函数中使用定时来添加和删除连接字符串this:

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;
}