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

C# C“如何”;核实;新连接实际上是从连接池中重新使用的,c#,database,connection,odbc,pooling,C#,Database,Connection,Odbc,Pooling,我有一个简单的c#代码,在其中我尝试多次打开和关闭连接。我如何确保我的新连接来自连接池,并且不会影响数据库 using System; using System.Data; using System.Data.Odbc; using System.Collections.Generic; namespace LBSService { class MyClass { public static OdbcConnection connection = null;

我有一个简单的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();
            }
        }
    }
}
使用系统;
使用系统数据;
使用System.Data.Odbc;
使用System.Collections.Generic;
名称空间LBSService
{
类MyClass{
公共静态OdbcConnection=null;
公共void TestConnection()
{
字符串连接字符串=@“Dsn=my_database.IServer;Host=IServer;
数据库=我的数据库;Uid=informix;
Pwd=Some@123";

对于(int i=1;i您可以在函数中使用计时来添加和删除连接字符串,如下所示:

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;

}
公共长测试连接(bool-usepooling)
{
字符串连接字符串=@“Dsn=my_database.IServer;Host=IServer;
数据库=我的数据库;Uid=informix;
Pwd=Some@123;Pooling=“+usepooling.ToString;
秒表sw=新秒表();
对于(int i=1;i
“我如何确保我的新连接来自连接
并且它没有命中数据库“

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

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

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

:

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

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

连接池减少了创建新连接的次数 必须打开。池程序保留物理池的所有权 连接。它通过保持一组活动连接处于活动状态来管理连接 每个给定连接配置的连接。每当用户 调用打开连接时,池处理程序将查找可用的 池中的连接。如果池连接可用,则 将其返回给调用方,而不是打开新连接 应用程序在连接上调用Close,池程序将其返回给 活动连接的池集,而不是关闭它 连接返回到池中,即可在 下一个开放电话

只有具有相同配置的连接才能被池化。ADO.NET 同时保留多个池,每个配置一个池。 连接通过连接字符串和 使用集成安全性时的Windows标识。连接为 也基于他们是否在事务中登记而合并


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