отказ канала связи; Spray.io на Heroku с надстройкой ClearDB

Я не могу поддерживать соединения с моим экземпляром ClearDB. Когда мое приложение запускается впервые, я могу сделать к нему запрос, который отлично обращается к БД. Через минуту или две, если я сделаю тот же запрос, я получу ошибку канала связи. Вот подробности моего заявления:

  • Scala с использованием Spray.io
  • Slick для взаимодействия с БД
  • ClearDB: зажечь при тестировании этого нового приложения
  • Класс источника данных: com.mchange.v2.c3p0.ComboPooledDataSource

Если я запускаю свое приложение локально на моем локальном экземпляре MySQL, я не могу воспроизвести проблему. Если я изменю URL-адрес своей БД, чтобы он указывал на мой экземпляр ClearDB, я смогу воспроизвести это локально. Определенно похоже на проблему с ClearDB...

Я связался со службой поддержки ClearDB, и они сказали мне, что не могут мне помочь, потому что они не поддерживают непосредственно Spray.io, и что я должен попытаться получить помощь напрямую от Heroku. Я отправил запрос о помощи в Heroku, но не ожидал многого, так как я не думаю, что Spray.io или Slick там напрямую поддерживаются. Я также безуспешно просматривал Stackoverflow, поэтому публикую это сейчас.

Ниже приведена полная трассировка стека, которую я получаю при локальном воспроизведении.

java.lang.x:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 185,507 milliseconds ago.  The last packet sent successfully to the server was 1 milliseconds ago.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 185,507 milliseconds ago.  The last packet sent successfully to the server was 1 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)[WARN] [01/26/2014 20:48:42.906] [LottoREST-akka.actor.default-dispatcher-4] [akka://LottoREST/user/lotto-service] Request HttpRequest(GET,http://localhost:8080/drawing,List(Cookie: JSESSIONID=4EFAE21258F8AF891C010DD14F9BC3F1, Accept-Language: en-US, en, Accept-Encoding: gzip, deflate, sdch, User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36, Cache-Control: max-age=0, Connection: keep-alive, Host: localhost:8080),Empty,HTTP/1.1) could not be handled normally

    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3720)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4160)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2825)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
    at scala.slick.jdbc.StatementInvoker.results(StatementInvoker.scala:34)
    at scala.slick.jdbc.StatementInvoker.elementsTo(StatementInvoker.scala:17)
    at scala.slick.jdbc.Invoker$class.foreach(Invoker.scala:90)
    at scala.slick.jdbc.StatementInvoker.foreach(StatementInvoker.scala:10)
    at scala.slick.jdbc.Invoker$class.build(Invoker.scala:66)
    at scala.slick.jdbc.StatementInvoker.build(StatementInvoker.scala:10)
    at scala.slick.jdbc.Invoker$class.list(Invoker.scala:56)
    at scala.slick.jdbc.StatementInvoker.list(StatementInvoker.scala:10)
    at scala.slick.jdbc.UnitInvoker$class.list(Invoker.scala:150)
    at scala.slick.driver.BasicInvokerComponent$QueryInvoker.list(BasicInvokerComponent.scala:19)
    at com.megalottopools.model.DrawingComponent$Drawings$.findAllDrawings(Drawing.scala:28)
    at com.megalottopools.model.Model.getDrawings(Model.scala:20)
    at com.megalottopools.api.DrawingService$$anonfun$1.apply(DrawingService.scala:27)
    at com.megalottopools.api.DrawingService$$anonfun$1.apply(DrawingService.scala:25)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.BasicDirectives$$anon$3$$anonfun$happly$1.apply(BasicDirectives.scala:92)
    at spray.routing.directives.BasicDirectives$$anon$3$$anonfun$happly$1.apply(BasicDirectives.scala:92)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:30)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:29)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.BasicDirectives$$anon$3$$anonfun$happly$1.apply(BasicDirectives.scala:92)
    at spray.routing.directives.BasicDirectives$$anon$3$$anonfun$happly$1.apply(BasicDirectives.scala:92)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:30)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:29)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:30)
    at spray.routing.RouteConcatenation$RouteConcatenation$$anonfun$$tilde$1.apply(RouteConcatenation.scala:29)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.BasicDirectives$$anonfun$mapRequestContext$1$$anonfun$apply$1.apply(BasicDirectives.scala:30)
    at spray.routing.directives.ExecutionDirectives$$anonfun$handleExceptions$1$$anonfun$apply$4.apply(ExecutionDirectives.scala:35)
    at spray.routing.directives.ExecutionDirectives$$anonfun$handleExceptions$1$$anonfun$apply$4.apply(ExecutionDirectives.scala:33)
    at spray.routing.HttpServiceBase$class.runSealedRoute$1(HttpService.scala:36)
    at spray.routing.HttpServiceBase$$anonfun$runRoute$1.applyOrElse(HttpService.scala:46)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
    at akka.actor.ActorCell.invoke(ActorCell.scala:386)
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
    at akka.dispatch.Mailbox.run(Mailbox.scala:212)
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:506)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3166)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3620)
    ... 51 more

person ShatyUT    schedule 27.01.2014    source источник


Ответы (1)


Похоже на тайм-аут соединения. Убедитесь, что c3p0 может правильно поддерживать соединения с ClearDB. Некоторые пулы соединений с БД используют либо сетевую проверку связи, либо запускают простые операторы выбора, такие как SELECT 1, чтобы поддерживать соединения. Вы можете проверить, какие параметры конфигурации доступны для вашей БД. Чтобы убедиться, что это проблема, запускайте несколько фиктивных операций базы данных каждые несколько секунд и посмотрите, не появится ли та же ошибка через некоторое время (сохраняйте размер пула == 1).

person yǝsʞǝla    schedule 27.01.2014
comment
У меня есть предпочтительный тестовый запрос, установленный как SELECT 1, но я не уверен, как узнать, действительно ли c3p0 использует его. Я посмотрю, смогу ли я настроить регулярный вызов БД каждые 60 секунд или около того, чтобы увидеть, работает ли это. Хотя, похоже, мне не стоило этого делать. У меня нет доступа к параметрам конфигурации БД. Я связался со службой поддержки ClearDB, и они проверили, что все мои параметры установлены правильно... что бы это ни значило. - person ShatyUT; 27.01.2014