数据库连接释放问题
“超时时间到了。 已超时,但尚未从池中获取连接。 这可能是因为所有池连接都已使用,并且已达到最大池大小。 ”
如果看到数据库连接池已满,应该是因为打开后仍未释放,但我的所有连接对象都使用using很快释放。 为什么会发生这种事呢? 花了很长时间才找到原因,所以写下来记录下来。
扩展小知识:
-联系数据库连接状态:(数据库SQL可直接运行) ) ) )。
SELECT [dec].client_net_address,[des].[program_name],[des].[host_name],count (
innerjoinsys.DM _ exec _ connections as [ dec ]
on [ des ].session _ id=[ dec ].session _ id group by [ dec ].client _ net _ address,[des].[program_name]
ORDER BY [des].[program_name],[dec].[client_net_address]
项目代码:
//创建连接到的工厂类
公共类连接工厂
{ privatestaticreadonlystringconnstring=configuration manager.connection strings [ ' SQL server数据库' ].connection strins
{
idbconnectionconn=new sqlconnection (connstring );
conn.Open (; 返回连接;
}
}//UserInfoDAL类
publicclassuserinfodal 3360 idal.iuserinfodal
{privateIDbConnection _conn; publicIDbConnection Conn
{get{//在工厂实例化连接目标
return _ conn=connection factory.create connection (;
}
从//id获取实体
公共信息保护(stringid ) )。
{using(Conn ) )
{ string query=' select * fromuserinfowhereuserinfo _ id=@ userinfo _ id '; 使用适配器
return userinfo=conn.query (query,new { UserInfo_id=id } ).SingleOrDefault );
}
}
}
代码基本上是上面的形式,似乎也没有错误的地方。 试着调试一下。
首先制作单元测试。
[TestMethod]
公共语音测试连接计数(
{
SQL server dal.userinfodaluserinfodal=newsqlserverdal.userinfo dal (
model.userinfo userinfo=userinfo dal.get entity ('3);
userinfo=userinfo dal.get entity ('3);
userinfo=userinfo dal.get entity ('3);
userinfo=userinfo dal.get entity ('3);
}
原因是发现get的使用方法错误后,不再使用get。 目前的解决办法如下。
publicclassuserinfodal 3360 idal.iuserinfodal
{publicIDbConnection Conn; 公共信息保护(stringid ) )。
{ using (conn=connection factory.create connection ()
{ string query=' select * fromuserinfowhereuserinfo _ id=@ userinfo _ id '; returnConn.query(query,new { UserInfo_id=id } ).SingleOrDefault );
}
}
}