MySQLNonTransientConnectionException:在grails-2.2.2中使用mysql和mongodb进行提交时通信链接失败

时间:2014-04-17 08:06:46

标签: mysql mongodb grails

我正在使用Grails 2.2.2和MySql。对于我的几个域名,我决定使用db进行polygot并将Mongo引入混合。这一变化在没有任何问题的情况下投入生产,并且功能超过12小时。

但突然间,我们开始在日志中获得此异常:

caused by org.hibernate.TransactionException: JDBC commit failed
com.sonyliv.common.VideoService.getRequestIp(VideoService.groovy:1301)
com.sonyliv.portal.ApplicationFilters$_closure1_closure2_closure5.doCall(ApplicationFilters.groovy:14)
…in.cache.web.filter.PageFragmentCachingFilter.doFilter (PageFragmentCachingFilter.java:195)
 grails.plugin.cache.web.filter.AbstractFilter.doFilter (AbstractFilter.java:63)
                 com.brandseye.cors.CorsFilter.doFilter (CorsFilter.java:69)
….javakaffee.web.msm.RequestTrackingContextValve.invoke (RequestTrackingContextValve.java:99)
  de.javakaffee.web.msm.RequestTrackingHostValve.invoke (RequestTrackingHostValve.java:151)
      java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
     java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
                                   java.lang.Thread.run (Thread.java:724)

caused by com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
                  com.mysql.jdbc.Util.handleNewInstance (Util.java:411)
                        com.mysql.jdbc.Util.getInstance (Util.java:386)
             com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1014)
             com.mysql.jdbc.SQLError.createSQLException (SQLError.java:988)
             com.mysql.jdbc.SQLError.createSQLException (SQLError.java:974)
             com.mysql.jdbc.SQLError.createSQLException (SQLError.java:919)
                   com.mysql.jdbc.ConnectionImpl.commit (ConnectionImpl.java:1700)
    org.apache.commons.dbcp.DelegatingConnection.commit (DelegatingConnection.java:334)
…cp.PoolingDataSource$PoolGuardConnectionWrapper.commit (PoolingDataSource.java:211)
com.sonyliv.common.VideoService.getRequestIp(VideoService.groovy:1301)
com.sonyliv.portal.ApplicationFilters$_closure1_closure2_closure5.doCall(ApplicationFilters.groovy:14)
…in.cache.web.filter.PageFragmentCachingFilter.doFilter (PageFragmentCachingFilter.java:195)
 grails.plugin.cache.web.filter.AbstractFilter.doFilter (AbstractFilter.java:63)
                 com.brandseye.cors.CorsFilter.doFilter (CorsFilter.java:69)
….javakaffee.web.msm.RequestTrackingContextValve.invoke (RequestTrackingContextValve.java:99)
  de.javakaffee.web.msm.RequestTrackingHostValve.invoke (RequestTrackingHostValve.java:151)
      java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
     java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)

                                       java.lang.Thread.run (Thread.java:724)

但是,我们仍然可以使用我们的DataSource设置从我们的生产服务器登录mysql。我尝试重新启动应用程序,但这也没有帮助。最后,我不得不恢复到一个pre-mongo版本,让事情再次发挥作用。

有没有人知道为什么会发生这种情况? Grails 2.2.2 + Mysql + mongo是否存在已知问题。我一直试图找出答案,但仍然没有具体的东西。各种技术的版本:

Mongo - 2.4.8

Grails Mongo插件 - 1.3.3

Mysql - 5.5.33

Tomcat 7

Grails - 2.2.2

提前致谢。

1 个答案:

答案 0 :(得分:0)

我强烈感觉你的VideoService类没有声明static transactional = false,这意味着每个被调用的方法都会获取并保持数据库事务,无论它是否进行任何数据库调用。如果您有任何内存泄漏或性能问题随着时间线性变得更糟,最终这些方法将开始使数据库在连接超时之后保持打开状态,并且您得到这样的结果。