怎么关闭连接池(快过年了,顶有分)
如何关闭连接池(快过年了,顶有分)一个三层系统,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]多谢楼主!!! 抱走哒!!~[解决办法] 学习