C#连接池
查阅了一天的资料来学习MySql数据库连接池,终于在一篇博文上找到了,自己也整理了一下,希望对大家有用处
1. 建立连接池
1 using MySql.Data.MySqlClient; 2 using System; 3 using System.Collections; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace LianJieChiTest 10 { 11 public class ConnectionPool 12 { 13 private static ConnectionPool cpool = null;//池管理对象 14 private static Object objlock = typeof(ConnectionPool);//池管理对象实例 15 private int size = 1;//池中连接数 16 private int useCount = 0;//已经使用的连接数 17 private ArrayList pool = null;//连接保存的集合 18 private String ConnectionStr = "";//连接字符串 19 20 public ConnectionPool() 21 { 22 //数据库连接字符串 23 ConnectionStr = "server=localhost;User ID=root;Password=123456;database=test;"; 24 //创建可用连接的集合 25 pool = new ArrayList(); 26 } 27 28 #region 创建获取连接池对象 29 public static ConnectionPool getPool() 30 { 31 lock (objlock) 32 { 33 if (cpool == null) 34 { 35 cpool = new ConnectionPool(); 36 } 37 return cpool; 38 } 39 } 40 #endregion 41 42 #region 获取池中的连接 43 public MySqlConnection getConnection() 44 { 45 lock (pool) 46 { 47 MySqlConnection tmp = null; 48 //可用连接数量大于0 49 if (pool.Count > 0) 50 { 51 //取第一个可用连接 52 tmp = (MySqlConnection)pool[0]; 53 //在可用连接中移除此链接 54 pool.RemoveAt(0); 55 //不成功 56 if (!isUserful(tmp)) 57 { 58 //可用的连接数据已去掉一个 59 useCount--; 60 tmp = getConnection(); 61 } 62 } 63 else 64 { 65 //可使用的连接小于连接数量 66 if (useCount <= size) 67 { 68 try 69 { 70 //创建连接 71 tmp = CreateConnection(tmp); 72 } 73 catch (Exception e) 74 { 75 } 76 } 77 } 78 //连接为null 79 if (tmp == null) 80 { 81 //达到最大连接数递归调用获取连接否则创建新连接 82 if (useCount <= size) 83 { 84 tmp = getConnection(); 85 } 86 else 87 { 88 tmp = CreateConnection(tmp); 89 } 90 } 91 return tmp; 92 } 93 } 94 #endregion 95 96 #region 创建连接 97 private MySqlConnection CreateConnection(MySqlConnection tmp) 98 { 99 //创建连接 100 MySqlConnection conn = new MySqlConnection(ConnectionStr); 101 conn.Open(); 102 //可用的连接数加上一个 103 useCount++; 104 tmp = conn; 105 return tmp; 106 } 107 #endregion 108 109 #region 关闭连接,加连接回到池中 110 public void closeConnection(MySqlConnection con) 111 { 112 lock (pool) 113 { 114 if (con != null) 115 { 116 //将连接添加在连接池中 117 pool.Add(con); 118 } 119 } 120 } 121 #endregion 122 123 #region 目的保证所创连接成功,测试池中连接 124 private bool isUserful(MySqlConnection con) 125 { 126 //主要用于不同用户 127 bool result = true; 128 if (con != null) 129 { 130 string sql = "select 1";//随便执行对数据库操作 131 MySqlCommand cmd = new MySqlCommand(sql, con); 132 try 133 { 134 cmd.ExecuteScalar().ToString(); 135 } 136 catch 137 { 138 result = false; 139 } 140 141 } 142 return result; 143 } 144 #endregion 145 } 146 }
2. 使用
1 MySqlConnection conn = null; 2 for (int i = 1; i <= 100000; ++i) 3 { 4 //获取连接 5 conn = ConnectionPool.getPool().getConnection(); 6 try 7 { 8 //数据操作 9 MySqlCommand cmd = new MySqlCommand("Select * from zhy_testLianJie", conn); 10 MySqlDataReader dr = cmd.ExecuteReader(); 11 while (dr.Read()) 12 { 13 Console.WriteLine("ID:" + i + ",姓名:" + dr[1]); 14 } 15 dr.Close(); 16 //将连接添加回连接池中 17 ConnectionPool.getPool().closeConnection(conn); 18 } 19 catch (Exception ex) 20 { 21 Console.WriteLine("\n异常信息:\n{0}", ex.Message); 22 break; 23 } 24 }
这里是MySql的使用方法,SqlServer与之相差就是去掉所有对象的“My”,希望可以帮助到大家