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

首頁 > 編程 > C# > 正文

C#解決SQlite并發異常問題的方法(使用讀寫鎖)

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

本文實例講述了C#解決SQlite并發異常問題的方法。分享給大家供大家參考,具體如下:

使用C#訪問sqlite時,常會遇到多線程并發導致SQLITE數據庫損壞的問題

SQLite是文件級別的數據庫,其鎖也是文件級別的:多個線程可以同時讀,但是同時只能有一個線程寫。Android提供了SqliteOpenHelper類,加入Java的鎖機制以便調用。但在C#中未提供類似功能。

作者利用讀寫鎖(ReaderWriterLock),達到了多線程安全訪問的目標。

using System;using System.Collections.Generic;using System.Text;using System.Data.SQLite;using System.Threading;using System.Data;namespace DataAccess{/////////////////public sealed class SqliteConn{  private bool m_disposed;  private static Dictionary<String, SQLiteConnection> connPool =    new Dictionary<string, SQLiteConnection>();  private static Dictionary<String, ReaderWriterLock> rwl =    new Dictionary<String, ReaderWriterLock>();  private static readonly SqliteConn instance = new SqliteConn();  private static string DEFAULT_NAME = "LOCAL";  #region Init  // 使用單例,解決初始化與銷毀時的問題  private SqliteConn()  {    rwl.Add("LOCAL", new ReaderWriterLock());    rwl.Add("DB1", new ReaderWriterLock());    connPool.Add("LOCAL", CreateConn("http://local.db"));    connPool.Add("DB1", CreateConn("http://db1.db"));    Console.WriteLine("INIT FINISHED");  }  private static SQLiteConnection CreateConn(string dbName)  {    SQLiteConnection _conn = new SQLiteConnection();    try    {      string pstr = "pwd";      SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();      connstr.DataSource = Environment.CurrentDirectory + dbName;      _conn.ConnectionString = connstr.ToString();      _conn.SetPassword(pstr);      _conn.Open();      return _conn;    }    catch (Exception exp)    {      Console.WriteLine("===CONN CREATE ERR====/r/n{0}", exp.ToString());      return null;    }  }  #endregion  #region Destory  // 手動控制銷毀,保證數據完整性  public void Dispose()  {    Dispose(true);    GC.SuppressFinalize(this);  }  protected void Dispose(bool disposing)  {    if (!m_disposed)    {      if (disposing)      {        // Release managed resources        Console.WriteLine("關閉本地DB連接...");        CloseConn();      }      // Release unmanaged resources      m_disposed = true;    }  }  ~SqliteConn()  {    Dispose(false);  }  public void CloseConn()  {    foreach (KeyValuePair<string, SQLiteConnection> item in connPool)    {      SQLiteConnection _conn = item.Value;      String _connName = item.Key;      if (_conn != null && _conn.State != ConnectionState.Closed)      {        try        {          _conn.Close();          _conn.Dispose();          _conn = null;          Console.WriteLine("Connection {0} Closed.", _connName);        }        catch (Exception exp)        {          Console.WriteLine("嚴重異常: 無法關閉本地DB {0} 的連接。", _connName);          exp.ToString();        }        finally        {          _conn = null;        }      }    }  }  #endregion  #region GetConn  public static SqliteConn GetInstance()  {    return instance;  }  public SQLiteConnection GetConnection(string name)  {    SQLiteConnection _conn = connPool[name];    try    {      if (_conn != null)      {        Console.WriteLine("TRY GET LOCK");        //加鎖,直到釋放前,其它線程無法得到conn        rwl[name].AcquireWriterLock(3000);        Console.WriteLine("LOCK GET");        return _conn;      }    }    catch (Exception exp)    {      Console.WriteLine("===GET CONN ERR====/r/n{0}", exp.StackTrace);    }    return null;  }  public void ReleaseConn(string name)  {    try    {      //釋放      Console.WriteLine("RELEASE LOCK");      rwl[name].ReleaseLock();    }    catch (Exception exp)    {      Console.WriteLine("===RELEASE CONN ERR====/r/n{0}", exp.StackTrace);    }  }  public SQLiteConnection GetConnection()  {    return GetConnection(DEFAULT_NAME);  }  public void ReleaseConn()  {    ReleaseConn(DEFAULT_NAME);  }  #endregion}}////////////////////////

調用的代碼如下:

SQLiteConnection conn = null;try{  conn = SqliteConn.GetInstance().GetConnection();  //在這里寫自己的代碼}finally{  SqliteConn.GetInstance().ReleaseConn();}

值得注意的是,每次申請連接后,必須使用ReleaseConn方法釋放,否則其它線程就再也無法得到連接了。

安全起見,在作者寫的這個工具類中,啟用了最嚴格的讀寫鎖限制(即在寫入時無法讀?。H绻麛祿x取頻繁,讀者亦可開發一個得到只讀連接的方法以提高性能。

在Winxp/Win7/Win8/Win8.1 32/64位下測試通過。

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#程序設計之線程使用技巧總結》、《C#操作Excel技巧總結》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#數組操作技巧總結》及《C#面向對象程序設計入門教程

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品视频在线观看| 亚洲欧洲免费视频| 一道本无吗dⅴd在线播放一区| 成人福利免费观看| 亚洲91精品在线观看| 欧美性生交xxxxx久久久| 亚洲情综合五月天| 国产日韩在线播放| 久久久中精品2020中文| 国产精品黄色影片导航在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 欧美与黑人午夜性猛交久久久| 欧美日韩国产在线播放| 欧美电影在线观看完整版| 亚洲精品自拍偷拍| 欧美视频中文字幕在线| 性夜试看影院91社区| 黄色成人av在线| 色噜噜国产精品视频一区二区| 亚洲天堂免费观看| 伊是香蕉大人久久| 欧美性猛交xxxx久久久| 亚洲精品国产电影| 亚洲精品自拍视频| 日韩av中文字幕在线免费观看| 亚洲精品大尺度| 中国日韩欧美久久久久久久久| 亚洲综合精品伊人久久| 日本国产精品视频| 国产有码一区二区| 国产精品美女呻吟| 国产精品第一区| 欧美成人黑人xx视频免费观看| 日韩在线观看免费| 亚洲国产福利在线| 在线成人免费网站| 欧美激情亚洲综合一区| 久久久久久国产免费| 欧美精品久久久久| 亚洲精品福利资源站| 欧美一级片久久久久久久| 日本久久久久久久久久久| 欧美性xxxx极品hd满灌| 欧美夫妻性视频| 国产精品草莓在线免费观看| 91欧美精品午夜性色福利在线| 国产日韩视频在线观看| 一本大道香蕉久在线播放29| 国产精品视频精品视频| 主播福利视频一区| 亚洲最大的av网站| 色999日韩欧美国产| 欧美一区二区三区……| 日韩免费在线免费观看| 色爱精品视频一区| 国产美女精品免费电影| 欧美极品第一页| 欧美日韩中文在线| 92福利视频午夜1000合集在线观看| 日韩毛片在线看| 久久精品人人做人人爽| 午夜精品久久久久久久99黑人| 久热国产精品视频| 懂色av一区二区三区| 黄色一区二区在线观看| 亚洲影院高清在线| 日韩美女av在线免费观看| 美日韩在线视频| 这里只有精品视频| 精品国产乱码久久久久久婷婷| 亚洲国模精品私拍| 亚洲va国产va天堂va久久| 成人h猎奇视频网站| 欧美一级bbbbb性bbbb喷潮片| 欧美精品一二区| 国产一区二区三区在线观看网站| 久久久免费观看| 国产成人在线亚洲欧美| 欧美性猛交xxxxx免费看| 欧美床上激情在线观看| 国产精品一香蕉国产线看观看| 国产精品自拍偷拍视频| 精品中文字幕久久久久久| 欧美国产日本在线| 欧美电影院免费观看| 亚洲欧美日韩爽爽影院| 亚洲成色777777女色窝| 久久在线视频在线| 国产精品久久久久久久久免费看| 久热99视频在线观看| 亚洲综合视频1区| 午夜精品福利视频| 国产欧美一区二区三区在线看| 最新69国产成人精品视频免费| 亚洲石原莉奈一区二区在线观看| 亚洲福利在线视频| 国产成人高潮免费观看精品| 成人免费观看49www在线观看| 中文字幕免费精品一区高清| 国产欧美最新羞羞视频在线观看| 日韩美女激情视频| 国产福利精品视频| 亚洲欧美日韩一区二区在线| 中文字幕av一区中文字幕天堂| 精品无人区太爽高潮在线播放| 欧美国产视频一区二区| 另类视频在线观看| 久久久视频精品| 亚洲精品aⅴ中文字幕乱码| 色婷婷av一区二区三区在线观看| 欧美日韩在线看| 91色在线观看| 亚洲午夜女主播在线直播| 中文.日本.精品| 亚洲自拍另类欧美丝袜| 久久精品99无色码中文字幕| 国产日韩欧美在线看| 国产精品www色诱视频| 成人av色在线观看| www国产91| 国产丝袜视频一区| 成人欧美一区二区三区黑人| 亚洲人精选亚洲人成在线| 成人女保姆的销魂服务| 久久精品视频在线| 超碰日本道色综合久久综合| 亚洲久久久久久久久久久| 亚洲美女av在线播放| 国产精品扒开腿做爽爽爽的视频| 亚洲欧美另类人妖| 庆余年2免费日韩剧观看大牛| 一区二区三区久久精品| 久久精品久久久久| 国产综合在线观看视频| 亚洲电影中文字幕| 国产日韩av在线| 日韩视频免费在线观看| 精品成人69xx.xyz| 国产精品日韩久久久久| 欧美精品video| 亚洲偷欧美偷国内偷| 欧美成人sm免费视频| 国产成人aa精品一区在线播放| 亚洲成年人在线播放| 欧美一区二区三区图| 亚洲va男人天堂| 中文一区二区视频| 日韩国产高清视频在线| 亚洲自拍偷拍第一页| 97色在线观看免费视频| 国产精品羞羞答答| 国产精品三级在线| 国产有码在线一区二区视频| 日韩69视频在线观看| 国产精品久久久久久影视| 97涩涩爰在线观看亚洲| 亚洲第一区中文字幕| 亚洲成人免费在线视频| 国产精品va在线| 日韩精品视频免费专区在线播放| 久久综合伊人77777蜜臀| 久久香蕉精品香蕉| 中日韩午夜理伦电影免费| 欧美精品在线视频观看|