当前位置:编程学习 > C#/ASP.NET >>

页面刷新:超时时间已到 但是尚未从池中获取连接

现在有个问题请教大家,页面每隔一段时间会刷新页面.
每次刷新页面就会走后台逻辑,大概的代码如下:
string ConnectionString = "Data Source=abc;user=abc;password=abc;";
OracleConnection conn = new OracleConnection(ConnectionString);
conn.Open();
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = "select homephone,officephone,birthday from employee t where rownum=1  order by birthday desc"               
OracleDataReader odr = cmd.ExecuteReader();
while (odr.Read()){
....
}
odr.Close();
conn.Close();


几百个用户,同时连接,过10秒就刷一次,都会走这个逻辑.就会出现如下报错信息:
超时时间已到 但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用 并且达到了最大池大小。

连接也关闭了啊,
conn.Close();

为什么还会出现上面的报错信息啊?
刚学.net,不是很懂,请大家帮下忙,谢谢啊!
--------------------编程问答-------------------- 最好加入异常处理,
将conn.Close();放到finally(){}中进行处理。
这样可以保证在查询出现异常时也可以释放 --------------------编程问答-------------------- using(OracleConnection conn = new OracleConnection(ConnectionString))
{

}

或加
conn.Dispose();

--------------------编程问答-------------------- try{

catch{con.Dispose;}
finally{
con.close();
} --------------------编程问答-------------------- odr.Dispose();
conn.Dispose();
odr.Close();
conn.Close();


设置自动回收。。。。 --------------------编程问答-------------------- OracleDataReader 
你的这个啊,用完没有dispose();啊,导致了一会儿功夫,你的连接就用完了。 --------------------编程问答-------------------- 在异常控制里关连接,所有关连接的地方,显示调用Dispose,连接串中加入Incr Pool Size=5; Max Pool Size=200;Min Pool Size 10 加大连接池的容量;
--------------------编程问答-------------------- Connection Lifetime=120;Connection Timeout=60;实在不行再加上这个强制指定连接串的生存时间和池中自由连接串的释放时间
--------------------编程问答-------------------- 谢谢!!

hwbox,你好,你说的加入Incr Pool Size=5; Max Pool Size=200;Min Pool Size 10 

是说直接在
string ConnectionString = "Data Source=abc;user=abc;password=abc;";
后面加吗?

像这样?
string ConnectionString = "Data Source=abc;user=abc;password=abc;Incr Pool Size=5; Max Pool Size=200;Min Pool Size 10 
";


--------------------编程问答-------------------- 是的,Min Pool Size=10 我忘了写=号了
--------------------编程问答-------------------- 意思是当池中无可用自由连接时一次性加开5个可用空闲链接,池上限200个,池下限10个;
Connection Lifetime=120;Connection Timeout=60;
第是连接的生命周期,默认是0,就是在用的时候就一直连着。第二个是空闲的连接多久关掉,都是秒为单位。 --------------------编程问答-------------------- TimeOut设置的时间长一些,多等会儿。另外用using()来关闭,以保证发生异常的情况连接也能关闭。 --------------------编程问答--------------------
引用楼主 acboboly 的回复:
while (odr.Read()){
....
}


你这里要做什么?

--------------------编程问答-------------------- 额...谢谢

还是有个问题不是很明白
string ConnectionString = "Data Source=abc;user=anhui;password=anhui;Max Pool Size=200;Min Pool Size=10;";
OracleConnection conn = new OracleConnection(ConnectionString);

每次不同的用户进来,都走上面这段逻辑
这个Max Pool Size=200是指每个不同的用户最大的连接是200个,还是指oracle这个时候最大的连接数是200啊,就是说整个网站最大200

感觉好像每次不同的用户进来都new OracleConnection(ConnectionString);各管各的样的.
Max Pool Size=200好像是连接池的概念,每次从连接池里取样的.
但是每次进来都是new的一个OracleConnection

不是很明白其中具体的原理啊,这个Max Pool Size=200到底是指的什么?是定义连接池吗?
每次刷新都定义连接池???不是很明白哦! --------------------编程问答--------------------
引用 13 楼 acboboly 的回复:
额...谢谢

还是有个问题不是很明白
string ConnectionString = "Data Source=abc;user=anhui;password=anhui;Max Pool Size=200;Min Pool Size=10;";
OracleConnection conn = new OracleConnection(ConnectionString);

每次……


只是设置一个缓冲池的最大容量。。。不会每次刷新都定义。。。

--------------------编程问答-------------------- --------------------编程问答-------------------- ...........
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,