我有一个连接到远程数据库的.net客户端应用程序.在客户的整个生命周期内保持单个连接打开是否安全(小时)?
如果我有多个(10或100)客户端运行,答案是否成立?
谢谢
这样做绝对是安全的.这是客户端 - 服务器应用程序的工作方式 如果您使用的是三层应用程序,则应用程序服务器将保持打开的连接池.
可伸缩性是一个问题,或者至少在机器比现代套件具有更少内存的日子里.使用双层(客户端 - 服务器)应用程序,每个客户端打开一个连接并保持打开状态.这有几个影响:
每个连接使用内存,因此大量(相对)空闲连接将耗尽机器内存.但是,现代64位服务器可能具有数十或数百GB的内存,因此它可以支持大量此类连接.
如果在客户端计算机上未提交事务,则只要事务处于打开状态,锁就会保持打开状态.当有人可以开始交易,去吃午餐并忘记他们已经打开了一些东西时,这导致了一类问题.这将锁定事务引用的任何记录一次数小时.
但是,事务可以轻松覆盖数据库的多个连接,这对于连接池来说更难.
在3层体系结构中常见的池化体系结构在应用程序服务器和数据库之间具有有限数量的连接.查询只使用下一个可用连接,并立即提交更新.这使用较少的资源,因为您只打开了有限数量的连接,并且(与乐观并发策略结合使用)将消除大量潜在的应用程序并发问题.
为了使用长事务(即覆盖多个数据库调用的事务),必须将事务与连接分离.这是TP监视器的基本体系结构,有一些标准协议,如XA或OLE事务来支持这一点.如果此类外部管理事务不可用,则应用程序必须构建一个补偿事务,以撤消应用程序事务所做的更改.工作流管理系统经常使用这种类型的体系结构.
每个业务操作打开和关闭您的连接
如果您正在谈论客户端/服务器应用程序,我建议您在完成使用后立即关闭每个连接.虽然每个单独的应用程序实例可能会在打开连接时遇到小的性能影响,但整个应用程序的扩展性会更好.这在某种程度上取决于您使用的数据库服务器.SQL Server将根据安装的硬件处理不同数量的并发连接.如果您想将客户端/服务器应用程序扩展到数千个桌面,小型数据库服务器可能无法处理所有具有开放连接的桌面,但可以很好地处理数千个桌面,只打开一些连接.
几年前我亲眼看到了这一手.然后,在整个组织中部署了一个部署到几个没有问题的部门的应用程序.申请很快就非常非常缓慢.该组织正在考虑为他们的数据库服务器购买一块非常昂贵的硬件以获得一些性能.我建议他们在每次业务操作后打开和关闭数据库连接.幸运的是,他们已经构建了应用程序,因此这不是一个很难的改变.他们在每周一次的网络更新中进行了更改并将其推出.一夜之间,应用程序性能得到了显着改善.他们节省了数千美元.
长期联系的困难在于你可能不完全确定它们仍然在那里.网络故障,服务器重启或状态防火墙忘记某些状态都可能导致"陈旧"连接看起来打开,但是当您尝试使用它时会出错.
连接池方案通常通过让某些系统偶尔检查池中的连接是否正常,或者在删除未使用的连接之后超时来解决此问题.
一般来说,在分布式系统中,您需要围绕各种类型的故障进行编码,保持长期连接打开使这更加困难 - 但如果您乐意这样做,那就很好.