数据库连接释放问题

数据库连接释放问题

超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

一看就是数据库连接池满了,应该是打开后没有释放的原因,但是我的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();
    }
  }
}
复制代码

 

 

代码基本上就是上面的形式,好像也没有什么不对的地方。下面就来调试一下。
首先创建一个单元测试:

1
2
3
4
5
6
7
8
9
[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();
        }
    }
}
复制代码

 

posted @   MedlarCanFly  阅读(5342)  评论(7编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示