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