关于数据库连接池得问题 (reader究竟该不该关闭!我做了测试,怎么关闭不关闭都是一样得?希望高手解答)

chenyanpeng2003 2005-10-30 08:01:33
最近在研究数据库连接池得问题,看了一些资料后。些了一个代码测试。
代码如下
private SqlDataReader DoSomeThing()
{
string connectstring = System.Configuration.ConfigurationSettings.AppSettings["test"].ToString();
SqlDataReader rd ;
this.Label1.Text="数据库已经打开!连接字符串是"+connectstring;
SqlConnection conn = new SqlConnection(connectstring);
SqlCommand cmd = new SqlCommand("select * from Life_Bdt_Class",conn);
try
{
conn.Open();
rd = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return rd;
}
catch(SqlException Ex)
{
Response.Write(Ex.Errors.ToString());
return null;
}
finally
{
// conn.Close();
}
}

然后 用这段代码调用:
private void Button1_Click(object sender, System.EventArgs e)
{
SqlDataReader dt = null;
for (int i = 1;i<1000;i++)
{
dt = DoSomeThing();
if (dt != null)
{
this.Label1.Text="下面是查询的结果◎!";
this.DataGrid1.DataSource = dt;
this.DataGrid1.DataBind();
dt.Close();

}
else
{
this.Label1.Text="出错了!! 还不快检查检查!!";
}
}
}

但是很奇怪 我在调用代码中“dt.Close();”这句,写不写好像都无所谓,程序都不报错,按理说系统默认得连接池应该最大是100,但是我在循环中调用得次数远远得大于这个最大值,为甚么我不关闭reader却没有问题呢??
希望高手指点
...全文
314 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
likai890120 2010-06-03
  • 打赏
  • 举报
回复
我现在 也遇到了 这个问题 我的SQlhelper 辅助类里面 没有 关闭 我都是在 DAl层 来读取的reader 那我想问问怎么 关闭它呢 我在IIS 里面运行 几次就会说链接超过 最大池容量 写了 Max Pool Size = 512; 好像没有起到作用 求助各位 高手 解决小弟的 困难
syeerzy 2005-10-30
  • 打赏
  • 举报
回复
DataGrid用的是它的父类BaseDataList里的DataBind(),
在系统底层反编译出来后在构建枚举器时(调用到 DbEnumerator )用了:
.override [mscorlib]System.Collections.IEnumerable::GetEnumerator
// Code Size: 22 byte(s)
.maxstack 4
L_0000: ldarg.0
L_0001: ldc.i4.0
L_0002: ldc.i4.s 32
L_0004: ldarg.0
L_0005: ldfld System.Data.CommandBehavior System.Data.SqlClient.SqlDataReader::_behavior
L_000a: and
L_000b: ceq
L_000d: ldc.i4.0
L_000e: ceq
L_0010: newobj instance void System.Data.Common.DbEnumerator::.ctor(System.Data.IDataReader, bool)
L_0015: ret


syeerzy 2005-10-30
  • 打赏
  • 举报
回复
this.DataGrid1.DataBind();


你反编译一下DataBind()看看它的IL就知道原因了,在DataBind()的处理中,如果DataSource是实现了IDataReader接口的类(比如你上面的SqlDataReader),在里面自己就Close()了.
lewjack 2005-10-30
  • 打赏
  • 举报
回复
你在连接字符串里头写上池的最大容量

应该会出错的。

说连接池已满。

上次就是出现了这样的问题。
极客行天下 2005-10-30
  • 打赏
  • 举报
回复
如果用Command,不关 reader不行,一旦连接池满(可能会很久)就报错,我碰到过
chenyanpeng2003 2005-10-30
  • 打赏
  • 举报
回复
现在关键不是操作connection对象,而是操作reader对象啊 我没有显示关闭reader按道理说connection不会关闭啊
为甚么也没有问题啊
还有第二个问题 : 希望高手回答
jxufewbt 2005-10-30
  • 打赏
  • 举报
回复
不会啊,我觉得自己写代码更灵活
cuike519 2005-10-30
  • 打赏
  • 举报
回复
因为你使用了CommandBehavior.CloseConnection参数来指定当DataReader关闭时Connection自动关闭,所以不用显式的关闭Connection。

SqlDataAdapter会自动管理和他关联的Connection对象,不用人为的干预。
chenyanpeng2003 2005-10-30
  • 打赏
  • 举报
回复
顺便在问一句:
默认的 使用SqlDataAdapter时会自动的打开和关闭连接,那么如果我在使用之前人为的打开数据库连接,使用后认为的关闭连接。会对程序有什么影响啊。是不是有点画蛇添足的感觉啊

呵呵
chenyanpeng2003 2005-10-30
  • 打赏
  • 举报
回复
重新產生一個SqlDataReader,原來的就關閉了呀???
是这样吗,每当产生一个新得,就得就一定会被关闭吗??
cnjack 2005-10-30
  • 打赏
  • 举报
回复
加了dt.Close(),肯定不會報錯呀,因為已經關閉啦;
不加dt.Close();你每次循環,都調用這個方法,dt = DoSomeThing();重新產生一個SqlDataReader,原來的就關閉了呀,因為dt = DoSomeThing();
chenyanpeng2003 2005-10-30
  • 打赏
  • 举报
回复
呵呵 ,基本上是明白了。其实.net自己有一个机制,当你在处理SqlDataAdapter 时 ,本来是自己管理他的连接的,但是在自己管理之前,他会检查究竟他的连接打开没有。如果打开了 ,她就不会去管理他,否则就打开连接。在使用完成后,他都会清一色的关掉连接,这就是原因。其实我们在使用完SqlDataAdapter后做的关闭连接的操作是没有用的,因为实际上已经被SqlDataAdapter关掉了。

reader 也是这个原理 ,当在excuteReader 方法中指定了CommandBehaver.close后 。其实不管你关不关掉连接,其实到最后reader会自己给你关掉的,但是不同的是你必须手动的打开连接 !
呵呵 不知道我说的对不对 !
chenyanpeng2003 2005-10-30
  • 打赏
  • 举报
回复
syeerzy:呵呵 ,虽然没有看懂上面的代码。但是你的意思我大概明白了。希望那位能够在讲明白点。
尤其是第二个问题 ,我看过不少代码都是清一色的先打开 执行SqlAdapter 然后关闭数据库。如果sqldataadapter能够自动的处理她的连接的话,那么实际上都是在“画蛇添足啊” ,我老有这个感觉。请高手给我解释解释

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧