我正在为一组WCF服务设计架构。由于这些服务的部署性质(远程部署到客户端站点上的许多无法管理的系统上,因此我们无法承担数据库服务器的管理开销),因此数据存储必须基于文件(我们非常倾向于文件格式的XML。)
再一次,服务的性质意味着单个文件中存在并发问题的可能性,我正在尝试提出一个在所有实例中都能正常运行的系统,并避免在有所有实例时尝试读取数据写操作挂起。
我目前的想法是采取两种可能的途径之一。
锁定文件
这将按以下方式运作。 所有文件操作都将具有锁定机制。在请求数据之前,读取将检查以确保当前未锁定所需文件。如果文件被锁定,则服务应该休眠一段随机的毫秒数(在尚未确定的范围内)。写操作将设置锁定,提交数据然后解锁文件。
后台附加程序为服务提供数据
此版本将在后台具有辅助应用程序,公开可由服务调用的各种公共静态方法。后台应用程序将独自负责维护数据的内存中表示,向服务提供数据,以及使文件副本与内存对象保持同步。在这方面,它的行为就像是一个事务化数据库服务器。
在实现创建这些类型服务的目标的两种(或可能是其他)方法中,哪种选项可以提供最大的性能且并发冲突的可能性最小?选项1设计的简单性意味着我更赞成那个,但我担心性能可能因“睡眠”操作而受损。
答案 0 :(得分:1)
我知道你说你不想要数据库服务器的管理开销,但为什么不使用像SQL Express这样的东西。您只需要安装运行时。使用Access数据库文件也是如此。只需要一个运行时。然后,您可以解决这些其他问题,您可以确保将运行时作为安装程序所需组件的一部分。我认为这会让你的生活更轻松,你不会有真正的数据库服务器的开销。
另一种选择就像SQL Lite一样。它只需要在您的应用程序中部署几个dll。没有任何开销,但有一个数据库需要自己管理所有文件访问权限。
SQL Lite,MySQL,甚至SQL Express都小巧轻便,可以在手持设备上用作数据存储,所以我不明白为什么这样的东西在这里不起作用。
答案 1 :(得分:1)
我会将John Saunders的评论转变成答案:
这两个选项很可能比简单安装Sql Express需要更多的管理开销。
您可以从桌面目标功能中获益,例如安静安装和附加的db文件。
关于1),如果文件被锁定时发生崩溃会发生什么?
答案 2 :(得分:0)
结帐SQL Server Compact edition。它不需要任何正在运行的服务,并支持XCopy部署。
答案 3 :(得分:0)
数据库是对一组文件的抽象。他们要求你重新发明轮子,只需花费一小部分。我认为你真的需要回过头来解释尝试编写自己的数据库所带来的业务影响 - 它需要更长的时间,更多的成本,而且更不可靠。
答案 4 :(得分:0)
如果您真的必须直接写入文件系统,我建议您让服务对象与服务上托管的对象进行通信,该对象维护文件的权限,而不是让多个对象直接访问它。然后,您可以适当地锁定该对象以保持一致性。