当前位置: 移动技术网 > IT编程>开发语言>.net > 数据库连接释放问题

数据库连接释放问题

2019年08月05日  | 移动技术网IT编程  | 我要评论

枫树图片,莆田外贸,常州流量计

数据库连接释放问题

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

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网