我认为这是因为我没有关闭我的数据库的连接。我在下面为我的Datalayer发布了代码。我需要关闭我的连接吗?我怎么也这样做?这是引起问题的代码吗?
下面是错误代码:
超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
public DataTable getPictures()
{
//get database connection string from config file
string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"];
//set up sql
string StrSql = "SELECT MEMBERS.MemberName, Picture.PicLoc, Picture.PicID, Picture.PicRating FROM Picture INNER JOIN MEMBERS ON Picture.MemberID = MEMBERS.MemberID WHERE (Picture.PicID = @n) AND (Picture.PicAproval = 1) AND (Picture.PicArchive = 0)AND (MEMBERS.MemberSex = 'F')";
DataTable dt = new DataTable();
using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString))
{
daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int);
daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray();
//fill data table
daObj.Fill(dt);
}
return dt;
}
public int GetItemFromArray()
{
int myRandomPictureID;
int[] pictureIDs = new int[GetTotalNumberOfAprovedPictureIds()];
Random r = new Random();
int MYrandom = r.Next(0, pictureIDs.Length);
DLPicture GetPictureIds = new DLPicture();
DataTable DAallAprovedPictureIds = GetPictureIds.GetPictureIdsIntoArray();
//Assign Location and Rating to variables
int i = 0;
foreach (DataRow row in DAallAprovedPictureIds.Rows)
{
pictureIDs[i] = (int)row["PicID"];
i++;
}
myRandomPictureID = pictureIDs[MYrandom];
return myRandomPictureID;
}
public DataTable GetPictureIdsIntoArray()
{
string strConectionString = ConfigurationManager.AppSettings["DataBaseConnection"];
//set up sql
string StrSql = " SELECT Picture.PicID FROM MEMBERS INNER JOIN Picture ON MEMBERS.MemberID = Picture.MemberID WHERE (Picture.PicAproval = 1) AND (Picture.PicArchive = 0) AND (MEMBERS.MemberSex ='F')";
DataTable dt = new DataTable();
using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, strConectionString))
{
//fill data table
daObj.Fill(dt);
}
return dt;
}
答案 0 :(得分:3)
我相信SqlDataAdapter自己处理连接。但是,在多个背靠背fill()到数据适配器的情况下,在每个fill()请求中打开连接的性能更高。结果是数据库连接被多次打开和关闭。
我认为您可以自己控制连接。
using (SqlConnection cnn= new SqlConnection (strConectionString))
using (SqlDataAdapter daObj = new SqlDataAdapter(StrSql, cnn))
{
daObj.SelectCommand.Parameters.Add("@n", SqlDbType.Int);
daObj.SelectCommand.Parameters["@n"].Value = GetItemFromArray();
cnn.Open();
//fill data table
daObj.Fill(dt);
cnn.Close();
}
答案 1 :(得分:2)
如果您不想猜测是否有效处理连接,可以运行查询以告知有多少是打开的:
SELECT
DB_NAME(dbid) as DatabaseName,
COUNT(dbid) as ConnectionCount,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
order by count(dbid) desc
答案 2 :(得分:1)
填充后添加此行。
daObj.Dispose();
编辑: 您也可以在IIS中回收池。但最好的做法是一旦使用就关闭连接。
答案 3 :(得分:0)
使用确保将调用Displose。我认为发布的代码很好
默认最大池大小为100.使用集成安全性和登录用户的可能性不大于100。
请检查配置文件中DataBaseConnection中的某些设置是否与连接池冲突。请参阅:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.80).aspx
请检查SqlDataAdapter或SqlDataConnection对象是否未在其他地方处置。