`
少女杀手
  • 浏览: 130342 次
  • 性别: Icon_minigender_1
  • 来自: 约旦河西岸
社区版块
存档分类
最新评论

在使用Proxool连接池遇到的几点问题及解决办法

    博客分类:
  • java
阅读更多

近期公司一个项目让我修改,程序总是在数据库服务重启的情况下出问题。究其原因锁定为连接池配置。
由于用到的是Proxool连接池,我是第一次接触这个。所以在网上找了下相关资料。大部分都是讲怎么配置,千篇一律
大抄抄小抄抄,抄来抄去。废话就不多说了。

公司的程序是一直和数据库做交互的。当程序运行过程中,我停掉数据库服务,本应看到:
com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect
链接失败的异常,但是程序并没有抛出这个异常,而是链接成功。只是在从数据库中取数据时发生问题抛出如下错误:
com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset by peer: socket write error
可惜头脑简单的我在网上狂找socket write error这个问题出现的原因和解决办法。


这个问题一般是客户端在连接还没有完全建立的时候就取消连接,比如用户按了浏览器上面的“停止”按钮,一般来说没有什么问题。但是如果频繁出现,就表示很多客户端连接到Apache服务器的响应时间太长了,可能是网络的问题或者服务器性能问题  
可能你的网络连接存在一些问题,你的数据传输的时候,可能由于时间等待的太久,但是server段设置的连接检验时间限制一定,那么就可能出现这种情况的!

不过更常见的原因是:
1:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉;
2:客户关掉了浏览器,而服务器还在给客户端发送数据;
3:浏览器端按了Stop;
4:服务器给客户端响应结果给防火墙拦截了。

但是程序是并不是web程序。仔细想了想问题应该不是这个。然后通过看Proxool连接池配置和此问题的原因,我马上又锁定
Proxool配置中的“house-keeping-sleep-time”这项配置。但是把时间调短还是不能解决问题。
没办法只好继续在网上找。看到有些文中指出添加test-before-use配置,即每次取出连接都检查连接是否可用,就可以做到让连接池实现在故障恢复后自动重连接
但是我添加后还是抛出错误。而且是程序已启动就抛出错误
java.sql.SQLException: Created a new connection but it failed its test
一看错误是test错误。这是为啥呢?
看配置才知道有这么一项配置:house-keeping-test-sql
看网上90%的讲proxool的配置的文章test语句都是这个:select CURRENT_DATE
就连我要改的程序中的也是配置成这个语句,哎。copy,绝对的copy
因为我们公司用的是sql server2005,select CURRENT_DATE这个语句在mssql上根本就是错误的。
所以会抛出Created a new connection but it failed its test异常。因为添加test-before-use这个后,会检查连接是否可用。但是此时sql语句有误,怎么检查?
改成select getdate()问题搞定。此错误搞定

 

 

分享到:
评论
1 楼 fengyupianzhou 2011-06-01  
谢谢,我也遇到了这个问题。。。select CURRENT_DATE改为select getdate()就ok了。

相关推荐

Global site tag (gtag.js) - Google Analytics