2015-07-04 8 views
8

Moja aplikacja wiosennego rozruchu zawsze pokazuje mi ten błąd whitelabel rano: Nie można otworzyć JPA EntityManager dla transakcji; Zagnieżdżony wyjątek to: javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC rozpoczyna transakcję: nie powiodło się:Połączenie utracone na noc (rozruch wiosenny + mysql)

Przeszukałem sieć. Myślę, że może to oznaczać, że mysql zamyka połączenie przez 8 godzin nieaktywności. Jednak zgodnie z wiosną dokumentu będzie automatycznie skonfigurować źródło danych apache puli. http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html

Nie wiem, jak skonfigurować kod aplikacji lub bazę danych.

Oto build.gradle Używam:

buildscript { 
    ext { 
     springBootVersion = '1.2.3.RELEASE' 
    } 
    repositories { 
     maven { url "http://repo.spring.io/libs-snapshot" } 
     mavenLocal() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE") 
    } 
} 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 
apply plugin: 'war' 
apply plugin: 'application' 

repositories { 
    mavenCentral() 
    maven { url "http://repo.spring.io/libs-snapshot" } 
    maven { url "http://maven.springframework.org/milestone" } 
} 

// Seems tomcat 8 doesn't work with paypal 
configurations.all { 
    resolutionStrategy { 
     eachDependency { 
      if (it.requested.group == 'org.apache.tomcat.embed') { 
       it.useVersion '7.0.59' 
      } 
     } 
    } 
} 

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-tomcat:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    compile("org.springframework.boot:spring-boot-starter-mail:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-test:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-security:${springBootVersion}") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}") 
    compile("org.springframework.data:spring-data-rest-webmvc") 
    compile("javax.servlet:jstl:1.2") 
    compile("org.apache.logging.log4j:log4j-api:2.3") 
    compile("org.apache.logging.log4j:log4j-core:2.3") 
    compile("com.paypal.sdk:rest-api-sdk:1.2.1") 
    compile("com.opencsv:opencsv:3.4") 
    compile("mysql:mysql-connector-java:5.1.35") 
    compile("com.google.guava:guava:17.0") 
    compile("org.apache.httpcomponents:httpclient:4.3.4") 
    compile("com.squareup.retrofit:retrofit:1.6.0") 
    compile("commons-io:commons-io:2.4") 
    compile("org.apache.commons:commons-lang3:3.4") 
    compile("com.amazonaws:aws-java-sdk:1.9.34") 

    providedCompile("org.apache.tomcat.embed:tomcat-embed-jasper:8.0.22") 

    testCompile("junit:junit") 
} 

sourceCompatibility = 1.7 
targetCompatibility = 1.7 

war { 
    baseName = 'gs-convert-jar-to-war' 
    version = '0.1.0' 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 

Oto konfiguracje bazy danych w application.properties:

spring.datasource.url=jdbc:mysql://fakeurl:3306/qa 
spring.datasource.username=username 
spring.datasource.password=password 
spring.datasource.driverClassName=com.mysql.jdbc.Driver 
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect 
# 
# hibernate 
# 
spring.jpa.hibernate.ddl-auto=update 

Dla źródła danych używam repozytorium danych sprężyny:

@Repository 
public interface EventRepository extends CrudRepository<EventDetail, Long> { 

} 

Tutaj jest wynik w bazie danych mysql z uruchomionym "pokaż zmienne takie jak"% czasu out% ':

'connect_timeout','10' 
'delayed_insert_timeout','300' 
'innodb_flush_log_at_timeout','1' 
'innodb_lock_wait_timeout','50' 
'innodb_rollback_on_timeout','OFF' 
'interactive_timeout','28800' 
'lock_wait_timeout','31536000' 
'net_read_timeout','30' 
'net_write_timeout','60' 
'rpl_stop_slave_timeout','31536000' 
'slave_net_timeout','3600' 
'wait_timeout','28800' 

Odpowiedz

13

Odjazd tej odpowiedzi: Spring Boot JPA - configuring auto reconnect

Krótko mówiąc, trzeba:

spring.datasource.testOnBorrow=true 
spring.datasource.validationQuery=SELECT 1 
+0

Nie widziałem tej wiadomości w ciągu ostatnich dwóch dni. Myślę, że to działa, – darklord

4

Można również zobaczyć link Mówi Ci to następujące linie w pliku application.properties.

spring.datasource.testWhileIdle = true 
spring.datasource.timeBetweenEvictionRunsMillis = 3600000 
spring.datasource.validationQuery = SELECT 1 
0

Można to naprawić, ustawiając właściwość wait_timeout = 31536000 na serwerze DB. Jest to odpowiednik jednego roku. Jeśli DB działa w środowisku AWS, przejdź do grupy Parametry-> utwórz nową grupę -> ustaw wait_timeout = 31536000 i przypisz nowo utworzoną grupę parametrów do swojej instancji RDS. Jeśli chcesz to naprawić w instancji wiosennego rozruchu, możesz naprawić tylko przez ustawienia C3P0, ale tego nie próbowałem.

Powiązane problemy