我使用静态方法在简单的静态类中实现了我的业务逻辑。这些方法中的每一个都会在被调用时打开/关闭SQL连接:
public static void DoSomething()
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
但我认为传递connection对象并避免打开和关闭连接可以节省性能。很久以前,我用OleDbConnection类(对SqlConnection不太确定)做了一些测试,它确实对我的工作很有帮助(就我记忆所及):
//pass around the connection object into the method
public static void DoSomething(SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
所以问题是-我应该选择方法(a)还是方法(b)?我在另一个堆栈溢出问题中读到,连接池为我节省了性能,我根本不必费心……
PS。这是一个ASP.NET应用程序--连接只存在于web请求期间。不是win-app或服务。
发布于 2010-12-14 21:02:54
坚持选择a。
连接池是您的朋友。
发布于 2010-12-14 21:05:01
每次都使用方法(a)。当您开始扩展您的应用程序时,如果您不这样做,处理状态的逻辑将变得非常痛苦。
连接池做它在tin上所说的事情。只要想想当应用程序扩展时会发生什么,以及手动管理连接打开/关闭状态会有多难。连接池在自动处理这方面做得很好。如果您担心性能问题,可以考虑使用某种内存缓存机制,这样就不会阻塞任何东西。
发布于 2010-12-14 21:02:25
总是在完成连接后立即关闭它们,这样它们的底层数据库连接就可以回到池中,并可供其他调用者使用。连接池得到了很好的优化,因此这样做不会带来明显的损失。对于事务的建议基本上是一样的--当你完成时,保持它们简短并关闭。
如果在使用多个连接的代码周围使用单个事务时遇到MSDTC问题,情况会变得更加复杂,在这种情况下,您实际上必须共享连接对象,并且只有在事务完成后才关闭它。
然而,您在这里是手工操作的,所以您可能想要研究一下为您管理连接的工具,如DataSets、Linq to SQL、实体框架或NHibernate。
https://stackoverflow.com/questions/4439409
复制相似问题