我有一个asp.net网站和一个数据库。
该网站有一个网络服务,用于存储我软件的反馈。
据我所知,IIS会将创建的对象重用于顺序请求。
这给出了在Web服务的构造函数中连接到DB的原因,正确实现Dispose()
方法,并使用连接为每个[WebMethod] Request()
提供服务。当前版本遵循这些模式。
另一方面,我担心对Web服务的顺序请求之间的时间间隔将大于数据库连接超时。因此,我需要捕获一些异常并重新创建连接(对吗?)
另一种方法是在每个[WebMethod] Foo()
中连接和关闭。但我担心这可能会影响性能。
总结一下,
我应该在构造函数中连接到DB并在Dispose()
中关闭连接,还是为每个请求连接并关闭数据库?
答案 0 :(得分:5)
您应该为每个请求进行连接。
页面实例仅用于单个请求,因此您无法在其中存储连接以重复使用它。你必须将它存储在其他地方,这是如此复杂(有线程安全等),这绝对不值得。
关闭连接时,实际的数据库连接将返回到连接池。当连接池重新用于您创建的下一个连接对象时,连接池会正确地重置连接,这样您就可以获得以前使用的活动且不受影响的连接。
连接池工作正常,您应该使用它而不是尝试自己创建一个。
您无需执行任何特殊操作即可使用连接池,它内置于数据库驱动程序中。像往常一样打开和关闭连接对象。
答案 1 :(得分:1)
ADO.NET 2.0以后,数据库连接是合并的,因此连接的实际打开和关闭由数据库连接池管理,您可以在各个方法中自由打开和关闭它们,因为池将保持打开状态直到超时。您还可以配置池设置。
答案 2 :(得分:0)
您是否有任何连接池设施可供您使用?您的WS对象将从池中获取连接,并在完成时将它们返回。游泳池处理超时和真正的开放和关闭。
我的处理顺序是:
1)。如果你有连接池使用它。
2)。否则,请保持简单,打开和关闭每个请求。编写线程安全的连接池并非易事。
3)。如果性能证明是一个问题,那么调查每次连接开销是否是原因。如果是这样,找到一个游泳池implmentaiotn或(最后的手段)代码汇集自己。