2009-03-04 79 views
3

我目前正在用ASP.NET创建一个webportal,它严重依赖于数据库的使用。基本上,任何用户的每个(几乎每一个:P)GET查询都会导致从Web服务器向数据库进行查询。打开数据库连接一次或每次数据库操作?

现在,我真的很新,而且我非常关心性能。由于我在这方面缺乏经验,所以我不知道会发生什么。

我的问题是,使用ADO.NET,将一个静态连接从Web服务器打开到数据库,然后在每次查询数据库之前检查此连接的完整性,是否更明智? - 或者,我最好在每次查询之前打开连接,然后关闭它?

在我的脑海中,第一个选项会更好,因为在每次查询之前您节省了握手等时间,并且既节省了数据库和服务器端的内存,又节省了一次连接,进场? 2个查询可能同时发送可能破坏其他完整性或混合返回的数据集?

我试过在这里和在网上到处寻找关于这方面的一些最佳实践,但没有运气。最近我得到了这样的:is it safe to keep database connections open for long time,但似乎更适合分布式系统,其中你有多个用户的数据库,而我只有我的网络服务器..

回答

8

你很早就担心性能。

无论如何,连接是由框架汇集的。你应该打开它们,使用它们,尽快处理它们。

喜欢的东西...

public object Load() 
{ 
    using (SqlConnection cn = new SqlConnection(connectionString)) 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
    cn.Open(); 
    return cm.ExecuteScalar(); 
    } 
} 
3

最好让ADO.NET处理连接池。如果认为需要,它会保持连接,但不要使用静态连接对象。这只是闻起来。最好将连接对象传递给需要它的方法,并在using块中创建连接。

1

你应该总是关闭整理你的数据库交互之后的连接。 ADO.NET具有连接池功能,可以有效地连接重用。每当你打开第二,第三和后续连接 - 他们将从一个几乎没有开销的游泳池中被带走。

希望这会有所帮助。

0

ADO.NET确实连接池。当您在连接对象上调用close时,它将保持池中的连接,使下一个连接快得多。

0

你绝对不想为每个数据库调用打开一个连接,这将导致非常快速的非常差的性能。建立数据库连接非常昂贵。

而应该使用的是连接池。该池将管理您的连接,并尝试在可能的情况下重新使用现有连接。

+0

这听起来像他应该自己做。但让ADO.Net做他的工作将是最好的。 – BendEg 2015-08-25 14:37:28

0

我不知道你的平台,但看看连接池 - 必须有一个库或实用程序可用(无论是在基本系统或作为附加件,或提供数据库驱动程序)将提供将多个活动连接集中到数据库的方法,这些连接已准备就绪,并且在您从池中获得一个时可以使用。

说实话,我期望在任何数据库抽象库(有一个可用的选项来禁用它)默认情况下发生池。看来,ADO.NET这样做。

-2

真的要问的第一个问题是为什么你是否非常关心性能?你预期的工作量是多少?你试过了吗?

但是总体来说,是的,拥有一段时间的开放连接比每次重新打开数据库连接更聪明一点;取决于连接的类型,网络问题和月球的相位,它可能需要一秒或更长时间才能建立初始连接;如果你的工作量是每隔五秒左右就会得到一次以上的GET,那么你会更快乐地站在一起。

+0

连接池做得更好。如果您要建立长期联系,那会是:每个客户?每线程?按应用程序? “我的第一个asp.net应用程序”保持一个连接打开并通过它。切换到打开状态,执行关闭操作,可节省数小时的应用程序时间。 – 2009-03-04 15:30:23

+0

我说什么不同意? – 2009-03-04 18:31:03

1

我会比高级连接池更多地考虑缓存。每一次获得都需要数据库命中?

如果您的门户网站拥有共同的内容和用户特定的内容,则可以使用缓存存储常用项目以及损坏的密钥(使用用户标识),您可以存储用户特定的项目。