首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么关闭连接池(快过年了,顶有分)

2011-12-10 
如何关闭连接池(快过年了,顶有分)一个三层系统,remoting服务作为一个数据库访问层。客户端通过remoting访问

如何关闭连接池(快过年了,顶有分)
一个三层系统,remoting服务作为一个数据库访问层。
客户端通过remoting访问数据库,使用ADO连接池!

现在遇到了一个问题,有的时候客户端总是无法连接到oralce,报错:Ora-03114,但实际上通过toad,以及其他工具是可以连接的(证明数据库是没有问题的)

找了一些资料,怀疑是:
连接池中存放了一些无效的连接,后来程序又取用了这些无效的连接就会出错。 
于是:我想到了解决方法是关闭连接池;

这样做:在客户端再遇到这中连接不上时,我就关闭这个连接池,然后再去创建一个连接池。

问题一:这种做法对不对?
问题二:如何通过连接字符串关闭该连接池?
(Data Source=RESCS;User ID=suining;Password=suining;Pooling =true;Min Pool Size=20;Max Pool Size = 80)

求各位指点指点...
 



[解决办法]
接分
[解决办法]
关注
[解决办法]
如果是连接oracle数据库,不需要在连接串中指定连接池,连接时,会自动指定连接池,让系统去给你做这件事情

如果要关闭连接池,只要你连接串中修改就行:Pooling=false;

http://msdn.microsoft.com/zh-cn/library/ms254502.aspx
[解决办法]

[解决办法]
期待高手,顶.
[解决办法]
应该和连接池没有什么关系
因为平时连接ORACLE从来都不考虑这个问题
[解决办法]
接个分可以吗...
[解决办法]
mark
[解决办法]
mark ....
[解决办法]
接分
[解决办法]
帮顶.
[解决办法]
检查下代码是否有漏洞?
[解决办法]
不会 帮顶
[解决办法]
先学习!!!
[解决办法]
帮你顶上去
[解决办法]
学习,顶

[解决办法]
参考
[解决办法]
顶顶顶,并学习
[解决办法]
看看程序中是否存在疏漏,DB连接在用完之后应该及时关掉。
[解决办法]
顶一下
[解决办法]
有可能是使用过的连接没有关掉......
[解决办法]

探讨
引用:
如果是连接oracle数据库,不需要在连接串中指定连接池,连接时,会自动指定连接池,让系统去给你做这件事情 

如果要关闭连接池,只要你连接串中修改就行:Pooling=false; 

http://msdn.microsoft.com/zh-cn/library/ms254502.aspx 
 

我确实也是这么做的: 
(Data Source=RESCS;User ID=suining;Password=suining;Pooling =false;Min Pool Size=20;Max Pool Size = 80) 
但是,后面我再使用这个字符串时,还是爆oralce错误! 
(Data Source=RESCS;User ID=suining;Password=suining;Pooling =true;Min Pool Size=20;Max Pool Size = 80) 

[解决办法]
探讨
引用:
看看程序中是否存在疏漏,DB连接在用完之后应该及时关掉。




都是关闭了的,诸如:
using (OracleConnection conn = new OracleConnection(connectionString))这种的写法!



[解决办法]
接分
[解决办法]
你的ExecuteDataSet方法怎么在catch(){..}里面关闭的?如果没异常岂不是不关闭了?
前一个都是finally,改一下吧
最好用
using (OracleConnection conn = new OracleConnection(connectionString))来写

[解决办法]
不会 帮顶
[解决办法]
System.Data.SqlClient.SqlConnection.ClearAllPools();
[解决办法]
up一下
[解决办法]
C# code
 public static DataSet ExecuteDataSet(OracleConnection conn, CommandType cmdType, string cmdText, IList<OracleParameter> commandParameters)        {            //Create the command and connection            OracleDataAdapter cmd = new OracleDataAdapter();            try            {                DataSet ds = new DataSet();                //Prepare the command to execute                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);                //Execute the query, stating that the connection should close when the resulting datareader has been read                cmd.Fill(ds);                cmd.SelectCommand.Parameters.Clear();                return ds;            }            catch(Exception ex)            {                conn.Close();                throw;            }        }加一个finally{} conn.Close();写在 finally{}里
[解决办法]
探讨
 try
{
DataSet ds = new DataSet();
//Prepare the command to execute
PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
//Execute the query, stating that the connection should close when the resulting datareader has been read
cmd.Fill(ds);
cmd.SelectCommand.Parameters.Clear();
return ds;

}
catch(Exception ex)
{
conn.Close();
throw;
}


[解决办法]
ding
[解决办法]

[解决办法]
up....
[解决办法]
不会,帮顶啊
[解决办法]
今天排查一个故障:现象是当ASP.NET通过ORACLECLIENT连接ORACLE数据库时会不规律的在一段时间后,报错:ORA-03114,不能连接到ORACLE.当时觉得是ORACLE服务的故障,所以查询了web服务器与数据库服务器的日志,均没有异常。然后,发现报错时TOAD直接访问数据库OK,故排除数据库问题。

观察IIS,发现其部分WEB工程访问数据库时仍然可用。只有登录入口(即主应用)报错。检查两者区别,发现主应用的数据库连接设置POOL=TRUE,而可用的工程为POOL=FALSE.查询微软的支持,发现IIS连接池是存在一个缺陷,即网络瞬间断连后也不会清空连接池。所以通过命令IISRESET清空连接池后一切OK。

反观问题根源:

1,网络为什么会中断。经过分析:原来web服务器与数据库服务器连接在同一交换机上;而近期调整为分别连接在级联的两个交换机上。所以级联的包在网络拥堵时,出现瞬断的频率高。

2,oracle连接池为什么不能自动清空。IIS在处理上存在缺陷,一直到IIS6仍然未解决此问题。所以现阶段只有两个方法:其一,停止使用连接池。(即不用长连接);其二,做定期IISRESET任务(这样很不负责..)


[解决办法]
up
[解决办法]
最好检查下NetWork Configuration设置,还有双网卡的机器最容易出现这个问题。
------解决方案--------------------


学习,帮顶。
[解决办法]
当恢复数据库时,需要独占数据库, 
然而连接池只有主线程关闭或数据库不可访问时才关闭, 
如何用程序主动关闭连接池 
------------------------------- 目前还没有提供这项功能。
[解决办法]
public void execute(Runnable command) throws InterruptedException {
for (;;) { //一直循环
synchronized (this) {
if (!shutdown_) { //确保线程池没有关闭
int size = poolSize_; //当前线程池中线程的数目
if (size < minimumPoolSize_) { //如果当前线程数目少于线程池最小数目
addThread(command);
return;
}
//如果目前线程池中有超过或等于最小数目的线程
//分配一个存在的空闲线程来运行command,handOff是队列
if (handOff_.offer(command, 0)) {
return;
}
//如果不能分配已有的线程来运行command,那么创建一个新线程
if (size < maximumPoolSize_) {
addThread(command);
return;
}
 
}
}
//如果阻塞,则请求帮助
if (getBlockedExecutionHandler().bolckedAction(command)) {
return;
}
}
}
由上面的代码可见,PooledExecutor线程池的原理是,当执行execute加载一个应用系统的线程时,线程池内部首先检查当前线程数目是否达到设定的最小数目。如果没有达到,启动新线程运行;如果达到了,那么检查有无空闲线程可用;如果没有空闲的,则创建新线程,直到达到最大数目。
使用线程池的好处是:首先是循环使用,一经创建后,空闲的线程可以被反复使用,提高了运行效率;其次有最大数目的限制,保证了系统的安全性。
[解决办法]
接分

oracle是几用户的?会不会是连接数过多导致的?
[解决办法]
Mark
[解决办法]
Thank YOU very much.
[解决办法]
up!!!
[解决办法]
mark
[解决办法]
帮顶
[解决办法]
期待高手,帮顶。。。。
[解决办法]
接分
[解决办法]
帮顶!!!
[解决办法]
同意37樓做法
[解决办法]
帮顶!!!
[解决办法]
public void execute(Runnable command) throws InterruptedException { 
for (;;) { //一直循环 
synchronized (this) { 
if (!shutdown_) { //确保线程池没有关闭 
int size = poolSize_; //当前线程池中线程的数目 
if (size < minimumPoolSize_) { //如果当前线程数目少于线程池最小数目 
addThread(command); 
return; 

//如果目前线程池中有超过或等于最小数目的线程 
//分配一个存在的空闲线程来运行command,handOff是队列 
if (handOff_.offer(command, 0)) { 
return; 

//如果不能分配已有的线程来运行command,那么创建一个新线程 
if (size < maximumPoolSize_) { 
addThread(command); 
return; 




//如果阻塞,则请求帮助 
if (getBlockedExecutionHandler().bolckedAction(command)) { 
return; 



由上面的代码可见,PooledExecutor线程池的原理是,当执行execute加载一个应用系统的线程时,线程池内部首先检查当前线程数目是否达到设定的最小数目。如果没有达到,启动新线程运行;如果达到了,那么检查有无空闲线程可用;如果没有空闲的,则创建新线程,直到达到最大数目。 
使用线程池的好处是:首先是循环使用,一经创建后,空闲的线程可以被反复使用,提高了运行效率;其次有最大数目的限制,保证了系统的安全性
[解决办法]
分呢
[解决办法]
学习
[解决办法]
.close();就关掉了嘛
[解决办法]
看看数据库访问层,对数据库操作完,是否关闭并释放了连接
[解决办法]
在学习
[解决办法]
为啥子不用 using语句?这样让他自己去关
还有就是通过Oracle客户端查看有请求时产生了哪些链接,是否真的关闭.
[解决办法]
不会 帮顶
[解决办法]
帮顶
[解决办法]
[b][/b][color=#FF99CC][/color]多谢楼主!!!
抱走哒!!~
[解决办法]
学习

热点排行