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.在池中的连接对象,如果过一段时间没有被访问则自动销毁