2013-04-29 22 views
6

Buduję aplikację w języku Java z Play Framework 2.0.4. Aplikacja została wdrożona w heroku z bazą danych cleardb.Wyjątek SQLException: Przekroczono limit czasu oczekiwania na wolne dostępne połączenie

Użytkownicy są coraz to sporadyczne błąd:

PlayException: Execution exception [[PersistenceException: java.sql.SQLException: Timed out waiting for a free available connection.]] 
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) 
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) 
    at akka.actor.Actor$class.apply(Actor.scala:318) 
    at play.core.ActionInvoker.apply(Invoker.scala:113) 
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) 
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) 
    at akka.dispatch.Mailbox.run(Mailbox.scala:179) 
    at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:516) 
    at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) 
    at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) 
    at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479) 
    at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) 
Caused by: javax.persistence.PersistenceException: java.sql.SQLException: Timed out waiting for a free available connection. 
    at com.avaje.ebeaninternal.server.transaction.TransactionManager.createQueryTransaction(TransactionManager.java:356) 
    at com.avaje.ebeaninternal.server.core.DefaultServer.createQueryTransaction(DefaultServer.java:2021) 
    at com.avaje.ebeaninternal.server.core.OrmQueryRequest.initTransIfRequired(OrmQueryRequest.java:241) 
    at com.avaje.ebeaninternal.server.core.DefaultServer.findId(DefaultServer.java:1212) 
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:1118) 
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:1105) 
    at play.db.ebean.Model$Finder.byId(Model.java:237) 

Teraz jest coraz gorzej, a czasem wszyscy użytkownicy uzyskać ten sam błąd za każdym razem, aż ponownie uruchomić aplikację w Heroku.

Każda pomoc lub wskazówki do debugowania?

Odpowiedz

0

Witam, mam również to pytanie, czy udało Ci się go rozwiązać? Szukałem w Internecie, o tym. Wszyscy mówią, że nie zamykasz swoich połączeń z bazą danych. Ale w ogóle ich nie otwieraję, mam na myśli, że gra to dla mnie. Znaleźli również kod blisko działa tylko na scala ..

Ostatnie "rozwiązanie", które znalazłem, ale nie działa w 100%, znajduje się w pliku konfiguracyjnym. http://www.playframework.com/documentation/2.0/SettingsJDBC

+0

nadal mam ten sam problem . Wygląda na to, że plik boneCP 0.7.1 zawiera kilka błędów. Fiddling z parametrami nie rozwiązał go. Może możesz spróbować ulepszyć boneCP http://stackoverflow.com/questions/15480506/heroku-play-bonecp-connection-issues – KirdApe

2

Po dodaniu boneCp 0.8.0.rc1, na Build.scala i

db.default.idleMaxAge=10 minutes 
db.default.idleConnectionTestPeriod=30 seconds 
db.default.connectionTimeout=20 second 
db.default.connectionTestStatement="SELECT 1" 
db.default.maxConnectionAge=30 minutes 

ale nadal mam błąd limitu czasu, szczególnie gdy zostawiłem otwartą stronę, a następnie uderzył odświeżenia.

+0

Aktualizacja do pliku boneCP 0.8.0-rc2 pozostaje niezmienna – KirdApe

+0

Jestem w trakcie zmiany mojego db do postgresql i wygląda na to, że te błędy zniknęły. Chociaż nadal zmagam się z bazą danych PostgreSQL. – lopesdasilva

2

Miałem do czynienia z tym samym problemem. Ten problem pojawił się, gdy w aplikacji Play jest duży wątek, a gra nie jest w stanie utrzymać puli DB. Aby uczynić Play wygodnym w utrzymywaniu puli DB Musisz dodać poniżej trzy punkty w ciebie pliki aplliaction.conf

  • db.default.maxConnectionsPerPartition = 100 // to powiedzieć, co Max połączenie swoją play ramowa trzeba ti utrzymać
  • db.default.minConnectionsPerPartition = 10 // Podczas zacznij od minimum jak wiele połączenie DB powinien mieć
  • db.default.acquireIncrement = 10 // Gdy połączenie Db przekraczać do maxConnectionsPerPartition wtedy, ile potrzeba, aby przypisać więcej w basenie
Powiązane problemy