123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Collections.Concurrent;
- using parkMonitor.tools;
- using MySql.Data.MySqlClient;
- using System.Configuration;
- namespace parkMonitor.Database2
- {
- class ConnectionPoolManager
- {
- //public static BlockingQueue bq = new BlockingQueue();
- /// <summary>
- /// 连接字符串
- /// </summary>
- public static string localStr = "SqlConnectionLocation";
- public static string remoteStr = "SqlConnectionStr";
- public static string localConf, remoteConf;
- public static string localIP, remoteIP;
- /// <summary>
- /// 数据库连接字符串配置文件初始化
- /// </summary>
- public static void Init()
- {
- try
- {
- localConf = ConfigurationManager.AppSettings[localStr];
- remoteConf = ConfigurationManager.AppSettings[remoteStr];
- localIP = ConfigurationManager.AppSettings["localDBIP"];
- remoteIP = ConfigurationManager.AppSettings["remoteDBIP"];
- }
- catch
- {
- Console.WriteLine("配置文件有误");
- }
- }
- /// <summary>
- /// 初始化连接池,在项目界面初始化时,进行数据库连接池初始化一般设为10个连接
- /// </summary>
- /// <param name="max"></param>
- /// <param name="connectionString"></param>
- /// <returns></returns>
- public static BlockingQueue InitConnPooling(int max, string connectionString)
- {
- BlockingQueue bq = new BlockingQueue();
- for (int i = 0; i < max; i++)
- {
- Connection conn = DatabaseConnPoolFactory.CreateConnection(connectionString);
- if (conn.mySqlConnFlag)
- {
- bq.Enqueue(conn);
- }
- }
- return bq;
- }
- /// <summary>
- /// 获取连接
- /// </summary>
- /// <returns></returns>
- public static Connection GetConnection(BlockingQueue bq)
- {
- Connection connection = (Connection)bq.Dequeue();
- while (!connection.mySqlConnFlag)
- {
- connection = (Connection)bq.Dequeue();
- }
- return connection;
- }
- /// <summary>
- /// 移除连接
- /// </summary>
- /// <param name="conn"></param>
- public static void RemoveConnection(Connection conn)
- {
- conn.Dispose();
- }
- /// <summary>
- /// 定时重置连接
- /// </summary>
- /// <param name="max"></param>
- /// <param name="bq"></param>
- public static void ResetConnPooling(int max, string connectionString, BlockingQueue bq)
- {
- CloseAll(bq);
- InitConnPooling(max, connectionString);
- }
- /// <summary>
- /// 添加连接到池中
- /// </summary>
- /// <param name="max"></param>
- /// <param name="connectionString"></param>
- public static void AddConnToPooling(int max, string connectionString)
- {
- InitConnPooling(max, connectionString);
- }
- /// <summary>
- /// 检查连接是否可用,3<=连接数<=10
- /// </summary>
- /// <param name="min"> min = 3</param>
- /// <param name="max">max = 10</param>
- /// <param name="bq">server=59.175.148.85;uid=root;pwd=x5;database=zxpark</param>
- public static void CheckConnPooling(int min, int max, string connectionString, BlockingQueue bq)
- {
- Connection conn = null;
- int total = bq.Count();
- for (int i = 0; i < total; i++)
- {
- conn = GetConnection(bq);
- try
- {
- string sql = "select count(1) from garage";
- MySqlCommand cmd = new MySqlCommand(sql, conn.mySqlConnection);
- object result = cmd.ExecuteScalar();
- if (result != null)
- {
- int r = Convert.ToInt32(result);
- //Console.WriteLine("Number of garage in the database is: " + r);
- }
- ReleaseConnection(conn,bq);
- }
- catch (Exception ex)
- {
- conn.Dispose();
- Console.WriteLine(ex.Message);
- }
- }
- if (bq.Count() < min)
- {
- AddConnToPooling(max - min, connectionString);
- }
- }
- /// <summary>
- /// 释放连接,将连接返回阻塞队列
- /// </summary>
- /// <param name="conn"></param>
- /// <param name="bq"></param>
- public static void ReleaseConnection(Connection conn, BlockingQueue bq)
- {
- bq.Enqueue(conn);
- }
- /// <summary>
- /// 关闭所有连接
- /// </summary>
- public static void CloseAll(BlockingQueue bq)
- {
- while (bq.Count() > 0)
- {
- Connection connection = (Connection)bq.Dequeue();
- connection.Close();
- }
- Console.WriteLine("所有连接成功关闭!");
- }
- }
- }
|