我做在C#中的Web应用程序与ASP.Net和我使用的是SQL数据库了。在我看到的指南(关于SqlConnection和SqlCommand)中,他们每次想要发送查询时都会打开并关闭SQL连接。但我不知道这是处理连接的最佳方式,因为我也学到了一些PHP的,据我所知,在PHP中打开一个连接只有一次,在启动。那么处理连接的最佳方式是什么?启动和关闭SQL连接 - 在开始和结束时还是每次需要时?
回答
通常你应该有一个连接和交易,为Web请求的长度。
如果你有两个连接,你可能有不一致的数据。例如在第一个查询中,您检查银行余额,然后关闭它。然后,您将5美元添加到余额中,并将其保存在下一个连接中。如果其他人在两个连接之间增加了5美元会怎么样?它会失踪。
做最简单的事情就是打开连接的Global.asax的BeginRequest和保存掳到的HttpContext。每当你需要连接时,从那里拉它。请确保您.Close在连接你的EndRequest
,并阅读了这里连接池:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx 这不是“昂贵”反复打开和关闭连接,提供的用户名是每次都一样。在.NET
通常的做法是打开一个SqlConnection和使用SqlCommand,然后他们两个处理。
using(SqlConnection connection = new SqlConnection("myConnectionString"))
{
using(SqlCommand command = new SqlCommand("dbo.SomeProc"))
{
// Execute the command, when the code leaves the using block, each is disposed
}
}
由于与数据库的连接是一个昂贵的资源,所以最好尽可能晚地打开sql连接并尽早关闭。所以你应该在执行命令之前打开连接,并在执行完成后关闭它。
另一方面,如果要在很短的时间间隔内执行许多命令,最好打开一次连接并在所有命令执行后关闭。
Ado.Net的连接池已经为您管理,因此您不必担心重新使用连接。
您可以使用Using statement关闭和处置连接:
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection("my_connection_string"))
{
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * from Table", conn))
{
conn.open();
adapter.Fill(dt);
}
}
对于他们首先不是因为有正在使用连接池,但SqlCommand的具有过载采取一个连接对象,所以你可以保持连接并传递它。
一般而言:
使用(VAR TS =新的TransactionScope()){ 使用 { 使用 (VAR命令=新的SqlCommand(连接(VAR连接=新的SqlConnection(...)),。 ..) { ... }
using (var command = new SqlCommand(connection, ...)
{
...
}
}
ts.Complete(); }
当然,我会建议在这一点上使用LINQ到SQL或EF。
如果您不想担心打开和关闭连接,请试试Enterprise Library中的数据访问应用程序块。
- 1. Oracle开始和结束余额 - 需要SQL还是PL/SQL?
- 2. 每次模式更改时,是否需要打开和关闭连接?
- 3. 每次更改libGDX enableBlending时都需要开始/结束?
- 4. 方法终止时是否需要关闭连接和语句?
- 5. 在每次启动时总是需要链接到框架
- 6. 是修改过程的开始时间还是结束时间
- 7. 启动cmd/k,然后在另一批次结束时关闭
- 8. Android服务设计 - 从活动开始还是仅在需要时开始?
- 9. 多次打开和关闭mysql连接
- 10. 所有手风琴开启/关闭时一次打开和关闭一次
- 11. 打开和关闭连接到SQL Server
- 12. PetaPoco数据库类应该在每次请求时还是每次需要时创建一次?
- 13. 关闭连接是否自动关闭语句和结果集?
- 14. 需要在每次Eclipse开始时配置Android库
- 15. 是“开始”还是“结束”保留字?
- 16. SWI-Prolog文件是否需要开始和结束字符?
- 17. Dygraph选择开始和结束时间
- 18. 开始和结束一段时间
- 19. 从创建开始和结束时间
- 20. 的开始和结束时间
- 21. 窗口的开始和结束时间
- 22. 包开始和结束时间
- 23. Modelsim模拟开始和结束时间
- 24. Web会话何时开始和结束?
- 25. 取下开始和结束时或线
- 26. SQL关闭连接 - 需要增加超时?
- 27. UploadServiceBroadcastReceiver在活动结束时关闭
- 28. Daterange Picker开始结束开始时
- 29. 我的时间在开始时间和结束时间之间
- 30. postgress:SQLQuery:每周开始和结束日期
+1确切地说,连接池在这里是关键。 – rsenna 2011-04-06 18:51:24
乔恩有一个我认为的观点:http://stackoverflow.com/questions/1058591/net-sqlconnection-class-connection-pooling-and-reconnection-logic – tugberk 2012-02-28 13:27:47