2017-05-15 2 views
0

Ich möchte mein Java/Play starten! Service, obwohl die Datenbank noch nicht erreichbar ist. Wenn die Datenbank nicht verfügbar ist, wird der Dienst beendet. Ist es in Play möglich, jede Sekunde zu versuchen und erneut zu verbinden, ohne den Dienst vollständig zu beenden und erneut mit db zu verbinden, sobald die Verbindung verfügbar ist.Starten Sie die Java/Play2.5 REST API ohne DB

Unsere application.conf sieht derzeit wie folgt aus:

play.evolutions.enabled=false 
//play.db.pool=bonecp 

db { 
    default.driver=org.postgresql.Driver 
    default.url="jdbc:postgresql://postgresdb.postgres:5432/postcode" 
    default.username="<username>" 
    default.password="<strong-password>" 
} 

play.db { 
    config = "db" 
    prototype.hikaricp = { 
    connectionTimeout = 250 milliseconds 
    initializationFailFast = false 
    readOnly = true 
    } 
} 

ebean.default = ["models.*"] 

Derzeit erhalte ich die folgenden Protokolle:

2017-05-15 13:26:54.525 [error] postcode-play: Connection error: 
org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections 
    Ort: Datei: postinit.c, Routine: InitPostgres, Zeile: 779. 
    Server SQLState: 53300 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412) 
    at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2538) 
    at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:122) 
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:227) 
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) 
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194) 
    at org.postgresql.Driver.makeConnection(Driver.java:431) 
    at org.postgresql.Driver.connect(Driver.java:247) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:101) 

2017-05-15 13:26:54.626 [error] postcode-play: Connection error: 
org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections 
    Ort: Datei: postinit.c, Routine: InitPostgres, Zeile: 779. 
    Server SQLState: 53300 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412) 
    at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2538) 
    at org.postgresql.core.v3.QueryExecutorImpl.<init>(QueryExecutorImpl.java:122) 
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:227) 
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) 
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194) 
    at org.postgresql.Driver.makeConnection(Driver.java:431) 
    at org.postgresql.Driver.connect(Driver.java:247) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:101) 
. 
. 
. 

anzeigt, dass der Server nicht ganz aufhört, sondern versucht mehrmals zu verbinden db was wie gewünscht ist. Aber wenn die Datenbank die folgenden Protokolle verfügbar wird geschrieben:

2017-05-15 14:08:43.748 [error] postcode-play: 

! @7430ed7gf - Internal server error, for (GET) [/?postcode=88682&country=DE] -> 

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]] 
    at play.api.Configuration$.configError(Configuration.scala:155) 
    at play.api.Configuration.reportError(Configuration.scala:808) 
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:48) 
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) 
    at scala.collection.immutable.List.foreach(List.scala:392) 
    at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) 
    at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:72) 
    at play.api.db.DBApiProvider.get(DBModule.scala:62) 
    at play.api.db.DBApiProvider.get(DBModule.scala:58) 
    at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81) 
Caused by: java.sql.SQLTransientConnectionException: HikariPool-4 - Connection is not available, request timed out after 5001ms. 
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:548) 
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186) 
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145) 
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83) 
    at play.api.db.DefaultDatabase.getConnection(Databases.scala:142) 
    at play.api.db.DefaultDatabase.getConnection(Databases.scala:138) 
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:44) 
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42) 
    at scala.collection.immutable.List.foreach(List.scala:392) 
    at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42) 
Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. 
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:265) 
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) 
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194) 
    at org.postgresql.Driver.makeConnection(Driver.java:431) 
    at org.postgresql.Driver.connect(Driver.java:247) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95) 
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:101) 
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:341) 
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:193) 
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:430) 
Caused by: java.net.ConnectException: Verbindungsaufbau abgelehnt (Connection refused) 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at org.postgresql.core.PGStream.<init>(PGStream.java:62) 
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144) 
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) 
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194 
) 

Der Server kann nicht erreichen, um die Datenbank, auch wenn es jetzt verfügbar ist. Wenn ich den Server neu starte, wird die Datenbank gefunden und kann damit gearbeitet werden, aber die Datenbank muss beim Start immer da sein. Wie kann ich das beheben, damit die App unabhängig von der Datenbank gestartet werden kann?

Wenn die Datenbank nicht mehr verfügbar ist, nachdem die Anwendung gestartet wurde, ist es kein Problem, nachdem die Datenbank wieder verfügbar ist. es wird automatisch wieder verbunden.

Jede Hilfe wird sehr geschätzt!

Antwort

0

Es scheint, als ob Sie einige Verbindungen zu Postgres offen lassen. Diese Verbindungen müssen geschlossen werden oder Postgres wird seine max_connections Grenze erreichen.

Sie könnten increase max_connections aber es wird nicht empfohlen, da die Leistung von Postgres verschlechtert wird, wenn es zu hoch eingestellt ist. Auch, wie Sie HikariCP verwenden, wäre es keine schlechte Idee, einen Blick auf die HikariCP docs, insbesondere die idleTimeout und die minimumIdle Konfigurationsvariablen sollten Ihnen helfen.

Wenn das obige nicht funktioniert, müssen Sie genau bestätigen, wie viele Verbindungen zu Postgres hergestellt werden. Vielleicht überprüfen Sie sogar die Anzahl der Sitzungen, die Sie persönlich über SSH oder über andere Apps zu Postgres machen, nicht nur die Anzahl der Play Framework-Verbindungen.

Verwandte Themen