最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#實現(xiàn)用SQL池,多線程定時批量執(zhí)行SQL語句的方法

 更新時間:2013年10月29日 09:42:21   作者:  
構(gòu)建SQL池,分離業(yè)務邏輯層和數(shù)據(jù)訪問層,讓業(yè)務邏輯層從低效的數(shù)據(jù)庫操作解脫,以提高系統(tǒng)整體性能

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

(一)SQL池

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

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

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

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

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

下面是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池數(shù)量
        /// </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);    //此處如果出錯,則不會執(zhí)行ReleaseMutex,將會死鎖
            }
            catch
            { 
            }
            mutexSQLPool.ReleaseMutex();
        }

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

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

            return array;
        }
    }
}

(二)SQL池管理

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

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

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

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

下面是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 構(gòu)造函數(shù)
        /// <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>
        /// 每隔一段時間,觸發(fā)ExecuteSQL
        /// ExecuteSQL用于執(zhí)行SQL池中的SQL語句
        /// </summary>
        /// <param name="obj"></param>
        public void ExecuteSQL(object obj)
        {
            if (this.poolOfSQL.Count > 0)
            {
                string[] array = this.poolOfSQL.Clear();
                //遍歷array,執(zhí)行SQL
                for (int i = 0; i < array.Length; i++)
                {
                    if (array[i].ToString().Trim() != "")
                    {
                        try
                        {
                            //數(shù)據(jù)庫操作
                            //......
                        }
                        catch
                        { 
                        }
                    }
                }
            }
        }
        #endregion

    }
}

(三)定時觸發(fā)SQL執(zhí)行線程

總結(jié)有以下三種方法:
方法一:調(diào)用線程執(zhí)行方法,在方法中實現(xiàn)死循環(huán),每個循環(huán)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");

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

            Console.ReadLine();
        }
    }
}

相關(guān)文章

  • C#統(tǒng)計字符串的方法

    C#統(tǒng)計字符串的方法

    這篇文章主要為大家詳細介紹了C#統(tǒng)計字符串的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 自己編寫sqlhelper類示例分享

    自己編寫sqlhelper類示例分享

    這篇文章主要介紹了自己編寫sqlhlper類示例,需要的朋友可以參考下
    2014-04-04
  • 調(diào)整C#中數(shù)組大小的方法

    調(diào)整C#中數(shù)組大小的方法

    數(shù)組存儲多個相同類型的一種非常常用的數(shù)據(jù)結(jié)構(gòu),它長度是固定,也就是數(shù)組一旦創(chuàng)建大小就固定了,C# 數(shù)組不支持動態(tài)長度,那在C#中是否有方法可以調(diào)整數(shù)組大小呢?本文將通過示例介紹一種調(diào)整一維數(shù)組大小的方法,需要的朋友可以參考下
    2024-06-06
  • C#中使用UDP通信的示例

    C#中使用UDP通信的示例

    這篇文章主要介紹了C#中使用UDP通信的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C#異步迭代IAsyncEnumerable應用實現(xiàn)

    C#異步迭代IAsyncEnumerable應用實現(xiàn)

    IAsyncEnumerable可以來實現(xiàn)異步迭代,本文就主要介紹了C#異步迭代IAsyncEnumerable應用實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C# 中GUID生成格式的四種方法

    C# 中GUID生成格式的四種方法

    這篇文章主要介紹了C# 中GUID生成格式的四種方法,需要的朋友可以參考下
    2017-02-02
  • C#實現(xiàn)聊天消息渲染與圖文混排詳解

    C#實現(xiàn)聊天消息渲染與圖文混排詳解

    在實現(xiàn)聊天軟件時,渲染文字表情圖文混排是一項非常繁瑣的工作,再加上還要支持GIF動圖、引用消息、撤回消息、名片等不同樣式的消息渲染時,就更加麻煩了。本文就來和大家分享一下具體實現(xiàn)方法,希望對大家有所幫助
    2023-02-02
  • C# 中DateTime 的使用技巧匯總

    C# 中DateTime 的使用技巧匯總

    本文主要介紹了DateTime的使用技巧,包括獲取本周、上周、下周、本月、上個月、下個月、本季度、上季度、下季度、本年度、上年度、下年度等多個方法,分享給大家,希望對大家有所幫助。
    2016-04-04
  • Unity編輯器資源導入處理函數(shù)OnPostprocessTexture實例深入解析

    Unity編輯器資源導入處理函數(shù)OnPostprocessTexture實例深入解析

    這篇文章主要為大家介紹了Unity編輯器資源導入處理函數(shù)OnPostprocessTexture實例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • C#實現(xiàn)文件與Base64的相互轉(zhuǎn)換

    C#實現(xiàn)文件與Base64的相互轉(zhuǎn)換

    本文主要介紹了C#實現(xiàn)文件與Base64的相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

阿克| 隆回县| 西峡县| 大足县| 广安市| 濮阳市| 鄂托克前旗| 渝北区| 绍兴县| 甘孜| 永泰县| 曲沃县| 定陶县| 津南区| 舒城县| 八宿县| 辰溪县| 电白县| 峡江县| 铜陵市| 瑞安市| 富锦市| 拜泉县| 临泽县| 榆社县| 楚雄市| 城市| 中西区| 汉寿县| 宁安市| 民丰县| 合作市| 丰顺县| 湘西| 汉源县| 龙胜| 罗田县| 沁源县| 同江市| 宜章县| 巴南区|