2015-06-11 8 views
25

Ich benutze HikariCp, Hibernate mit meiner playframework-Anwendung in Java. Nach ein paar Minuten im Leerlaufzustand scheint es, dass die Anwendung "Play" abbricht und wenn sie eine neue Anfrage erhält, beginnt sie erneut. Irgendwann habe ich auch DB-Persistenzfehler mit der Nachricht gesehen, dass sessionfactory nicht verfügbar ist, was ich glaube, ist Nebeneffekt dieses Problems. Warum stirbt die Anwendung im Ruhezustand, und wie kann ich konfigurieren, dies nicht zu tun?Play-Anwendung stirbt im Ruhezustand, Neustart bei neuer Anfrage?

ich folgenden Protokolle, nach jeder neuen Anforderungen in wenigen Minuten Leerlaufzeit -

[info] application - Application shutdown... 
[info] application - Stopping HikariCP connection pool... 
[info] application - Starting HikariCP connection pool... 

persistence.xml: -

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 

    <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.use_sql_comments" value="true"/> 
      <property name="hibernate.logSql" value="true"/>    
      <property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider"/> 
      <property name="hibernate.hikari.dataSourceClassName" value="com.impossibl.postgres.jdbc.PGDataSource"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

Application.conf: -

# JPA configuration 
# ~~~~~ 
# You can declare as many Ebean servers as you want. 
# By convention, the default server is named `default` 
jpa.default=defaultPersistenceUnit 

# Assets configuration 
# ~~~~~ 
"assets.cache./public/stylesheets/bootstrap.min.css"="max-age=360000" 

# Logger 
# ~~~~~ 
# You can also configure logback (http://logback.qos.ch/), by providing a logger.xml file in the conf directory . 

# Root logger: 
logger=ERROR 

# Logger used by the framework: 
logger.play=INFO 

# Logger provided to your application: 
logger.application=DEBUG 

Danke!

+0

Welche 'Play Framework'-Version ist das? –

+0

@MonCalamari Ich benutze 2.3.8 Version des Spiels. –

+1

Wie läuft/startet man die Anwendung? – marcospereira

Antwort

1

Ihre Datenbankverbindung Anbieter, wenn ist iddle DO NOT für alles tun, wieder anschließen, werden Sie zu Ihrem Provider müssen angeben, was in diesem Fall zu tun, zum Beispiel:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
         version="2.0"> 

       <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <properties> 
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
         <property name="hibernate.show_sql" value="true"/> 
         <property name="hibernate.format_sql" value="true"/> 
         <property name="hibernate.use_sql_comments" value="true"/> 
         <property name="hibernate.logSql" value="true"/>    
         <property name="hibernate.connection.provider_class" value="com.zaxxer.hikari.hibernate.HikariConnectionProvider"/> 
         <property name="hibernate.hikari.dataSourceClassName" value="com.impossibl.postgres.jdbc.PGDataSource" 


<property name="hibernate.hikari.timeBetweenEvictionRunsMillis="30000" /> 
     <property name="hibernate.hikari.minEvictableIdleTimeMillis="60000"/> 
     <property name="hibernate.hikari.removeAbandonedOnBorrow="true" /> <property name="hibernate.hikari.removeAbandonedOnMaintenance="true" /> 
    <property name="hibernate.hikari.maxActive="30" /> 
    <property name="hibernate.hikari.maxIdle="10" /> 
    <property name="hibernate.hikari.maxWait="10000" /> 
    <property name="hibernate.hikari.initialSize="5" /> 
    <property name="hibernate.hikari.validationQuery= "SELECT 1" /> 
    <property name="hibernate.hikari.validationInterval="30000" /> 
    <property name="hibernate.hikari.removeAbandoned="true" /> 
    <property name="hibernate.hikari.removeAbandonedTimeout="60" /> 
    <property name="hibernate.hikari.logAbandoned="true"/> 


        </properties> 
       </persistence-unit> 

      </persistence> 

Prüfung Linkhttps://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down

0

Der Grund dafür könnte sein, dass die Verbindungen von der Datenbank geschlossen werden. Wenn die Anwendung versucht, diese Verbindungen abzufragen, ist sessionFactory nicht verfügbar und löst eine Ausnahme aus.

Ich hatte ähnliche Probleme in der Vergangenheit und der einzige Unterschied ist, dass ich den c3p0 Connection Pool verwendet habe. Versuchen Sie also, die Eigenschaften connectionTestQuery und idleTimeout für Ihren Verbindungsanbieter festzulegen.

You may refer to this answer

Verwandte Themen