我们有一个传统的Web应用程序,使用Classic ASP编写,目前使用MS Access数据库作为其数据存储。与数据库的交互通过Jet OleDB提供程序进行:
为了确定是什么导致了锁定,我们创建了一个 VBScript 文件(使用与上面显示的相同的 SQLite 连接字符串),然后从命令行运行它(因此 IIS 根本不参与)。
在这种情况下,在连接后发出任何 CRUD 命令并关闭数据库之后,SQLite 文件立即可访问。因此我们得出结论,一些方式上 IIS 7.5(或更准确地说是 W3WP.exe)对 SQLite 文件进行了锁定。事实上,如果停止网站的应用程序池,则文件上的锁定会立即释放。
VBScript 文件的代码如下:
Provider=Microsoft.JET.OLEDB.4.0;Data Source=database.mdb
与大多数Web应用程序一样,数据库上定期执行CRUD操作。
应用程序连接到数据库,执行插入
、更新
、删除
或选择
语句,然后关闭连接。在连接关闭后立即可以毫不担心地重命名或移动MS Access .mdb
文件。我们利用了这种行为多年——它对我们的用例是必需的,而且一直表现良好。
出于各种原因,我们正在将MS Access数据库替换为SQLite 3。我们通过ODBC连接到SQLite版本。
与SQLite数据库的交互方式与以前完全相同,即连接到数据库,发出SQL命令,然后关闭连接。
问题在于,在关闭连接后的60秒内,SQLite数据库文件仍然被锁定。这会防止我们重命名或移动数据库文件,因为很可能在这60秒内发生另一个连接,所以该文件似乎永久锁定。
我们创建了一个最小的Classic ASP页面来说明这种行为:
Dim connectionString: connectionString = "DRIVER=SQLite3 ODBC Driver;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;FKSupport=0;NoCreat=1;Database=database.sqlite"
Dim con : Set con = CreateObject("ADODB.Connection")
con.Open connectionString
' Issue some CRUD commands here
con.Close
Set con = Nothing
Response.Write("We are here!!!!!")
为了确定是什么导致了锁定,我们创建了一个 VBScript 文件(使用与上面显示的相同的 SQLite 连接字符串),然后从命令行运行它(因此 IIS 根本不参与)。
在这种情况下,在连接后发出任何 CRUD 命令并关闭数据库之后,SQLite 文件立即可访问。因此我们得出结论,一些方式上 IIS 7.5(或更准确地说是 W3WP.exe)对 SQLite 文件进行了锁定。事实上,如果停止网站的应用程序池,则文件上的锁定会立即释放。
VBScript 文件的代码如下:
Dim connectionString: connectionString = "DRIVER=SQLite3 ODBC Driver;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;FKSupport=0;NoCreat=1;Database=database.sqlite"
Dim con : Set con = CreateObject("ADODB.Connection")
con.Open connectionString
' Issue some CRUD commands here
WScript.Echo "Press [ENTER] to continue..."
' Read dummy input. This call will not return until [ENTER] is pressed.
WScript.StdIn.ReadLine
WScript.Echo "Done."
con.Close
Set con = Nothing
是否有一种在IIS中的设置,使我们可以像当前使用MS Access一样操作SQLite数据库?
conn.Close
但没有跟上Set conn = Nothing
。 - Gord ThompsonSet conn = Nothing
命令。我编辑了问题以展示代码。 - Simon Lomax