JFinal+druid出现connection abort: socket write error

车开源 发布于 2013/11/25 22:05
阅读 1K+
收藏 0

@wenshao 你好,想跟你请教个问题:

应用启动,开始动作正常。然后不做任务操作,隔了10多分钟左右再访问应用就卡住了,经过检查发现:隔了10多分钟再访问应用时,获取不到有用的数据库连接,然后一次一次测试应用启动时创建的10个连接,直到全部测试完都没找到可用连接,就新建一个连接~ 这一样来就花了好几分钟呢。

DruidPlugin dp = new DruidPlugin(getProperty("jdbcUrl").trim(),
              getProperty("user").trim(),
              getProperty("password").trim(),
              getProperty("driver").trim());
      dp.setValidationQuery("select 1 from dual");
      dp.setTestWhileIdle(true);
      dp.addFilter(new StatFilter());
      WallFilter wall = new WallFilter();
      wall.setDbType("oracle");
      dp.addFilter(wall);
      me.add(dp);

以上是我配置Druid的代码,理论上连接池会自动定时测试这些连接以防空闲超时呀,难道不是?求解!!


以下为日志错误:

2013-11-25 21:57:22
[ERROR]-[Thread: qtp17984263-29]-[com.alibaba.druid.util.JdbcUtils.close()]: close connection error
java.sql.SQLRecoverableException: IO 错误: Software caused connection abort: socket write error
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:556)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3984)
    at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:163)
    at com.alibaba.druid.filter.FilterAdapter.connection_close(FilterAdapter.java:758)
    at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:159)
    at com.alibaba.druid.filter.stat.StatFilter.connection_close(StatFilter.java:241)
    at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:159)
    at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.close(ConnectionProxyImpl.java:99)
    at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:113)
    at com.alibaba.druid.pool.DruidDataSource.discardConnection(DruidDataSource.java:662)
    at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:633)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4530)
    at com.alibaba.druid.filter.FilterAdapter.dataSource_getConnection(FilterAdapter.java:2706)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4526)
    at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4526)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:585)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:577)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:78)
    at com.jfinal.plugin.activerecord.DbKit.getConnection(DbKit.java:129)
    at com.jfinal.plugin.activerecord.Model.find(Model.java:428)
    at com.jfinal.plugin.activerecord.Model.findFirst(Model.java:469)
    at edu.sdpt.common.model.Renyuan.checkUser(Renyuan.java:27)
    at edu.sdpt.common.UserController.login(UserController.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
    at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
    at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:74)
    at edu.sdpt.common.GlobalVariablesHandler.handle(GlobalVariablesHandler.java:36)
    at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47)
    at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:365)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:926)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:988)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:619)
Caused by: java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
    at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:543)
    ... 56 more

加载中
1
玛雅牛
玛雅牛

简单看了下,@JFinal中可能有一个bug

类DruidPlugin中的start方法中

ds.setTimeBetweenConnectErrorMillis(timeBetweenEvictionRunsMillis);



从druid中看,这个参数是出错后重连的间隔时间。

应该修改为:

ds.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);



这个是参数 多久才进行一次检测空闲连接

目前jfinal中这个参数默认设定为60000(60秒),但是这个被设定给了出错后重连的间隔时间。空闲检查默认在druid中被设定为-1,也就是每次获取连接时都会检测,这样获取时会比较耗时一些。

to @JFinal

建议在下一版中修复此bug。建议把TimeBetweenConnectErrorMillis 和timeBetweenEvictionRunsMillis都加上。

to楼主,注释掉这两行,再试一试,可能是你的某个sql写的有问题。

dp.setValidationQuery("select 1 from dual"); 

dp.setTestWhileIdle(true);


JFinal
JFinal
感谢玛雅牛,从方法名与参数名就能看出应该改成:setTimeBetweenEvictionRunsMillis,应该Druid官方demo有误,当时做DruidPlugin时参数设置都是从官方copy来的
车开源
车开源
因为我用的是oracle,第一句不能改。第二个原来也没影响,因为Druid默认就是true
0
limiyun
limiyun
Druid 很不稳定啊。目前感觉还是tomcat的jdbc和proxool,是比较好的连接池。
limiyun
limiyun
回复 @车开源 : c3p0貌似也有类似问题。看来需要自己实现插件才行了。
车开源
车开源
只好换c3p0
0
i
irving--

我不用什么jfinal也碰到这个问题,SSH+oracle,为什么

我的也是 长时间不访问的话,第一次打开连接就会报错,时间特别长

返回顶部
顶部