Ich habe eine Anwendung mit einer Datenquelle. Jedes Mal, wenn ich die Anwendung von der Manager-GUI deimplementiere, werden die Datenquellen geschlossen. Wenn ich versuche, eine erneute Bereitstellung durchzuführen, bleibt die Datenquelle geschlossen und löst die folgende Ausnahme aus:
%Vor%Das Neustarten des Servers löst dieses Problem, aber das ist keine akzeptable Lösung für eine Produktionsanwendung.
Ich habe eine andere Anwendung mit einer anderen Datenquelle mit demselben Problem.
Beide Anwendungen verwenden Spring Boot Version 1.1.4 mit Tomcat 7. Eine der Anwendungen wurde in Spring Boot konvertiert und hatte vor der Konvertierung keine Probleme mit der Datenquelle.
Im Folgenden erstelle ich die Datenquelle in meiner Spring Boot Application.java-Datei.
%Vor%Wie verhindere ich das?
Dies ist nicht spezifisch für Spring Boot, es ist Standard Spring Verhalten.
Standardmäßig wird Spring auf die Methode zum Löschen eines Beans verweisen. Aus dem Javadoc für @Bean
:
Der Container wird aus praktischen Gründen versuchen, eine Methode zum Zerstören auf ein Objekt zurückzuführen, das von der Methode
@Bean
zurückgegeben wurde. Wenn zum Beispiel eine Methode@Bean
einen Apache Commons-DBCPBasicDataSource
zurückgibt, wird der Container die für dieses Objekt verfügbare Methodeclose()
bemerken und sie automatisch alsdestroyMethod
registrieren. Dieser "Methoden-Inferenz-Modus" ist derzeit darauf beschränkt, nur öffentliche, keine Arg-Methoden mit dem Namen 'close' oder 'shutdown' zu erkennen.
Im Javadoc wird beschrieben, wie dieses Verhalten deaktiviert wird:
Um die Methodenableitung für eine bestimmte
@Bean
zu deaktivieren, geben Sie eine leere Zeichenfolge als Wert an, z.@Bean(destroyMethod="")
Sie müssen Ihre dataSource()
Methode aktualisieren:
Tags und Links spring-boot tomcat7