可扩展的 MS Access ASP.NET 应用程序
Posted
技术标签:
【中文标题】可扩展的 MS Access ASP.NET 应用程序【英文标题】:Scaleable MS Access ASP.NET app 【发布时间】:2009-11-20 18:55:49 【问题描述】:我受到以下限制,无法解决:
-
只读数据:Microsoft Access
JET 4.0 旧版
ASP.NET 2.0
共享主机,控制很少。
OR 映射器 - LLBL Gen Pro
该应用程序是一个只读工具,可以读取 APP_Data 文件夹中的大量 Microsoft Access 数据库。大多数情况下都可以正常工作。
在负载下,它开始无法访问 Access MDB。
访问 Access MDB 以限制访问错误的最佳策略是什么?现在我尝试,然后 Thread.Sleep(500) 出错,然后再试一次。
【问题讨论】:
您是否正确关闭了所有数据库连接? 即使他正确关闭它们仍然可能遇到问题,访问对并发连接数没有限制吗? 是的,我使用专业级 OR Mapper 为我做这件事,LLBL Gen Pro 我很惊讶我的浏览器甚至可以在同一句话中呈现“可扩展”和“访问 mdb”... 我知道我知道...SQL Server 通常是去的地方,但我迷失在荒岛上,只有这些工具。 【参考方案1】:我认为在访问 Access 数据库时可能有一些方法可以修改隔离/并发/锁定选项,以消除管理锁的开销。也许试试“Mode=Share Deny None;”在连接字符串中。如果您随时以任何方式修改数据,我不会使用它,因为它几乎抛弃了您使用数据库获得的所有隔离/并发管理。使用风险自负。
【讨论】:
无论模式如何,一次仍然只能在连接上拥有 1 个活动结果集。这意味着所有请求都将按顺序处理,因此在高负载下,后续请求必须等待较早的请求完成才能获取数据,对吧? 老实说,我对此一无所知。我只是专门考虑 Access 处理锁的方式,因为没有“数据库服务器”,它通过将元数据写入文件来管理锁,然后由其他应用程序读取。我希望指定“Share Deny None”可以消除大量写入和检查这些锁的开销。 是的,明白了。我觉得你说的是一个很好的建议。我只是认为无论如何,他仍然会直接使用 Access 遇到瓶颈。 我的策略是限制问题,但接受会有一些问题。在这些情况下,我将强制刷新页面并希望下一次尝试能够通过。到目前为止,这种情况很少发生。【参考方案2】:数据多久更改一次?如果它是只读的,您可以将数据库中的数据加载到缓存中并从那里读取而不是直接从数据库中读取吗?
得到什么样的具体错误。我认为它们是连接错误?
【讨论】:
只读,但非常大。无法将其全部放入我拥有的服务器上的 RAM。错误是连接错误。 笨蛋,你能把一些较大的数据放在文件系统中(可能在 xml 中)并从那里读取,还是需要 RDBMS 来访问数据?【参考方案3】:这是一个可怕的解决方案,但如果你真的“迷失在只有这些工具的荒岛上”并且访问数据库是完全只读的,那么为每个数据库创建多个副本并只允许一定数量的连接一次进入其中任何一个。例如,如果您有 2 个访问数据库,MdbAA 和 MdbBB,则创建如下副本:
MdbAA01 MdbAA02 MdbAA03 MdbBB01 MdbBB02 MdbBB03然后当请求 MdbAA 时,查看当前有多少请求正在访问 MdbAA01,如果超过阈值,则尝试 MdbAA02 等。对 MdbBB 文件的任何请求执行相同操作。
就像我说的那样,这是一个非常糟糕的解决方案,但如果你真的别无选择,那么它可能对你有用。但实际上,听起来应用程序已经超出了 Access(和共享主机),所以是时候升级架构了。
【讨论】:
【参考方案4】:花一点钱,得到一些 sql 存储。您花了多少时间为损坏的音响系统安装拐杖?
如果该项目值得做,那么就值得投资一些冷硬的现金。
如果企业试图强迫您走这条路,请解释为什么您的选择不可行。如果您一开始就建议了这个选项,请增加一对并解释您错了的原因,但这是您可以解决的方法。
对不起,如果这显得轻率。
【讨论】:
-1:它确实显得轻率。更重要的是,它做出了一些狭隘的假设。是什么让你认为这个项目存在冷酷的现金。人们可能需要这些现金才能每周吃一次或两次,但这个项目可能非常值得一试。 完全同意。 MS Access/jet 不适合任何多用户环境。以上是关于可扩展的 MS Access ASP.NET 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 asp.net 从客户端读取 ms-access 数据库文件
连接到 MS Access 的 Mono 和 ASP.NET Web 应用程序
ASP.NET 在尝试插入 MS Access DB 时出错