2015-07-05 10 views
5

Il mio progetto di gioco play sta funzionando bene nel mio locale, ma quando sto provando a distribuirlo in heroku ricevo un errore di inseguimento.Causato da: java.sql.SQLException: JDBC4 Metodo Connection.isValid() non supportato

2015-07-05T06:24:10.456657+00:00 app[web.1]: at com.google.inject.Guice.createInjector(Guice.java:73) 
2015-07-05T06:24:10.456817+00:00 app[web.1]: at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93) 
2015-07-05T06:24:10.456702+00:00 app[web.1]: at com.google.inject.Guice.createInjector(Guice.java:62) 
2015-07-05T06:24:10.456746+00:00 app[web.1]: at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126) 
2015-07-05T06:24:10.456863+00:00 app[web.1]: at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) 
2015-07-05T06:24:10.456909+00:00 app[web.1]: at play.core.server.ProdServerStart$.start(ProdServerStart.scala:52) 
2015-07-05T06:24:10.456951+00:00 app[web.1]: at play.core.server.ProdServerStart$.main(ProdServerStart.scala:27) 
2015-07-05T06:24:10.456994+00:00 app[web.1]: at play.core.server.ProdServerStart.main(ProdServerStart.scala) 
2015-07-05T06:24:10.457407+00:00 app[web.1]: at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:441) 
2015-07-05T06:24:10.457496+00:00 app[web.1]: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
2015-07-05T06:24:10.457369+00:00 app[web.1]: Caused by: java.sql.SQLException: JDBC4 Connection.isValid() method not supported, connection test query must be configured 
2015-07-05T06:24:10.457602+00:00 app[web.1]: at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
2015-07-05T06:24:10.457451+00:00 app[web.1]: at com.zaxxer.hikari.pool.BaseHikariPool$1.run(BaseHikariPool.java:413) 
2015-07-05T06:24:10.457681+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
2015-07-05T06:24:10.457812+00:00 app[web.1]: at java.lang.Thread.run(Thread.java:745) 
2015-07-05T06:24:10.457768+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
2015-07-05T06:24:11.231007+00:00 heroku[web.1]: Process exited with status 255 
2015-07-05T06:24:11.243795+00:00 heroku[web.1]: State changed from starting to crashed 
2015-07-05T06:24:11.245013+00:00 heroku[web.1]: State changed from crashed to starting 
2015-07-05T06:24:16.259302+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/sazors -Dhttp.port=10803` 
2015-07-05T06:24:17.542815+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx384m -Xss512k -Dfile.encoding=UTF-8 
2015-07-05T06:24:18.643391+00:00 app[web.1]: 06:24:18,391 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 
2015-07-05T06:24:18.643397+00:00 app[web.1]: 06:24:18,391 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 

Sto usando PostgreSQL come mio db e slick come libreria di accesso al database. Ho provato a google e dopo alcune ricerche ho scoperto che questo errore può essere causato quando url fornito nel file di configurazione non è corretto o restituisce null. Ho provato a ripararlo ma non ho potuto risolvere questo errore.

Ecco il mio Procfile:

web: target/Universal/stadio/bin/myapp -Dhttp.port = $ {} PORT -Dconfig.resource = $ {} PLAY_CONF_FILE

e Application.conf

slick.dbs.default.driver="slick.driver.PostgresDriver$" 
slick.dbs.default.db.driver="org.postgresql.Driver" 
slick.dbs.default.db.url="postgres://rycmvicwkkzofh:[email protected]s.com:5432/d5pr4h65obtb0s" 
slick.dbs.default.db.user=rycmuicwkkzofh 
slick.dbs.default.db.password="copiedfromheroku" 

PS: sto lavorando su queste revisioni

play framework version : 2.4.0 slick version : 3.0

EDIT: Se posso aggiungere slick.dbs.default.db.connectionTestQuery="SELECT 1" nel mio application.conf produce nuovo tipo di errore NullPointerException.

That is gone but getting new error now: 
2015-07-05T12:22:49.781133+00:00 app[web.1]: at com.google.inject.Guice.createInjector(Guice.java:73) 
2015-07-05T12:22:49.781201+00:00 app[web.1]: at com.google.inject.Guice.createInjector(Guice.java:62) 
2015-07-05T12:22:49.781283+00:00 app[web.1]: at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126) 
2015-07-05T12:22:49.781361+00:00 app[web.1]: at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93) 
2015-07-05T12:22:49.781507+00:00 app[web.1]: at play.core.server.ProdServerStart$.start(ProdServerStart.scala:52) 
2015-07-05T12:22:49.781425+00:00 app[web.1]: at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) 
2015-07-05T12:22:49.781599+00:00 app[web.1]: at play.core.server.ProdServerStart$.main(ProdServerStart.scala:27) 
2015-07-05T12:22:49.781669+00:00 app[web.1]: at play.core.server.ProdServerStart.main(ProdServerStart.scala) 
2015-07-05T12:22:49.782161+00:00 app[web.1]: Caused by: java.lang.NullPointerException 
2015-07-05T12:22:49.782226+00:00 app[web.1]: at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:446) 
2015-07-05T12:22:49.782328+00:00 app[web.1]: at com.zaxxer.hikari.pool.BaseHikariPool$1.run(BaseHikariPool.java:413) 
2015-07-05T12:22:49.782417+00:00 app[web.1]: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
2015-07-05T12:22:49.782515+00:00 app[web.1]: at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
2015-07-05T12:22:49.783691+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
2015-07-05T12:22:49.783803+00:00 app[web.1]: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
2015-07-05T12:22:49.783883+00:00 app[web.1]: at java.lang.Thread.run(Thread.java:745) 
+0

Vedere se è possibile specificare una query di test a basso costo sulla connessione, per esempio 'SELEZIONA 1'. La proprietà sarà chiamata qualcosa come 'connectionTestQuery'. [Correlato] (http://stackoverflow.com/questions/28391936/database-connection-poolhikari-initialize-error) e [qui] (https://github.com/brettwooldridge/HikariCP/issues/225) – StuartLC

+0

@StuartLC : Potresti per favore approfondire di più, dove devo specificare questa query di prova economica? – Vinay

+0

Puoi verificare quale versione di postgresdriver stai usando? Gli ultimi dovrebbero aver risolto questo problema. – Biswanath

risposta

4

Credo che questo problema sia stato discusso su the Play mailing list here.

La causa è che Slick non supporta il formato DATABASE_URL impostato da Heroku. Dovrai analizzare DATABASE_URL in un URL JDBC. È possibile farlo abbastanza facilmente con la libreria Heroku-jdbc: https://github.com/jkutner/heroku-jdbc

Basta aggiungere una linea come questa alle vostre dipendenze:

libraryDependencies += "com.heroku.sdk" % "heroku-jdbc" % "0.1.0" 

Quindi è possibile analizzare l'URL in questo modo:

var jdbcURL = DatabaseUrl.extract.jdbcUrl 

quindi passare tale URL a chiazza di petrolio

EDIT

In realtà, sembra che la maggior parte delle persone analizzino manualmente il DATABASE_URL e configurino slick conf con i valori hardcoded. Questo va bene, ma tieni presente che la connessione potrebbe cambiare e dovresti modificare le impostazioni manualmente.

Quindi è necessario modificare la configurazione a questo:

slick.dbs.default.db.url="jdbc:postgresql://host:port/path" 

Ma si potrebbe desiderare di distruggere e ricreare il database perché hai postato i dettagli di connessione nel pubblico.

ho presentato un PR per chiazza di petrolio per risolvere questo problema: https://github.com/slick/slick/pull/1193

+0

Grazie, ora funziona :) – Vinay

+1

Nota che [heroku ora fornisce un JDBC_DATABSE_URL] (https: // devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#using-the-jdbc_database_url) – GreenAsJade

4

The Play HikariCP module (cercare "connectionTestQuery" config) suggerisce che è possibile impostare la query di prova come segue:

slick.dbs.default.db.connectionTestQuery="/*ping*/ select 1" // or whatever 

Quindi l'errore nel vostro stacktrace dovrebbe in teoria andare via.

+1

Ho aggiunto questa riga, ma ora ricevo nullPointerException. Per favore guarda nella descrizione della domanda, ho aggiornato i dettagli della domanda con il mio nuovo errore. – Vinay

+0

Hai installato il database PostgreSQL su Heroku? L'app utilizza la variabile di ambiente con l'URL PostgreSQL nel Procfile? https://www.playframework.com/documentation/2.4.x/ProductionHeroku – bjfletcher

+1

Grazie, questo ha risolto il problema per me – Keynash

1

configurazione Giocare richiede URL JDBC (JDBC_DATABASE_URL) e non postgres (DATABASE URL) per convertire URL del database in url jdbc qui è il modo. Avviso nella prima riga postgres viene scritto nella riga successiva che inizia con jdbc postgresqlql viene aggiunto alla parola postgres.

postgres://<username>:<password>@<host>:<port>/<dbname> 

Il formato di cui sopra è dato heroku postgres. ma il gioco si aspetta sotto il formato.

jdbc:postgresql://<host>:<port>/<dbname>?user=<username>&password=<password> 

Nota: URL sopra non dimenticare di aggiungere ql alla fine jdbc:postgres + ql diventa jdbc:postgresql

aggiungere anche sotto la linea di giocare conf

slick.dbs.default.db.connectionTestQuery="SELECT 1" 

Infine il file di configurazione application.conf diventa

slick.dbs.default.driver="slick.driver.PostgresDriver$" 

slick.dbs.default.db.driver="org.postgresql.Driver" 

slick.dbs.default.db.url="jdbc:postgresql://rycmvicwkkzofh:[email protected]s.com:5432/d5pr4h65obtb0s?user=rycmuicwkkzofh&password=copiedfromheroku" 

slick.dbs.default.db.user=rycmuicwkkzofh 

slick.dbs.default.db.password="copiedfromheroku" 

slick.dbs.default.db.connectionTestQuery="SELECT 1" 
0

Ho avuto lo stesso problema e dopo l'aggiornamento a HikariCP-2.4.0 e PostgreSQL-9.4 il problema è stato risolto :)

0

Usa

slick.dbs.default.driver="slick.driver.PostgresDriver$" 
slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource" 
slick.dbs.default.db.driver="org.postgresql.Driver" 
slick.dbs.default.db.url=${JDBC_DATABASE_URL} 
Problemi correlati