Deployment bleibt hängen, wenn die DB neu gestertet wird

tonigazar

Grünschnabel
Hallo an alle.

Ich habe ein Problem. Ich habe eine Anwendung in JBoss, die in eine Datenbank Daten speichert und liest. Die Anwendung wird tags in Anspruch genommen, nachts nicht. Die Datenbank wird jeden Morgen um 5:00 Uhr neu gestartet.

Und hier kommt mein Problem. Nachdem die Datenbank neugestartet wird, funktioniert die Anwendung nicht mehr wegen Getrennte Verbindung. JBoss versucht dann nicht mehr die Verbindung wieder zu kriegen und somit bleibt die Anwendung nicht ansprechbar. Das einzige was dann übrig bleibt ist manuel neu deployen oder JBoss neu starten.

Und meine Frage: Weiss jemand ob es eine Möglichkeit/Einstellung gibt, mit der man angibt, dass JBoss nach dem Neustart der Datenbank nochmal automatisch versuchen soll, die Anwendung zu deployen oder die Verbindung zur Datenbank wiederherzustellen.

Danke für Eure Antworten

Grüße

Anton
 
Timeouts nutzen? Connection Pools? Reconnect ordentlich konfigurieren? Sowas steht doch im Normalfall in der Doku deines Appservers.

Aber mal ehrlich - wer startet denn jede Nacht eine Produktivdatenbank durch?

Gruß
Ollie
 
Hallo,

welche Datenbank verwendest du denn? Manche JDBC Treiber bieten die Möglichkeit eines automatischen reconnects an, falls die Verbindung mal unterbrochen wird. (Der MySQL JDBC Treiber unterstützt dies beispielsweise)

Gruß Tom
 
Vielen Dank für die schnellen Antworten.

Es werden 4 Datenbanken eingesetzt: Oracle 9, 10 und MSSQL Server 2000 und 2005.
Ein Neustart der DB ist nicht unbedingt bei jedem unserer Kunden der Fall, aber es gibt genug solche, die es machen und wundern sich dann am nächsten Tag warum die Anwendung nicht geht.

Die Anwendung ist eine reine EJB 3.0 Anwendung und die Datenbankverbindung/Transaktionen wird von JBOSS geregelt und Ich weiß nicht wie und wo man die Timeouts einstellen kann, vielleicht in der persistence.xml Datei, finde aber keine Info dafür. Hier ist ein Auszug aus der persistence.xml mit der Angabe der Properties:

Code:
      <properties>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>


        <property name="hibernate.show_sql" value="false"/>
	<property name="hibernate.connection.release_mode" value="auto" />
	<property name="hibernate.connection.isolation" value="Connection.TRANSACTION_SERIALIZABLE" />
	  </properties>

Grüße

Anton
 
Hm, und da trägst du die Verbindungsdaten für deine Datenbank ein? Dann umschiffst du ja völlig das Resourcenhandling deines JBoss? Warum nicht eine JBoss gemanagte DataSource benutzen?

Gruß
Ollie
 
Hm, und da trägst du die Verbindungsdaten für deine Datenbank ein? Dann umschiffst du ja völlig das Resourcenhandling deines JBoss? Warum nicht eine JBoss gemanagte DataSource benutzen?

Gruß
Ollie

Natürlich nicht! Die Datasource *ds.xml Datei ist ja im deploy Verzeichnis (mit Verbindungsdaten host, Treiber, Username etc.).

Es geht aber gar nicht darum, sondern, wo ich die Timeout Einstellungen machen kann - in die *ds.xml oder in die persistence.xml oder woanders?

Grüße

Anton
 
Hallo,

solche Einstellungen hinterlegt man normalerweise in dem entsprechenden DataSource Deployment Descriptor (xxx-ds.xml).

Dort kannst du JDBC Treiber / DataSource spezifische Properties setzen.
Welche JDBC Treiber eine Reconnect Funktionalität anbieten und durch welche Properties man diese anschaltet kannst du der Dokumentation der entsprechenden JDBC Treiber
entnehmen.

Nicht jeder JDBC Treiber unterstützt dieses Feature... eine Möglichkeit wäre auch eine entsprechende DataSource Implementierung zu schreiben, welche eine andere DataSource wrapped und beim Aufruf von getConnection() an die gewrappedte DataSource weiterleitet und prüft ob die Connection erfolgreich war und gültig ist. (Hier catched man dann die entsprechenden SQLExceptions mit dem passenden Error Code) Wenn nicht wird einfach nach einem TimeOut wieder versucht eine Connection zu bekommen... (retry...)

Gruß Tom
 
Aber liege ich falsch, wenn ich genau das von der DataSource Implementierung eines Appservers erwarten würde? Wofür brauch ich die Kiste sonst? ;).

In einem Nicht-App-Server-Umfeld würde ich jetzt auf Commons-DBCP verweisen ;).

Gruß
Ollie
 
Hallo Tom,

danke für deine schnelle und ausführliche Antwort. Ich werde dann versuchen rauszufinden ob die DB Treiber für Oracle und MSSQL Server diese Funktionalität anbieten und wie das genau einzustellen ist, und wenn nicht, werde ich selber einen Implementierung schreiben. Ich werde mich dann melden sobald ich ein Ergebnis habe

Grüße

Anton
 
Hallo wieder,

ich habe die Lösung. Wie Tom gerade geschrieben hat, lag es in den Konfigurationen in der DataSource *ds.xml Datei. Ich poste meine 2 Dateien DS.

Oracle:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!-- JBoss Server DataSource -->
<datasources>
    <local-tx-datasource>
        <jndi-name>jdbc/Kiwo</jndi-name>
        <connection-url>jdbc:oracle:thin:@hostname:1521:ent</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <security-domain>EncryptDBPassword</security-domain>
        
        <min-pool-size>5</min-pool-size>
        <max-pool-size>100</max-pool-size>

        <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name>
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
        <new-connection-sql>select current_timestamp from dual</new-connection-sql>
        <check-valid-connection-sql>select current_timestamp from dual</check-valid-connection-sql>
        
    </local-tx-datasource>
</datasources>

MSSQL:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!-- JBoss Server DataSource -->
<datasources>
    <local-tx-datasource>
        <jndi-name>jdbc/Kiwo</jndi-name>
        <connection-url>jdbc:sqlserver://hostname:1433;DatabaseName=kiwoent</connection-url>
        <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
        <security-domain>EncryptDBPassword</security-domain>
        
        <min-pool-size>5</min-pool-size>
        <max-pool-size>100</max-pool-size>
        
        <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MSSQLValidConnectionChecker</valid-connection-checker-class-name>
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.DummyExceptionSorter</exception-sorter-class-name>
        <new-connection-sql>select GETDATE()</new-connection-sql>
        <check-valid-connection-sql>select GETDATE()</check-valid-connection-sql>
        
    </local-tx-datasource>
</datasources>

Mit diesen Einstellungen wird versucht die Verbindung zu der DB wiederherzustellen, nachdem die weg war.

Schönen Tag noch und Danke für Euere Hilfe.

Grüße

Anton
 
Zurück