防止IIS保留SQLite数据库文件的文件锁定

By simon at 2018-02-27 • 0人收藏 • 51人看过

我们有一个以传统ASP编写的遗留Web应用程序,目前使用的是 MS Access数据库作为其数据存储。相互作用与数据库通过 Jet OleDB提供程序:

Provider=Microsoft.JET.OLEDB.4.0;Data Source=database.mdb
与大多数Web应用程序一样,CRUD操作也是如此执行 数据库定期。 应用程序连接到数据库,执行insert, update,delete或select语句然后关闭 连接。在连接关闭后,我们立即关闭e到 重命名移动 MS Access .mdb文件不受惩罚。我们有 利用这种行为为许多y耳朵 - 这是我们使用的必要条件 案件和它为我们提供了很好的服务。 由于各种原因,我们正在更换MS访问数据库 用SQLite 3.我们通过ODBC连接到SQLite版本。 与SQLite数据库的交互发生它以前就是这样,即 连接到数据库,发出SQL命令,关闭连接。 问题在于SQLite database文件保持锁定状态60秒 连接关闭后。这可以防止我们重命名或移动 数据库文件,因为很可能在其中发生了另一个连接 那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(或更多的精度y 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
是否有某种setting在IIS中,我们可以利用这将允许我们 就像我们现在使用MS Access一样操纵SQLite数据库?

3 个回复 | 最后更新于 2018-02-27
2018-02-27   #1

使用[CH Werner SQLite ODBC驱动程序](http://www.ch-werner.de/sqliteodbc/) 您无法关闭连接池。有鳕鱼e在司机那 处理SQL_ATTR_CONNECTION_POOLING属性,但该属性从不使用。这个 意味着它将使用连接ction池默认情况下。 停止IIS锁定数据库将涉及修改DLL 包括一个* ConnectionPooling = True / False CPTimeout = n *以便我们可以 发送适当的值到SQLSetEnvAttr功能。

2018-02-27   #2

使用[CH Werner SQLite ODBC驱动程序](http://www.ch-werner.de/sqliteodbc/) 您无法关闭连接池。有鳕鱼e在司机那 处理SQL_ATTR_CONNECTION_POOLING属性,但该属性从不使用。这个 意味着它将使用连接ction池默认情况下。 停止IIS锁定数据库将涉及修改DLL 包括一个* ConnectionPooling = True / False CPTimeout = n *以便我们可以 发送适当的值到SQLSetEnvAttr功能。

2018-02-27   #3

我在发布原始问题约一年后重新审视了这个问题 因为一个同事实际上发现了解决方案ñ为我们工作和 也许这会对其他人有所帮助。 有效的解决方案是对注册表进行一些更改。一世没什么 与[CH Werner SQLIte ODBC驱动程序](http://www.ch- werner.de/sqliteodbc/)。事实上,我们有一个电子邮件转换与CH Werner合作 他本人和他证实,司机不影响锁定 数据库就像我们描述的那样 钍解决方案是对注册表进行以下更改:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}]
@="MSDASQL"
"OLEDB_SERVICES"=dword:fffffffe
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{c8b522cb-5cf3-11ce-ade5-00aa0044773d}]
@="MSDASQL"
"OLEDB_SERVICES"=dword:fffffffe
如果您将上述注册表更改放入一个带有。reg *的文件 文件扩展名,你将能够在Windows资源管理器中双击它 变化。 一旦注册ry具有这些设置,IIS将*保持锁定状态 连接后60秒内的SQLite数据库文件离子被关闭。 希望这会帮助其他人解决这个问题。

登录后方可回帖

Loading...