其实我们一直在使用SqlServer的连接池。在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用。

  与连接池相关的两个重要参数是 Min Pool Size和 Max Pool Size ,分别是池中的最小连接数和池中的最大连接数,默认值分别是0和100。

  在我们创建一个连接的实例,并调用Open()方法时,连接池管理程序会在连接池中找到一个可用的连接;当调用Close()方法时,连接池管理程序又将连接返回到连接池中,以供下一次调用Open()方法时使用。

  另外,连接字符串中的 Connection Lifetime 为连接池中的连接设置了生命周期。它的默认值为0。当连接被返回到池时,将其创建时间与当前时间作比较,如果时间长度(以秒为单位)超出了由 Connection Lifetime 指定的值,该连接就会被销毁。 这在聚集配置中很有用(用于强制执行运行中的服务器和刚置于联机状态的服务器之间的负载平衡)。零(0)值将使连接池具有最大的连接超时。


代码如下:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data;
namespace IEnumrator
{
    /// <summary>
    /// 数据库连接池类
    /// </summary>
    public class DBConnectionPool
    {
        #region 连接池属性
        //1最大连接数
        private static int _MaxCount=Convert.ToInt32(ConfigurationManager.AppSettings["MaxCount"]);
        //2最小连接数
        private static int _MinCount = Convert.ToInt32(ConfigurationManager.AppSettings["MinCount"]);
        //3异步访问数据库
        private static bool _Asyn_Process = Convert.ToBoolean(ConfigurationManager.AppSettings["Asyn_Process"]);
        //4在单个连接上得到和管理多个、仅向前引用和只读的结果集(ADO.NET2.0) 
        private static bool _Mars = Convert.ToBoolean(ConfigurationManager.AppSettings["Mars"]);
        //5等待时间
        private static int _TimeOut = Convert.ToInt32(ConfigurationManager.AppSettings["TimeOut"]);
        //6连接生命周期
        private static int _LifeTime = Convert.ToInt32(ConfigurationManager.AppSettings["LifeTime"]);
        //7数据库连接服务器
        private static string server = ConfigurationManager.AppSettings["Server"];
       //8数据库实例
        private static string database = ConfigurationManager.AppSettings["Database"];

        //连接对象
        private SqlConnection conn = null;
        #endregion
        public DBConnectionPool()
        {
            conn = new SqlConnection(GetConnectionString());
        }
        public DBConnectionPool(string connectionstring)
        {
           
            conn = new SqlConnection(connectionstring);
        }
        
        /// <summary>
        /// 构造连接字符串
        /// </summary>
        /// <returns>连接字符串</returns>
        private static string GetConnectionString()
        {
            return "Data Source=" + server
                 + ";Integrated Security=true;"
                 + "database=" + database
                 + ";Max Pool Size=" + _MaxCount
                 + ";Min Pool Size=" + _MinCount
                 + ";Connect Timeout=" + _TimeOut
                 + ";Connection Lifetime=" + _LifeTime
                 + ";Asynchronous Processing=" + _Asyn_Process + ";"; 
                //+ "MultipleActiveResultSets=" + _Mars + ";"; 
        }

        public DataSet getDataSet(String query_sql)
        {
            DataSet ds =new DataSet();
            SqlDataAdapter adapter = null;
            if(conn.State==ConnectionState.Closed)
                conn.Open();
            try{
                adapter = new SqlDataAdapter(query_sql, conn);
                adapter.Fill(ds);
            }
            catch(SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                //释放资源
                conn.Close();
            }
            return ds;
        }
    }
}


app.config配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
    </startup>
    <appSettings>
      <add key="Server" value="localhost"/>
      <add key="Database" value="Student"/>
      <add key="User" value="sa"/>
      <add key="Password" value="123456"/>
      <add key="LifeTime" value="15"/>
      <add key="TimeOut" value="15"/>
      <add key="Mars" value="true"/>
      <add key="Asyn_Process" value="true"/>
      <add key="MinCount" value="3"/>
      <add key="MaxCount" value="10"/>
    </appSettings>
</configuration>


测试

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IEnumrator
{
    /// <summary>
    /// 学生实体类
    /// </summary>
    class Student
    {
        public string Stuno { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public string Phone { get; set; }
        public string Addr { get; set; }
        public DateTime Register_Time { get; set; }
    }
}


 class Program
    {
        /// <summary>
        /// 测试IEnumeration
        /// </summary>
        /// <param name="args"></param>
        private static string connstring = ConfigurationManager.AppSettings["SQLServer2005"];
        static void Main(string[] args)
        {
            //获得数据库数据
            string sql = "select * from student;";
           
            DBConnectionPool conn = new DBConnectionPool();
            DataSet ds = conn.getDataSet(sql);
            //封装成List<T>
            List<Student> list = new List<Student>();

            
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                Student student = new Student();
                student.Stuno = row["Stuno"].ToString();
                student.Name = row["Name"].ToString();
                student.Sex = row["Sex"].ToString();
                student.Age = Convert.ToInt32(row["Age"].ToString());
                student.Phone = row["Phone"].ToString();
                student.Addr = row["Addr"].ToString();
                student.Register_Time = Convert.ToDateTime(row["Register_Time"]);
                list.Add(student);
            }

            IEnumerator<Student> IEStu = list.GetEnumerator();
            Student s = new Student();
            while(IEStu.MoveNext())
            {
                s=IEStu.Current as Student;
                Console.WriteLine("[{0}] [{1}] [{2}] [{3}] [{4}] [{5}] [{6}]", s.Stuno, s.Name, s.Sex, s.Age, s.Phone, s.Addr, s.Register_Time);
            }

        }
    }


SQL Server 连接池参数说明如下:

         关键字      默认值           说明
Application Name不可用应用程序的名称,或者“.Net SqlClient Data Provider”(如果不提供应用程序名称)。
Async'false'如果设置为 true,则启用异步操作支持。 可识别的值为 true、 false、 yes 和 no

AttachDBFilename

- 或 -

extended properties

- 或 -

Initial File Name




   不可用

主数据库文件的名称,包括可连接数据库的完整路径名。只有具有 .mdf 扩展名的主数据文件才支持 AttachDBFilename。

如果主数据文件为只读,则附加操作将失败。

该路经可以是绝对路径,也可以是相对路径,这取决于是否使用 DataDirectory 替换字符串。如果使用 DataDirectory,则对应的数据库文件必须存在于替换字符串指向的目录的子目录中。

说明

远程服务器、HTTP 及 UNC 路径名不受支持。

必须按照如下方式使用关键字“database”(或其别名之一)指定数据库名称:

"AttachDbFileName=|DataDirectory|\data\YourDB.mdf;integrated security=true;database=YourDatabase"

如果数据文件所在的目录中存在日志文件,并且在附加主数据文件时使用了“database”关键字,则会生成错误。这种情况下,请移除日志文件。附加了数据库后,系统将根据物理路径自动生成一个新的日志文件。

Connect Timeout

- 或 -

Connection Timeout

15在终止尝试并产生错误之前,等待与服务器的连接的时间长度(以秒为单位)。
Context Connection'false'如果应对 SQL Server 进行进程内连接,则为 true
Current Language不可用SQL Server 语言记录名称。

数据源

- 或 -

服务器

- 或 -

地址

- 或 -

Addr

- 或 -

Network Addres


数据源

- 或 -

服务器

- 或 -

地址

- 或 -

Addr

- 或 -

Network Addres

要连接的 SQL Server 实例的名称或网络地址。可以在服务器名称之后指定端口号:

server=tcp:servername, portnumber

指定本地实例时,始终使用 (local)。若要强制使用某个协议,请添加下列前缀之一:

np:(local), tcp:(local), lpc:(local)

说明

ADO.NET 2.0 不支持在 SQL Server 2000 或更低版本的共享内存上执行异步命令。但是,可以强制用 TCP 代替共享内存,方法是:向连接字符串中的服务器名称添加“tcp:”前缀,或者使用“本地主机”。

Encrypt'false'当该值为 true 时,如果服务器端安装了证书,则 SQL Server 将对所有在客户端和服务器之间传送的数据使用 SSL 加密。 可识别的值为true、 false、 yes 和 no

Initial Catalog

- 或 -

数据库

不可用数据库的名称
Failover Partner不可用

在其中配置数据库镜像的故障转移合作伙伴服务器的名称。

.NET Framework 1.0 或 1.1 版不支持 Failover Partner 关键字。

Enlist'true'true 表明 SQL Server 连接池程序在创建线程的当前事务上下文中自动登记连接。

Integrated Security

- 或 -

Trusted_Connection

false

当为 false 时,将在连接中指定用户 ID 和密码。 当为 true 时,将使用当前的 Windows 帐户凭据进行身份验证。

可识别的值为 true、 false、 yes、 no 以及与 true 等效的 sspi(强烈推荐)。

如果指定了用户 ID 和密码,且集成安全性设置为 true,则用户 ID 和密码将被忽略,并使用集成安全性

MultipleActiveResultSetsfalse

如果为 true,则应用程序可以维护多活动结果集 (MARS)。 如果为 false,则应用程序必须在执行该连接上的任何其他批处理之前处理或取消一个批处理中的多个结果集。

可识别的值为 true 和 false

.NET Framework 1.0 或 1.1 版不支持该关键字。

Network Library

- 或 -

Net

'dbmssocn'

用于建立与 SQL Server 实例的连接的网络库。支持的值包括:

dbnmpntw(命名管道)

dbmsrpcn(多协议,Windows RPC)

dbmsadsn (Apple Talk)

dbmsgnet (VIA)

dbmslpcn(共享内存)

dbmsspxn (IPX/SPX)

dbmssocn (TCP/IP)

Dbmsvinn (Banyan Vines)

相应的网络 DLL 必须安装在要连接的系统上。如果您不指定网络,且使用本地服务器(例如“.”或 "(本地)"),使用共享内存。在此示例中,网络库为 Win32 Winsock TCP/IP (dbmssocn),使用的端口为 1433。

 

以带有颜色区分的格式查看复制到剪贴板打印

Network Library=dbmssocn;Data Source=000.000.000.000,1433;
Network Library=dbmssocn;Data Source=000.000.000.000,1433;
Packet Size8192用来与 SQL Server 的实例进行通信的网络数据包的大小,以字节为单位。

Password

- 或 -

Pwd

不可用SQL Server 帐户登录的密码。建议不要使用。为保持高安全级别,我们强烈建议您使用 Integrated Security 或 Trusted_Connection 关键字
Persist Security Infofalse当该值设置为 false 或 no(强烈推荐)时,如果连接是打开的或者一直处于打开状态,那么安全敏感信息(如密码)将不会作为连接的一部分返回。 重置连接字符串将重置包括密码在内的所有连接字符串值。可识别的值为 true、 false、 yes 和 no
计划不可用指定连接计划。如果以下项也在连接字符串中指定,则将引发 ArgumentException:failover partner、AttachDbFileName、UserInstance=true 或 contextConnection=true。
复制FALSE如果使用连接来支持复制,则为 true
Transaction BindingImplicit Unbind

控制与登记的 System.Transactions 事务关联的连接。

可能的值包括:

Transaction Binding=Implicit Unbind;

Transaction Binding=Explicit Unbind;

Implicit Unbind 可使连接在事务结束时从事务中分离。分离后,连接上的其他请求将以自动提交模式执行。在事务处于活动状态的情况下执行请求时,不会检查 System.Transactions.Transaction.Current 属性。 事务结束后,其他请求将以自动提交模式执行。

Explicit Unbind 可使连接保持连接到事务,直到连接关闭或调用显式 SqlConnection.TransactionEnlist(null)。 如果Transaction.Current 不是登记的事务或登记的事务未处于活动状态,则引发 InvalidOperationException

TrustServerCertificate‘false'如果设置为 true,则使用 SSL 对通道进行加密,但不通过证书链对可信度进行验证。 如果将 TrustServerCertificate 设置为 true 并将 Encrypt 设置为 false,则不对通道进行加密。 可识别的值为 true、 false、 yes 和 no。 有关更多信息,请参见 连接字符串语法 (ADO.NET)
Type System Version不可用

指示应用程序期望的类型系统的字符串值。可能的值包括:

Type System Version=SQL Server 2000;

Type System Version=SQL Server 2005;

Type System Version=SQL Server 2008;

Type System Version=Latest;

如果设置为 SQL Server 2000,将使用 SQL Server 2000 类型系统。 与 SQL Server 2005 实例连接时,执行下列转换:

XML to NTEXT

UDT to VARBINARY

VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 分别与 TEXT、NEXT 和 IMAGE。

如果设置为 SQL Server 2005,将使用 SQL Server 2005 类型系统。 对 ADO.NET 的当前版本不进行任何转换。

如果设置为 Latest,将使用此客户端-服务器对无法处理的最新版本。 这个最新版本将随着客户端和服务器组件的升级自动更新。

用户 ID不可用SQL Server 登录帐户。建议不要使用。为保持高安全级别,我们强烈建议您使用 Integrated Security 或 Trusted_Connection 关键字。
User Instance'false'一个值,用于指示是否将连接从默认的 SQL Server Express 实例重定向到调用方帐户下运行的运行时启动的实例。
Workstation ID本地计算机名称连接到 SQL Server 的工作站的名称。