我有一个 ASP.NET 项目。我正在连接到数据库,然后关闭并处理连接对象。但是当有人进入我的站点时,MS Access 会创建一个临时的 dbname.ldb。当我想从我的服务器下载我的原始 mdb 文件时,它不会让我访问 mdb 文件。如果服务器中有 ldb 文件,我将无能为力。它正在锁定 mdb 文件,我无法移动它。所以有什么问题?我正在打开连接并关闭它。那么为什么这个ldb文件在连接关闭后不删除自己。
6 回答
IIS 中的 Web 应用程序通过连接池保持连接打开。如果在 IIS 设置为终止您的 Web 应用程序的时间内没有进一步的连接,或者您可以重新启动应用程序(并在任何人进入之前复制文件),则 IIS 应用程序最终将关闭。
这只是 Access 不是此类应用程序数据库的好选择的一个原因。
如果脚本在关闭连接之前产生任何类型的错误,则连接可以保持打开状态。检查带有自定义错误 500 页面的脚本,该页面在文本文件中记录错误,您将查看是否是这种情况。无论如何,ldb 文件并不危险,因此您可以创建一个脚本以每天一次左右删除它们。这是使用 MS Access 工作 Web 应用程序的缺点之一。如果可以,尝试迁移到 MSSQL 或迁移到 MySQL,最后一个可以从 .NET 或经典 ASP 使用,而 ADO 或 ADO.NET 与适当的驱动程序没有问题。
该.ldb
文件是.mdb
Access 数据库的锁定文件。每次打开数据库时,Jet 引擎都会创建锁定文件并在有人连接时保持打开状态。一旦没有其他客户端连接到数据库,Jet 将删除锁定文件。
因此,您看到锁定文件的原因有两个:
- 有一个开放的连接。
- 连接中断,无法删除锁定文件。
如果检查服务器的错误日志没有提供任何信息,请尝试将应用程序内的所有数据库访问记录到文件中:附加有关时间、连接和其他有用调试信息的信息。
这可能是一种快速调试问题并查看连接处于打开状态的位置和时间的简单方法。
或者,您可以查看这篇 CodeProject 文章:在 ASP.NET Web 应用程序中查找“泄漏的”数据库连接。
您可能还需要考虑连接池 - 当您关闭连接时,c# 实际上会在真正关闭它之前将它保持打开一段时间(30 秒?60 秒?),以防它可以重新使用。这可能是一个问题。
删除 .ldb 文件的一种解决方法是执行以下操作:
- 制作访问数据库的副本
- 删除原来的access数据库
- 删除 .ldb 文件
- 将访问数据库的副本重命名为原始数据库的名称。
您需要在关闭并处理连接对象后调用GC.Collect() :)