在sqlite的使用過程中最常發生的資料庫異常便是資料庫被鎖定了(sqlite_busy或者sqlite_locked)。sqlite對於併發的處理機制是允許同乙個程序的多個執行緒同時讀取乙個資料庫,但是任何時刻只允許乙個執行緒/程序寫入資料庫。所以必須要必須要對資料庫的讀寫進行控制。 sqlite資料庫本身提供了兩個函式用來處理鎖定情況: int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); int sqlite3_busy_timeout(sqlite3*, int ms); 使用這兩個函式可以設定當發生資料庫鎖定的時候,呼叫什麼函式來處理,以及設定鎖定時的等待時間。 當然通常情況下我們還可以用另外一種方法來解決這類問題,那便是設定互斥量。一般情況下我們可以使用互斥量,臨界區等來實現。在這裡我使用了互斥量,主要是因為我需要在多個不同的程序中併發的訪問同乙個資料庫。用於鎖定和解鎖的函式如下: void lock() else } void unlock() 當然我們也可以把等待時間設定為60秒,以免出現死等的現象。具體使用時可以按如下呼叫: //鎖定資料庫 lock(); rc = sqlite3_exec(db, "begin;", 0, 0, &zerrmsg); rc = sqlite3_exec(db, exec, 0, 0, &zerrmsg); rc = sqlite3_exec(db, "commit;", 0, 0, &zerrmsg); //資料庫解鎖 unlock(); 經過測試這種方法的消耗要小於迴圈開啟資料庫的操作:)接下來我們要討論一下,如何在sqlite中訪問大容量的資料(二進位制)。
例1.
select datetime('now');
結果:2006-10-17 12:55:54
例2.select datetime('2006-10-17');
結果:2006-10-17 12:00:00
例3.select datetime('2006-10-17 00:20:00',' 1 hour','-12 minute');
結果:2006-10-17 01:08:00
例4.select date('2006-10-17',' 1 day',' 1 year');
結果:2007-10-18
例5.select datetime('now','start of year');
結果:2006-01-01 00:00:00
例6.select datetime('now','start of month');
結果:2006-10-01 00:00:00
例7.select datetime('now','start of day');
結果:2006-10-17 00:00:00
例8.select datetime('now',' 10 hour','start of day',' 10 hour');
結果:2006-10-17 10:00:00
例9.select datetime('now','localtime');
結果:2006-10-17 21:21:47
例10.
select datetime('now',' 8 hour');
結果:2006-10-17 21:24:45
例3中的 1 hour和-12 minute表示可以在基本時間上(datetime函式的第乙個引數)增加或減少一定時間。
例5中的start of year表示一年開始的時間。
從例8可以看出,儘管第2個引數加上了10個小時,但是卻被第3個引數「start of day」把時間歸零到00:00:00,隨後的第4個引數在00:00:00
的基礎上把時間增加了10個小時變成了10:00:00。
例9把格林威治時區轉換成本地時區。
例10把格林威治時區轉換成東八區。
strftime()函式可以把yyyy-mm-dd hh:mm:ss格式的日期字串轉換成其它形式的字串。
strftime()的語法是strftime(格式, 日期/時間, 修正符, 修正符, ...)
它可以用以下的符號對日期和時間進行格式化:
%d 月份, 01-31
%f 小數形式的秒,ss.sss
%h 小時, 00-23
%j 算出某一天是該年的第幾天,001-366
%m 月份,00-12
%m 分鐘, 00-59
%s 從2023年1月1日到現在的秒數
%s 秒, 00-59
%w 星期, 0-6 (0是星期天)
%w 算出某一天屬於該年的第幾周, 01-53
%y 年, yyyy
%% 百分號
strftime()的用法舉例如下:
例11.
select strftime('%y.%m.%d %h:%m:%s','now','localtime');
結果:2006.10.17 21:41:09
例11用圓點作為日期的分隔附,並把時間轉換為當地的時區的時間。
更多關於sqlite日期時間函式方面的內容,可以參考chris newman寫的《sqlite》(isbn:0-672-32685-x)中的《working with dates and
times》一文。
sqlite鎖機制概述
sqlite的鎖的粒度比較粗,是資料庫級別的,也就是說即使只是對某個頁進行讀寫操作,sqlite也會封鎖整個資料庫。這種策略降低了讀 寫事務和寫 寫事務間的併發程度,但是大大簡化了程式設計,減小了整個程式的大小。所以,sqlite的適用場景為 較少次寫入資料,大量 多次讀出資料。這也是sqlite作...
SQLite 時間函式
code home 未分類 sqlite日期和時間函式不求人 sqlite日期和時間函式不求人 posted byadmin on星期四 18十二 2008 sqlite包含了如下時間 日期函式 datetime 產生日期和時間 date 產生日期 time 產生時間 strftime 對以上三個函...
SQLite資料庫的鎖機制
sqlite資料庫的鎖機制包括四種鎖,共享鎖 shared lock 預留鎖 reserved lock 和未決鎖 pending lock 排他鎖 exclusive lock 其中讀操作,用的是shared lock,所以併發的多個讀資料庫。如果有乙個讀操作存在,那麼都不會允許寫。而寫就比較麻煩...