C# 資料庫連接池 安全執行緒 單例模式 的實現

來源:互聯網
上載者:User

本文介紹3種安全執行緒模式

1,lock

2,Mutex

3,MethodImpl

 

以前寫的一個MYSQL資料庫連接池ConnectionPool.CS

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Threading;using MySql.Data.MySqlClient;using System.Runtime.CompilerServices;namespace queue.service.basic{    public class ConnectionPool    {        private Stack<MySqlConnection> pool;        private const int POOL_MAX_SIZE = 20;        private int current_Size = 0;        private string ConnString = "";//連接字串          private SysProperty sysProperty;        private const string SYS_PROPERTY = "config\\SysProperty.xml";        private static ConnectionPool connPool;        private ConnectionPool()        {            if (pool == null)            {                pool = new Stack<MySqlConnection>();            }        }        [MethodImpl(MethodImplOptions.Synchronized)]        public static ConnectionPool getInstance()        {            if (connPool == null)            {                connPool = new ConnectionPool();            }            return connPool;        }        public MySqlConnection getConnection()        {            MySqlConnection conn;            lock (this)            {                if (pool.Count == 0)                {                    if (current_Size < POOL_MAX_SIZE)                    {                        conn = createConnection();                        current_Size++;                        //把conn加入到pool 中                        pool.Push(conn);                    }                    else                    {                        try                        {                            Monitor.Wait(this);                        }                        catch (Exception e)                        {                            Console.WriteLine(e.Message);                        }                    }                }                conn = (MySqlConnection)pool.Pop();            }            return conn;        }        private string GetConnString()        {            if (ConnString == "")            {                sysProperty = new SysProperty().LoadProperty(Path.Combine(SYS_PROPERTY));                string ip = sysProperty.getPropertyValue("databaseIP");                string dbName = sysProperty.getPropertyValue("databaseName");                string userID = sysProperty.getPropertyValue("databaseUser");                string userPwd = sysProperty.getPropertyValue("databasePassword");                ConnString = "Database=" + dbName +                    ";Data Source=" + ip +                    ";User Id=" + userID +                    ";Password=" + userPwd + ";" +                    "pooling=true;CharSet=utf8;port=3306;";            }            return ConnString;        }        public void releaseConnection(MySqlConnection conn)        {            lock (this)            {                pool.Push(conn);                Monitor.Pulse(this);            }        }        private MySqlConnection createConnection()        {            lock (this)            {                MySqlConnection newConn = new MySqlConnection(GetConnString());                newConn.Open();                return newConn;            }        }    }}

總結:

1,上面類中使用了 主要使用了 lock 方式。

     lock()是對一個對象加互斥鎖,只允許一個線程訪問其後大括弧中語句塊,直到該語句塊的代碼執行完才解鎖,解鎖後才允許其他的線程執行其語句塊。

2,單例模式使用了懶漢模式。

     餓漢式是在類裝載的時候直接得到該類的執行個體,可以說是前期綁定的;懶漢式是後期綁定的,類載入的時候connPool是空的,在需要的時候才被建立且僅建立一次。餓漢式的速度快,效率高,但是耗費系統資源;懶漢式則相反。懶漢式還存在一個問題,就是後期綁定不能確保對象只能被執行個體化一次,這需要對指示類是否執行個體化的標誌設定1個互斥鎖,僅允許1個線程訪問。這樣就可以確保對象只被執行個體化一次。

3,單例模式的安全執行緒使用了 MethodImpl。

他指定了getInstance()方法同時只能被一個線程使用。

4,使用Mutex類進行同步

修改代碼為:

private static Mutex mutex = new Mutex();        public static ConnectionPool getInstance()        {            mutex.WaitOne();            if (connPool == null)            {                connPool = new ConnectionPool();            }            mutex.ReleaseMutex();            return connPool;        }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.