資料庫連接釋放問題 “超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。”一看就是資料庫連接池滿了,應該是打開後沒有釋放的原因,但是我的Connection對象都使用using及時釋放了,怎麼會出現這種情況呢?花了很長時間終於到了原因 ...
資料庫連接釋放問題
“超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。”
一看就是資料庫連接池滿了,應該是打開後沒有釋放的原因,但是我的Connection對象都使用using及時釋放了,怎麼會出現這種情況呢?花了很長時間終於到了原因,所以寫下來記錄一下。
擴展小知識:
--查詢資料庫的連接情況:(資料庫SQL可直接執行) SELECT [dec].client_net_address, [des].[program_name], [des].[host_name], Count([dec].session_id) AS connection_count FROM sys.dm_exec_sessions AS [des] INNER JOIN sys.dm_exec_connections AS [dec] ON [des].session_id = [dec].session_id GROUP BY [dec].client_net_address, [des].[program_name], [des].[host_name] ORDER BY [des].[program_name], [dec].[client_net_address]
項目代碼:
//創建連接對象的工廠類 public class ConnectionFactory { private static readonly string connString = ConfigurationManager.ConnectionStrings["SQLServerDatabase"].ConnectionString; public static IDbConnection CreateConnection() { IDbConnection conn = new SqlConnection(connString); conn.Open(); return conn; } } //UserInfoDAL類 public class UserInfoDAL:IDAL.IUserInfoDAL { private IDbConnection _conn; public IDbConnection Conn { get { //工廠實例化一個連接對象 return _conn = ConnectionFactory.CreateConnection(); } } //根據id獲取entity public UserInfo GetEntity(string id) { using (Conn) { string query = "select * from UserInfo where UserInfo_id = @UserInfo_id"; //使用dapper return userInfo = Conn.Query<UserInfo>(query, new { UserInfo_id = id }).SingleOrDefault(); } } }
代碼基本上就是上面的形式,好像也沒有什麼不對的地方。下麵就來調試一下。
首先創建一個單元測試:
[TestMethod] public void TestConnectionCount() { SQLServerDAL.UserInfoDAL userInfoDAL = new SQLServerDAL.UserInfoDAL(); Model.UserInfo userInfo = userInfoDAL.GetEntity("3"); userInfo = userInfoDAL.GetEntity("3"); userInfo = userInfoDAL.GetEntity("3"); userInfo = userInfoDAL.GetEntity("3"); }
發現原因是因為get的使用不當後,就乾脆不用get了,目前的解決方案為:
public class UserInfoDAL:IDAL.IUserInfoDAL { public IDbConnection Conn; public UserInfo GetEntity(string id) { using (Conn=ConnectionFactory.CreateConnection()) { string query = "select * from UserInfo where UserInfo_id = @UserInfo_id"; return Conn.Query<UserInfo>(query, new { UserInfo_id = id }).SingleOrDefault(); } } }