guooscar / JazminServer

Java based application,rpc,message,rtmp,game,sip,rtp,relay,webrtc,webssh,proxy server,message queue,mysql proxy server
http://io.itit.io
308 stars 164 forks source link

ConnectionWrapper close #24

Closed thomkins closed 7 years ago

thomkins commented 7 years ago

Whether or not to call realConnection.close in the ConnectionWrapper's close method closes the connection

guooscar commented 7 years ago

no need to call realConnection.close

lvdaidai commented 7 years ago

jazminServer这个框架中使用的是c3p0的数据库连接池,c3p0调用自己的connection中的close方法时并不是真的关闭这个连接,而是又放到连接池中了,无论这个连接是否有效; 当连接池中的可用连接小于最小值时,又会创建新的数据库连接,这样无效的数据库连接与日俱增,超过连接池的最大设定值之后还会继续增长,最终导致占满MySQL服务器的连接数,导致程序进入假死状态! 所以使用c3p0时,realConnection最好是关闭掉!

lvdaidai commented 7 years ago

@guooscar 能否解答下以上的疑问,非常感谢

guooscar commented 7 years ago

之所以屏蔽到Connection.close方法是为了支持声明式事物,在一次数据库操作中,当前线程会保持一个唯一的Connection,保证这次操作都在一个Connection上进行,在结束操作以后 根据是否有异常再来提交或者回滚事物,最终Connection.close方法会被JazminServer调用。具体的实现可以参考ConnectionDriver这个类

lvdaidai commented 7 years ago

@guooscar 感谢作者回答,参考了一下ConnectionDriver这个类,确实如你所说,不过我的问题还没有得到解决。由于我在工程中很多方法都是单个或者多个查询,没有更新,所以这些方法就没有加上事务注解,从而会造成Connection没有被close,这样会造成很多Connection无效,那么我应该怎么处理这种情况呢? 以上的理解可能有偏差,希望作者能为本人解答,感激不尽!

guooscar commented 7 years ago

把代码贴出来看看