Обновление с MySQL 5.5 до 5.6 и получение SQLException: соединение закрыто

Я использую Play Framework с eBean. Обновление до MySQL 5.6 вызвало следующее исключение при выполнении эволюции моей базы данных:

java.sql.SQLException: Connection is closed!
 com.jolbox.bonecp.ConnectionHandle.checkClosed(ConnectionHandle.java:459)
 com.jolbox.bonecp.ConnectionHandle.prepareStatement(ConnectionHandle.java:1011)
 play.api.db.evolutions.Evolutions$.prepare(Evolutions.scala:128)
 play.api.db.evolutions.Evolutions$.updateLastProblem$1(Evolutions.scala:247)
 play.api.db.evolutions.Evolutions$.applyScript(Evolutions.scala:289)
 play.api.db.evolutions.EvolutionsPlugin.handleWebCommand(Evolutions.scala:584)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5$$anonfun$apply$6.apply(ApplicationProvider.scala:193)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5$$anonfun$apply$6.apply(ApplicationProvider.scala:192)
 scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:110)
 scala.collection.immutable.List.foldLeft(List.scala:83)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5.apply(ApplicationProvider.scala:192)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1$$anonfun$apply$5.apply(ApplicationProvider.scala:191)
 scala.Option.flatMap(Option.scala:170)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1.apply(ApplicationProvider.scala:191)
 play.core.ReloadableApplication$$anonfun$handleWebCommand$1.apply(ApplicationProvider.scala:191)
 scala.Option.orElse(Option.scala:266)
 play.core.ReloadableApplication.handleWebCommand(ApplicationProvider.scala:189)
 play.core.server.Server$$anonfun$getHandlerFor$1.apply(Server.scala:69)
 play.core.server.Server$$anonfun$getHandlerFor$1.apply(Server.scala:69)
 scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:125)
 scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:125)
 scala.util.control.Exception$Catch.apply(Exception.scala:103)
 scala.util.control.Exception$Catch.either(Exception.scala:125)
 play.core.server.Server$class.getHandlerFor(Server.scala:69)
 play.core.server.NettyServer.getHandlerFor(NettyServer.scala:37)
 play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$10.apply(PlayDefaultUpstreamHandler.scala:157)
 play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$10.apply(PlayDefaultUpstreamHandler.scala:157)
 scala.util.Either.fold(Either.scala:99)
 play.core.server.netty.PlayDefaultUpstreamHandler.messageReceived(PlayDefaultUpstreamHandler.scala:142)
 org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 com.typesafe.netty.http.pipelining.HttpPipeliningHandler.messageReceived(HttpPipeliningHandler.java:62)
 org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:88)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 org.jboss.netty.handler.codec.http.HttpContentDecoder.messageReceived(HttpContentDecoder.java:108)
 org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
 org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459)
 org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536)
 org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435)
 org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:564)
 org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:559)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
 org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
 org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
 org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:108)
 org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:318)
 org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89)
 org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
 org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
 org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 java.lang.Thread.run(Thread.java:745)

Я также нашел это в журнале приложений:

    2015-01-29 09:13:03,742 - [ERROR] - from com.jolbox.bonecp.ConnectionHandle in New I/O worker #1 
Database access problem. Killing off this connection and all remaining connections in the connection pool. SQL State = HY000

Я пробовал с mysql-connector-java 5.1.18 и 5.1.34, а также с Play 2.3.6 и 2.3.4. Кажется, ничто не решает эту проблему, кроме использования MySQL 5.5 вместо 5.6.


person kevinzurek    schedule 29.01.2015    source источник
comment
Шаг 1: вместо того, чтобы просто пытаться что-то получить фактическую информацию. Либо найдите способ заставитьbonecp выдавать больше журналов отладки/трассировки, либо создайте некоторый тестовый код и вручную попытайтесь создать соединение (без промежуточного источника данных) с вашей базой данных, чтобы увидеть, какую конкретную ошибку это может вызвать. Прямо сейчас у вас есть только его не работает. Следует отметить, что версия 5.1.18 определенно будет слишком старой, поэтому не используйте ее больше.   -  person Gimby    schedule 29.01.2015
comment
Спасибо, Гимби, я смог решить эту проблему, проверив журналыbonecp.   -  person kevinzurek    schedule 03.02.2015


Ответы (1)


Включив ведение журнала вbonecp, я смог определить, какая инструкция SQL вызывала закрытие соединения. Я пытался изменить столбец внешнего ключа, не удаляя внешний ключ. Причина, по которой MySQL 5.5 работает, а 5.6 — нет, заключается в следующем (из примечаний к выпуску в 5.6):

Начиная с версии 5.6.7, сервер запрещает изменения столбцов внешнего ключа, которые могут привести к потере ссылочной целостности. Обходной путь заключается в использовании ALTER TABLE ... DROP FOREIGN KEY перед изменением определения столбца и ALTER TABLE ... ADD FOREIGN KEY после этого.

person kevinzurek    schedule 03.02.2015