亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#實現用SQL池,多線程定時批量執行SQL語句的方法

2020-01-24 03:05:54
字體:
來源:轉載
供稿:網友

在實際項目開發中,業務邏輯層的處理速度往往很快,特別是在開發Socket通信服務的時候,網絡傳輸很快,但是一旦加上數據庫操作,性能一落千丈,數據庫操作的效率往往成為一個系統整體性能的瓶頸。面對這問題,我們怎么辦呢?好,下面我就為大家介紹一種方法:構建SQL池,分離業務邏輯層和數據訪問層,讓業務邏輯層從低效的數據庫操作解脫,以提高系統整體性能。

(一)SQL池

SQL池是SQL容器,用于存放業務邏輯層拋過來的SQL語句。SQL池主要提供以下幾種方法:

1)internal string Pop(),從池中取出SQL。

2)internal void Push(string item),增加一個SQL到池中。

3)internal string[] Clear(),清空SQL池,清空前,返回SQL池中所有SQL語句。

特別提醒一下,SQL池是面向多線程的,所以必須對公共資源SQL采取鎖機制。這里采用互斥鎖,當業務邏輯層線程往SQL池中拋入SQL語句時,禁止SQL執行線程執行SQL語句,反之,當SQL執行線程執行SQL語句時,也不允許業務邏輯層線程往SQL池中拋入SQL語句。為什么要這么做?因為SQL執行線程是批量執行SQL語句,在批量執行SQL語句前,會從池中取出所有SQL語句,如果此時業務邏輯層線程往SQL池中拋入SQL語句,則會導致這些SQL語句丟失,得不到執行。

下面是SQL池代碼:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Test1
{
    sealed class SQLPool
    {
        //互斥鎖
        public static Mutex mutexSQLPool = new Mutex();

        //SQL池
        Stack<string> pool;

        /// <summary>
        /// 初始化SQL池
        /// </summary>
        internal SQLPool()
        {
            this.pool = new Stack<string>();
        }

 
        /// <summary>
        /// 獲取SQL池數量
        /// </summary>
        internal Int32 Count
        {
            get { return this.pool.Count; }
        }

 
        /// <summary>
        /// 從池中取出SQL
        /// </summary>
        /// <returns></returns>
        internal string Pop()
        {
            lock (this.pool)
            {
                return this.pool.Pop();
            }
        }

 
        /// <summary>
        /// 增加一個SQL到池中
        /// </summary>
        /// <param name="item"></param>
        internal void Push(string item)
        {
            if (item.Trim() == "")
            {
                throw new ArgumentNullException("Items added to a SQLPool cannot be null");
            }

            //此處向SQL池中push SQL必須與Clear互斥
            mutexSQLPool.WaitOne();
            try
            {
                this.pool.Push(item);    //此處如果出錯,則不會執行ReleaseMutex,將會死鎖
            }
            catch
            { 
            }
            mutexSQLPool.ReleaseMutex();
        }

 
        /// <summary>
        /// 清空SQL池
        /// 清空前,返回SQL池中所有SQL語句,
        /// </summary>
        internal string[] Clear()
        {
            string[] array = new string[] { };

            //此處必須與Push互斥
            mutexSQLPool.WaitOne();
            try
            {
                array = this.pool.ToArray();     //此處如果出錯,則不會執行ReleaseMutex,將會死鎖
                this.pool.Clear();
            }
            catch
            { 
            }
            mutexSQLPool.ReleaseMutex();

            return array;
        }
    }
}

(二)SQL池管理

SQL池管理主要用于管理SQL池,向業務邏輯層線程和SQL執行線程提供接口。

業務邏輯層線程調用 public void PushSQL(string strSQL) 方法,用于向SQL池拋入SQL語句。

SQL執行線程調用 public void ExecuteSQL(object obj) 方法,用于批量執行SQL池中的SQL語句。

注意,SQL池管理類采用單例模型,為什么要采用單例模型?因為SQL池只能存在一個實例,無論是業務邏輯層線程還是SQL執行線程,僅會操作這一個實例,否則,將會導致SQL池不唯一,SQL執行無效。

下面是SQL池管理類代碼:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class SQLPoolManage
    {
        //單例模型
        public static readonly SQLPoolManage sqlPoolManage = new SQLPoolManage();

        #region 屬性
        SQLPool poolOfSQL;
        #endregion

 
        #region 構造函數
        /// <summary>
        /// 初始化
        /// </summary>
        public SQLPoolManage()
        {
            this.poolOfSQL = new SQLPool();
        }
        #endregion

 
        #region 方法
        /// <summary>
        /// 將SQL語句加入SQL池中
        /// </summary>
        /// <param name="strSQL"></param>
        public void PushSQL(string strSQL)
        {
            this.poolOfSQL.Push(strSQL);
        }

 
        /// <summary>
        /// 每隔一段時間,觸發ExecuteSQL
        /// ExecuteSQL用于執行SQL池中的SQL語句
        /// </summary>
        /// <param name="obj"></param>
        public void ExecuteSQL(object obj)
        {
            if (this.poolOfSQL.Count > 0)
            {
                string[] array = this.poolOfSQL.Clear();
                //遍歷array,執行SQL
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i].ToString().Trim() != "")
                    {
                        try
                        {
                            //數據庫操作
                            //......
                        }
                        catch
                        { 
                        }
                    }
                }
            }
        }
        #endregion

    }
}

(三)定時觸發SQL執行線程

總結有以下三種方法:
方法一:調用線程執行方法,在方法中實現死循環,每個循環Sleep設定時間;

方法二:使用System.Timers.Timer類;

方法三:使用System.Threading.Timer;

代碼如下:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace Test1
{

    class Program
    {
        static void Main(string[] args)
        {
            //向SQL池中拋入SQL語句
            SQLPoolManage.sqlPoolManage.PushSQL("delete from tbl_test where id = 1");

            //定時觸發SQL執行線程
            System.Threading.Timer threadTimer = new System.Threading.Timer(new System.Threading.TimerCallback(SQLPoolManage.sqlPoolManage.ExecuteSQL), null, 0, 100);

            Console.ReadLine();
        }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女久久精品香蕉69| 欧美亚洲视频一区二区| 疯狂欧美牲乱大交777| 欧美黑人视频一区| 久久久久久久一区二区| 久久久视频精品| 在线精品国产欧美| 国产精品视频大全| 成人福利视频在线观看| 国产精品扒开腿做爽爽爽男男| 一区二区欧美激情| 亚洲精品xxx| 亚洲国产一区二区三区四区| 国产91色在线播放| 国产精品v日韩精品| 亚洲欧洲美洲在线综合| 欧美性生交大片免网| 日韩av电影中文字幕| 精品亚洲精品福利线在观看| 欧美日本高清视频| 精品国产91久久久| 国产精品99久久久久久人| 最近2019中文字幕一页二页| 国产日韩一区在线| 国产91久久婷婷一区二区| 久久视频国产精品免费视频在线| 欧美在线不卡区| 国产成人精品一区二区| 亚洲自拍欧美色图| 国产精品色悠悠| 久久香蕉国产线看观看网| 国产专区精品视频| 成人精品视频99在线观看免费| 精品五月天久久| 国产成人精品视| 欧美日韩在线第一页| 国产亚洲日本欧美韩国| 亚洲在线视频福利| 45www国产精品网站| 亚洲女人天堂色在线7777| 亚洲一区二区黄| 国产精品扒开腿做爽爽爽的视频| 午夜精品久久久久久99热| 成人a视频在线观看| 欧美福利视频在线| 色综合色综合久久综合频道88| 91禁外国网站| 色妞在线综合亚洲欧美| 欧美性猛交xxxx黑人猛交| 久久精品视频播放| 国产aⅴ夜夜欢一区二区三区| 欧美激情精品久久久久久| 亚洲欧洲自拍偷拍| 久久免费福利视频| 欧美一区二区三区免费视| 97在线观看免费| 久久久噜噜噜久久久| 亚洲黄色www网站| 日韩欧美福利视频| 亚洲综合在线做性| 欧美一区第一页| 日韩在线不卡视频| 亚洲护士老师的毛茸茸最新章节| 全亚洲最色的网站在线观看| 日韩在线播放视频| 久久久久久久久中文字幕| 亚洲人成人99网站| 国产精品成人一区二区三区吃奶| 91久久精品日日躁夜夜躁国产| 91精品国产91久久久久| 日韩免费在线看| 日韩在线激情视频| 欧美一性一乱一交一视频| 亚洲国产又黄又爽女人高潮的| 成人在线中文字幕| 97精品国产97久久久久久免费| 午夜精品一区二区三区在线播放| 欧美电影免费观看大全| 亚洲一区二区三区乱码aⅴ蜜桃女| 91精品国产91久久久久| 91在线精品播放| 欧美日韩激情视频| 欧美激情二区三区| 成人黄色大片在线免费观看| 97色在线观看| 欧美日韩精品在线| 国产狼人综合免费视频| 最近2019年好看中文字幕视频| 欧美乱人伦中文字幕在线| 国产在线播放不卡| 亚洲第一中文字幕在线观看| 久久视频国产精品免费视频在线| 98精品国产自产在线观看| 国产精品久久久久久久久免费| 久久久999精品| 日韩视频在线免费| 欧美激情视频播放| 97在线看福利| 国产91在线高潮白浆在线观看| 欧美激情亚洲视频| 亚洲午夜久久久久久久| 欧美激情视频网| 国内外成人免费激情在线视频网站| 久久人人爽人人爽爽久久| 欧美一级大片在线观看| 欧美黄网免费在线观看| 一区二区三区www| 久久久噜噜噜久噜久久| 国产精品久久久久久久久久久新郎| 久久中文精品视频| 国模私拍一区二区三区| 亚洲精品videossex少妇| 欧美性视频精品| 茄子视频成人在线| 亚洲sss综合天堂久久| 91九色国产社区在线观看| 日韩av毛片网| 国产精品久久久久久亚洲影视| 亚洲乱亚洲乱妇无码| 亚洲精品福利免费在线观看| 九九热在线精品视频| 国产精品久久久久久久久久久久| 91av在线不卡| 国内精品伊人久久| 亚洲欧洲免费视频| 中文字幕精品久久久久| 亚洲成人网在线| 91日本视频在线| 日韩精品中文字幕视频在线| 成人妇女免费播放久久久| www.欧美精品| 国产亚洲精品一区二区| 欧美有码在线视频| 精品久久久一区| 亚洲精品97久久| 5252色成人免费视频| 免费97视频在线精品国自产拍| 懂色av中文一区二区三区天美| 国产精品美女在线| 亚洲免费人成在线视频观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 成人黄色av网站| 九色精品免费永久在线| 91精品国产电影| 中文字幕少妇一区二区三区| 日韩大片在线观看视频| 高潮白浆女日韩av免费看| 久久精品国产清自在天天线| 久久久天堂国产精品女人| 欧美激情久久久| 久久久www成人免费精品张筱雨| 青青草国产精品一区二区| 成人av色在线观看| 亚洲美女视频网| 欧美精品日韩www.p站| 亚洲成人免费在线视频| 精品国产一区二区三区在线观看| 成人国内精品久久久久一区| 欧美大片va欧美在线播放| 成人久久18免费网站图片| 97国产真实伦对白精彩视频8| 日韩一区视频在线| 91精品国产自产在线| 国产精品一区二区久久国产|