數據庫連接釋放問題


數據庫連接釋放問題

超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。

一看就是數據庫連接池滿了,應該是打開后沒有釋放的原因,但是我的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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM