using System;

using System.Collections.Generic;

using System.Linq;
using System.Text;
using System.Reflection;
using System.Data.SqlClient;

namespace _10连接池2

{
class Program
{
static void Main(string[] args)
{
//string constr = "Data Source=zxtiger;Initial Catalog=itcastcn;Integrated Security=True";
//using (SqlConnection con = new SqlConnection(constr))
//{
// con.Open();
//}

//using (SqlConnection con1 = new SqlConnection(constr))

//{
// con1.Open();
//}

string constr = "Data Source=zxtiger;Initial Catalog=Itcastcn;Integrated Security=True;Pooling=false";

PropertyInfo pinfo = typeof(SqlConnection).GetProperty("InnerConnection", BindingFlags.NonPublic | BindingFlags.Instance);
SqlConnection con1 = new SqlConnection(constr);
object obj1 = null;
object obj2 = null;

using (con1)

{
con1.Open();
//获取con1内部的InnerConnection对象。
obj1 = pinfo.GetValue(con1, null);

#region MyRegion

同时打开两个相同的连接。
//SqlConnection con2 = new SqlConnection(constr);
//using (con2)
//{
// con2.Open();
// obj2 = pinfo.GetValue(con2, null);
// con2.Close();
//}
#endregion
con1.Close();
}

// 两次打开同一个连接
// string constr1 = "Data Source=zxtiger;Initial Catalog=Itcastcn;User ID=sa;Password=124;";
SqlConnection con2 = new SqlConnection(constr);
using (con2)
{
con2.Open();
//获取第二个对象的InnerConnection
obj2 = pinfo.GetValue(con2, null);
con2.Close();
}

if (obj1 == obj2)

{
Console.WriteLine("是同一个对象");
}
else
{
Console.WriteLine("不是同一个对象!");
}
Console.ReadKey();

}
}
}

1.第一次打开连接会创建一个连接对象。

2.当这个连接关闭时(调用Close()方法时)会将当期那连接对象放入池中
3.下一个连接对象,如果连接字符串与池中现有连接对象的
连接字符串完全一致,则会使用池中的现有连接,
而不会重新创建一个。
4.只有对象调用Close(),的时候才会放入池中,如果一个连接对象
一直在使用,则下次再创建一个连接对象发现池中没有,也会
再创建一个新连接对象
5.在池中的连接对象,如果过一段时间没有被访问则自动销毁