悖论 - 在不打开连接的情况下知道数据库是否有变化

时间:2011-12-28 09:44:18

标签: c# database-connection sql-server-2008-r2 data-retrieval

我正在用C#编写一个需要执行以下操作的应用程序:

没有连接到数据库我需要检查数据库中是否有新的日志。如果有,那么我被允许打开连接并检索它们。

所以我只需要知道数据库中是否有新的日志(元素)而不打开它的连接。

服务器可以向管理员发送邮件,我可以监控邮箱的更改,但该解决方案是不可接受的。

服务器在插入新行时是否可以在磁盘上创建*.txt文件,文本指示新行,我可以在下载更改后检查和删除/编辑?

(数据库在SQL Server 2008 R2中)

甚至可能吗?任何/和/或其他选择都是受欢迎的。

非常感谢你们。

3 个答案:

答案 0 :(得分:2)

根据OP在该问题下的以下澄清意见:

  

有一个Web应用程序每隔30秒检查一次更改并显示最新的授权。数据库正在跟踪员工授权并经常更新。现在我正在构建桌面应用程序,它具有与服务器的本地连接并且可以更频繁地更新,但客户端确实 - 不希望应用程序每秒打开连接,aldo连接打开几ms。

我认为适当的解决方案是业务层。

如果构建IIS中托管的业务层,代表用户使用单个数据库用户进行访问(应用程序池用户或Web应用程序中的模拟用户)执行数据库访问,则连接池将减少显着与数据库建立的连接数。

Here is an MSDN article详细描述了连接池的机制和优势。

所有客户端(包括Web层)都将使用WCF或.Net Remoting(取决于您的.Net版本)连接到业务层,业务层将是唯一执行数据库访问的应用程序。

此方法的另一个好处是,您可以在DMZ内移动所有数据库访问(包括从Web客户端),以便无法从DMZ向外直接访问数据库。这对您的客户来说可能是一个很好的卖点。

我们广泛使用这种机制来满足非常大,非常安全和注重性能的客户。

<强>更新

作为替代方案,您可以让业务层每30秒查询一次数据库,提取必要的信息,并将其本地存储到某种数据库(Access,Sql Server Express等)中的业务层。收到客户端的请求后,将从本地数据存储而不是数据库提供这些请求。

您可以通过在global.asax的Application_Start事件中启动后台线程,或者通过添加每30秒到期的缓存条目并在缓存超时事件中执行工作来完成此操作。

这将每30秒(或任何时间)将连接数减少为1(如果未修改网络,则为2)。

答案 1 :(得分:0)

尝试监控DB文件夹中的文件更改日期。

答案 2 :(得分:0)

如果不会大规模部署客户端桌面应用程序,则可以使用SqlDependency。然后,您不必经常轮询数据库,而是数据库会在发生变化时通知您。

您还可以在使用SqlDependency的服务器上部署服务,然后从桌面应用程序连接到此服务。

如果这不是一个选项,this document会提到其他一些选项。

这两个可以适用于您的情况:

  • 在被监控的表上创建一个AFTER UPDATE触发器,其操作使用SQL Server Service Broker向需要通知的实体发送消息。
  • 使用Windows Server App Fabric Cache,它支持更改通知机制,基于内存对象缓存和向对象注册的回调函数。