系统是B/S 结构的应用。
使用页面类来统一创建链接和关闭连接,其他页面在使用的时候集成这个页面类。
现在问题时,浏览一段时间网站以后,通过查找发现活动监视器里面出现很多睡眠的进程,测试发现是页面进行数据库读取操作以后,关闭的时候直接变成睡眠了。这样导致连接池很快就不能用了。各位高手知道什么原因吗?
查了很多资料说是链接没有关闭的问题,但是我已经在OnUnload中关掉页面中的链接了呀。是不是我这种做法有问题呢?谁给看看谢谢了。//初始化的时候创建数据链接
protected override void OnInit(EventArgs e)
{
da = new DataAccess();
da.ConnectString = this.ReadConfig("db_Connection");
da.conn = da.getConn();
System.Web.HttpContext.Current.Session["userid"] = 1;
base.OnInit(e);
}//页面结束的时候关闭连接
protected override void OnUnload(EventArgs e)
{
if (da != null) da.Dispose();
base.OnUnload(e);
}//直接关闭连接
public void Dispose()
{
conn.Close();
conn.Dispose();
}
使用页面类来统一创建链接和关闭连接,其他页面在使用的时候集成这个页面类。
现在问题时,浏览一段时间网站以后,通过查找发现活动监视器里面出现很多睡眠的进程,测试发现是页面进行数据库读取操作以后,关闭的时候直接变成睡眠了。这样导致连接池很快就不能用了。各位高手知道什么原因吗?
查了很多资料说是链接没有关闭的问题,但是我已经在OnUnload中关掉页面中的链接了呀。是不是我这种做法有问题呢?谁给看看谢谢了。//初始化的时候创建数据链接
protected override void OnInit(EventArgs e)
{
da = new DataAccess();
da.ConnectString = this.ReadConfig("db_Connection");
da.conn = da.getConn();
System.Web.HttpContext.Current.Session["userid"] = 1;
base.OnInit(e);
}//页面结束的时候关闭连接
protected override void OnUnload(EventArgs e)
{
if (da != null) da.Dispose();
base.OnUnload(e);
}//直接关闭连接
public void Dispose()
{
conn.Close();
conn.Dispose();
}
是不是你这个方法放的位置不对呀????没有关闭??
select * from table ;
select * from table2;
conn.close();如果是这种写法的话。数据库中的链接应该是什么状态?关闭还是睡眠呢?
conn.Dispose();
有执行,另.手功回收
GC.Collect()
public void Dispose()
{
conn.Close();
conn.Dispose();
}
是DataAccess类的成员吗?你调用了da.Dispose();方法,但是不知道你那个方法里面是否有关闭连接.
这样是不是不好哦
我看到的很多都是要用的时候打开
用取完数据就关了
dispose是个方法的。怎么查看是不是dispose了?不过语句执行了。没有出错的。
这是好习惯呀,呵呵dispose是个方法的。怎么查看是不是dispose了?不过语句执行了。没有出错的。
你看它走了那个方法没有???
所以才采用一个页面一次开关的办法。见鬼的事情出现了。刚刚调试的时候,发现每次连接都可以正常关闭了。代码什么的也是刚才的那些。现在就不会出现一堆连接睡眠的情况了。。
也不知道是刚才那句修改的问题。我在找找看。有过修改的就是那个OnUnload(),等我在研究研究。
protected override void OnUnload(EventArgs e)
{
if (da != null)
{
da.conn.Close();
da.conn.Dispose();
GC.Collect();
//da.Dispose();
}
/// 根据参数方式执行sql语句返回数据第一行第一列
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="sqlParameter">参数集合</param>
/// <returns>返回dataset数据集</returns>
public string getSomeQuery(string sql, SqlParameter[] sqlParameter)
{
string some = string.Empty;
try
{
Open();
SqlCommand sqlCommand = new SqlCommand(sql, con);
sqlCommand.Parameters.AddRange(sqlParameter);
object results = sqlCommand.ExecuteScalar();
if (results == null)
{
some = string.Empty;
}
else
{
some = results.ToString();
}
sqlCommand.Dispose();
sqlCommand.Connection.Close();
}
catch (Exception ex)
{
some = string.Empty;
throw ex;
}
finally
{
Close();
}
return some;
} #region Connection Open and Close
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
if (con.State != ConnectionState.Closed)
{
con.Close();
}
} /// <summary>
/// 判断打开数据库连接
/// </summary>
public void Open()
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
}
是由于加了GC.Collect()后那些打开的睡眠链接,就都没了。
不过这是什么原因呢?为什么用Close 和 Dispose无法消除那些睡眠的链接呢?
不过只是使用Conn.close()和conn.dispose()的话。在数据库中还是能够看到那些链接都是睡眠状态。如果再加上GC.Collect()的话,那些个睡眠的就都没了。
搞不懂了
正解在这呢!呵呵sqlConnection conn = null;
try
{
if(conn == null)
{
sqlConnection conn=new sqlConnection();
conn.connectionString="……";
}
if(con.State != ConnectionState.Open)
conn.Open();
……
int a=1/0;//该行出现异常
//conn.close();
}
catch(Exception ee)
{
Response.write(ee.toString());
}
finally
{
if(conn != null)
{
conn.Close();
conn.Dispose();楼主参考一下这个方法看能不能帮到你?
是啊,我一般使用数据库连接的时候,都是用using块的,所以都不去写什么Close方法,也没有考虑过手动去关闭,一旦需要手动去关闭了,这里面就涉及到了是否立即关闭了.
using (SqlConnection conn=new sqlConnection();)
{}
非法关闭可能没执行关闭操作。
等有时间在好好看看到底什么原因导致Conn.close不起作用吧。