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

深入SQLite多線程的使用總結(jié)詳解

 更新時間:2013年05月16日 09:58:31   作者:  
本篇文章是對SQLite多線程的使用進行了詳細的分析介紹,需要的朋友參考下

SQLite支持3種線程模式:
  單線程:這種模式下,沒有進行互斥,多線程使用不安全。禁用所有的mutex鎖,并發(fā)使用時會出錯。當SQLite編譯時加了SQLITE_THREADSAFE=0參數(shù),或者在初始化SQLite前調(diào)用sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)時啟用。

  多線程:這種模式下,只要一個數(shù)據(jù)庫連接不被多個線程同時使用就是安全的。源碼中是啟用bCoreMutex,禁用bFullMutex。實際上就是禁用數(shù)據(jù)庫連接和prepared statement(準備好的語句)上的鎖,因此不能在多個線程中并發(fā)使用同一個數(shù)據(jù)庫連接或prepared statement。當SQLite編譯時加了SQLITE_THREADSAFE=2參數(shù)時默認啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調(diào)用sqlite3_config(SQLITE_CONFIG_MULTITHREAD)啟用;或者在創(chuàng)建數(shù)據(jù)庫連接時,設置SQLITE_OPEN_NOMUTEX flag。

  串行:sqlite是線程安全的。啟用所有的鎖,包括bCoreMutex和bFullMutex 。因為數(shù)據(jù)庫連接和prepared statement都已加鎖,所以多線程使用這些對象時沒法并發(fā),也就變成串行了。當SQLite編譯時加了SQLITE_THREADSAFE =1參數(shù)時默認啟用。若SQLITE_THREADSAFE不為0,可以在初始化SQLite前,調(diào)用sqlite3_config(SQLITE_CONFIG_SERIALIZED)啟用;或者在創(chuàng)建數(shù)據(jù)庫連接時,設置SQLITE_OPEN_FULLMUTEX flag  。

    而這里所說的初始化是指調(diào)用sqlite3_initialize()函數(shù),這個函數(shù)在調(diào)用sqlite3_open()時會自動調(diào)用,且只有第一次調(diào)用是有效的.

   為了達到線程安全,SQLite在編譯時必須將 SQLITE_THREADSAFE 預處理宏置為1。在Windows和Linux上, 已編譯的好的二進制發(fā)行版中都是這樣設置的。如果不確定你所使用的庫是否是線程安全的,可以調(diào)用 sqlite3_threadsafe() 接口找出。調(diào)用sqlite3_threadsafe()可以獲得編譯期的SQLITE_THREADSAFE參數(shù) 。

   也就是說線程模式可以在編譯時(通過源碼編譯sqlite庫時)、啟動時(使用sqlite的應用程序初始化時)或者運行時(創(chuàng)建數(shù)據(jù)庫連接時)來指定。一般而言,運行時指定的模式將覆蓋啟動時的指定模式,啟動時指定的模式將覆蓋編譯時指定的模式。但是,單線程模式一旦被指定,將無法被覆蓋。默認的線程模式是串行模式。

編譯時選擇線程模式
    可以通過定義SQLITE_THREADSAFE宏來指定線程模式。如果沒有指定,默認為串行模式。定義宏SQLITE_THREADSAFE=1指定使用串行模式;=0使用單線程模式;=2使用多線程模式。

    sqlite3_threadsafe()函數(shù)的返回值可以確定編譯時指定的線程模式。如果指定了單線程模式,函數(shù)返回false。如果指定了串行或者多線程模式,函數(shù)返回true。由于sqlite3_threadsafe()函數(shù)要早于多線程模式以及啟動時和運行時的模式選擇,所以它既不能區(qū)別多線程模式和串行模式也不能區(qū)別啟動時和運行時的模式。

    最后一句可通過sqlite3_threadsafe函數(shù)的實現(xiàn)來理解SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; }如果編譯時指定了單線程模式,那么臨界互斥邏輯在構(gòu)造時就被省略,因此也就無法在啟動時或運行時指定串行模式或多線程模式。

啟動時選擇線程模式
    假如在編譯時沒有指定單線程模式,就可以在應用程序初始化時使用sqlite3_config()函數(shù)修改線程模式。參數(shù)SQLITE_CONFIG_SINGLETHREAD可指定為
單線程模式,SQLITE_CONFIG_MULTITHREAD指定為多線程模式,SQLITE_CONFIG_SERIALIZED指定為串行模式。

運行時選擇線程模式
    如果沒有在編譯時和啟動時指定為單線程模式,那么每個數(shù)據(jù)庫連接在創(chuàng)建時可單獨的被指定為多線程模式或者串行模式,但是不能指定為單線程模式。如果在編譯時或啟動時指定為單線程模式,就無法在創(chuàng)建連接時指定多線程或者串行模式。

    創(chuàng)建連接時用sqlite3_open_v2()函數(shù)的第三個參數(shù)來指定線程模式。SQLITE_OPEN_NOMUTEX標識創(chuàng)建多線程模式的連接;SQLITE_OPEN_FULLMUTEX標識創(chuàng)建串行模式的連接。如果沒有指定標識,或者使用sqlite3_open()或sqlite3_open16()函數(shù)來創(chuàng)建數(shù)據(jù)庫連接,那么在編譯時或啟動時指定的線程模式將作為默認的線程模式使用。

相關(guān)文章

  • springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器的方式

    springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器的方式

    這篇文章主要介紹了springboot+jersey+tomcat實現(xiàn)跨域方式上傳文件到服務器,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java中常見的日期操作(取值、轉(zhuǎn)換、加減、比較)

    Java中常見的日期操作(取值、轉(zhuǎn)換、加減、比較)

    本文給大家介紹java中常見的日期操作,日期取值、日期轉(zhuǎn)換、日期加減、日期比較,對java日期操作相關(guān)知識感興趣的朋友一起學習吧
    2015-12-12
  • django 遞歸查詢評論的示例詳解

    django 遞歸查詢評論的示例詳解

    文章介紹了將表數(shù)據(jù)轉(zhuǎn)換為樹狀結(jié)構(gòu)以及如何處理扁平化數(shù)據(jù)的方法,探討了在數(shù)據(jù)管理中的應用和實現(xiàn)技術(shù),感興趣的朋友一起看看吧
    2025-01-01
  • Java實現(xiàn)求子數(shù)組和的最大值算法示例

    Java實現(xiàn)求子數(shù)組和的最大值算法示例

    這篇文章主要介紹了Java實現(xiàn)求子數(shù)組和的最大值算法,涉及Java數(shù)組遍歷、判斷、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • java安全停止線程的方法詳解

    java安全停止線程的方法詳解

    這篇文章主要介紹了java安全停止線程的方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • SpringSecurity注銷設置的方法

    SpringSecurity注銷設置的方法

    這篇文章主要為大家詳細介紹了SpringSecurity注銷設置的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Mybatis-Plus使用@TableField實現(xiàn)自動填充日期的代碼示例

    Mybatis-Plus使用@TableField實現(xiàn)自動填充日期的代碼示例

    數(shù)據(jù)庫中經(jīng)常有create_time,update_time兩個字段,在代碼中設置時間有點太麻煩了?mybatis-plus可以幫我們自動填充,本文主要介紹了Mybatis-Plus使用@TableField實現(xiàn)自動填充日期的代碼示例,感興趣的可以了解一下
    2022-04-04
  • Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題

    Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題

    這篇文章主要介紹了Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 手把手帶你用java搞定青蛙跳臺階

    手把手帶你用java搞定青蛙跳臺階

    這篇文章主要給大家介紹了關(guān)于Java青蛙跳臺階問題的解決思路與代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • SpringCloud入門實驗環(huán)境搭建

    SpringCloud入門實驗環(huán)境搭建

    這篇文章主要介紹了SpringCloud入門實驗環(huán)境搭建的相關(guān)資料,幫助大家更好的理解和學習使用SpringCloud,感興趣的朋友可以了解下
    2021-04-04

最新評論

临沂市| 保定市| 尉氏县| 探索| 皮山县| 广西| 桃江县| 潞西市| 金溪县| 平度市| 垦利县| 顺平县| 右玉县| 会宁县| 蛟河市| 石嘴山市| 丰城市| 隆德县| 西畴县| 新野县| 保定市| 泗洪县| 大渡口区| 黔江区| 景谷| 林甸县| 大足县| 凤冈县| 南华县| 罗城| 杨浦区| 晋中市| 馆陶县| 山丹县| 华安县| 松溪县| 前郭尔| 喜德县| 南京市| 林州市| 武山县|