Zum Erstellen einer eigenen Helper-Klasse für den Datenspeicher
für Datenquellen, die vom Anwendungsserver nicht unterstützt werden, wenden Sie die
WebSphere-Erweiterung, die Klasse "GenericDataStoreHelper", an. Mit Hilfe dieser Helper-Klasse kann Ihre JDBC-Konfiguration während der Transaktionen
datenbankspezifische Funktionen ausführen.
Vorbereitende Schritte
Wenn Sie eine Konfiguration mit einer Datenquelle verwenden, die der Anwendungsserver
unterstützt, können
Sie einen angepassten Helper für Datenspeicher erstellen. Dieser Helper ermöglicht Ihnen, die Datenbank zu nutzen, um während einer Transaktion Funktionen auszuführen, die ansonsten
nicht verfügbar sind. Sie müssen eine benutzerdefinierte DataStoreHelper-Klasse erstellen, und es werden
Informationen zum Erstellen einer neuen Ausnahmebehandlungsroutine bereitgestellt, der alle Ausnahmen abfängt,
die bei der Verwendung der angepassten Ausnahmebehandlungsroutine erstellt werden können.
Informationen zu diesem Vorgang
Veraltetes Feature: Das Konstantenfeld
CUSTOM_HELPER in der API der Klasse
"com.ibm.websphere.rsadapter.DataStoreHelper" ist veraltet.
Wenn Sie eine eigene "DataStoreHelper"-Implementierungsklasse erstellen, sollten Sie
"setHelperType(DataStoreHelper.CUSTOM_HELPER)" nicht aufrufen. Überlassen Sie die Einstellung des Werts für "HelperType" stattdessen der Implementierungsklasse, deren
Einstellungen übernommen werden.
depfeat
Vorgehensweise
- Erstellen Sie eine Klasse, die die vorhandenen Datenspeicher-Helper erweitert. Verwenden Sie den folgenden Code als Beispiel.
Dieser Typ von Datenquelle basiert auf einem angepassten JDBC-Provider:
package com.ibm.websphere.examples.adapter;
import java.sql.SQLException;
import javax.resource.ResourceException;
import com.ibm.websphere.appprofile.accessintent.AccessIntent;
import com.ibm.websphere.ce.cm.*;
import com.ibm.websphere.rsadapter.WSInteractionSpec;
/**
* Beispiel für DataStoreHelper-Klasse, das veranschaulicht, wie ein benutzerdefinierter
* DataStoreHelper erstellt wird. Die Implementierung für die einzelnen Methoden wird nur als
* Beispiel bereitgestellt. Für jeden benutzerdefinierten DataStoreHelper, der von einer
* realen Anwendung verwendet wird, sind wahrscheinlich mehr Daten erforderlich.
* In diesem Beispiel wird "doStatementCleanup(),getIsolationLevel()" überschrieben und
* eine benutzerdefinierte Ausnahmezuordnung definiert.
*/
public class ExampleDataStoreHelper extends com.ibm.websphere.rsadapter.GenericDataStoreHelper
{
public ExampleDataStoreHelper(java.util.Properties props)
{
super(props);
// Die DataStoreHelperMetaData-Werte für diese Helper-Funktion aktualisieren.
getMetaData().setGetTypeMapSupport(false);
// Die Zuordnungen von Ausnahmen für diese Helper-Funktion aktualisieren.
java.util.Map xMap = new java.util.HashMap();
// Eine Zuordnung von Fehlercodes zur StaleConnectionException hinzufügen.
xMap.put(new Integer(2310), StaleConnectionException.class);
// Eine Zuordnung von Fehlercodes zur DuplicateKeyException hinzufügen.
xMap.put(new Integer(1062), DuplicateKeyException.class);
// Eine Zuordnung des SQL-Status zur benutzerdefinierten ColumnNotFoundException hinzufügen.
xMap.put("S0022", ColumnNotFoundException.class);
// Eine übernommene Zuordnung des SQL-Status der StaleConnection rückgängig machen.
xMap.put("S1000", Void.class);
setUserDefinedMap(xMap);
// Wenn Sie eine Helper-Klasse erweitern, ist es
// normalerweise nicht erforderlich, 'getMetaData().setHelperType(...)'
// abzusetzen, weil die angepasste Helper-Klasse den Helper-Typ
// der übergeordneten Klasse übernimmt.
}
public void doStatementCleanup(java.sql.PreparedStatement stmt) throws SQLException
{
// Die Anweisung bereinigen, damit sie zwischengespeichert und wieder verwendet werden kann.
stmt.setCursorName("");
stmt.setEscapeProcessing(true);
stmt.setFetchDirection(java.sql.ResultSet.FETCH_FORWARD);
stmt.setMaxFieldSize(0);
stmt.setMaxRows(0);
stmt.setQueryTimeout(0);
}
public int getIsolationLevel(AccessIntent intent) throws ResourceException
{
// Eine auf dem AccessIntent basierende Isolationsstufe festlegen.
// WebSphere-Standardisolationsstufe auf TRANSACTION_SERIALIZABLE setzen
if (intent == null) return java.sql.Connection.TRANSACTION_SERIALIZABLE;
return intent.getConcurrencyControl() == AccessIntent.CONCURRENCY_CONTROL_OPTIMISTIC ?
java.sql.Connection.TRANSACTION_READ_COMMITTED :
java.sql.Connection.TRANSACTION_REPEATABLE_READ;
}
public int getLockType(AccessIntent intent) {
if ( intent.getConcurrencyControl() == AccessIntent.CONCURRENCY_CONTROL_PESSIMISTIC) {
if ( intent.getAccessType() == AccessIntent.ACCESS _TYPE_READ ){
return WSInteractionSpec.LOCKTYPE_SELECT;
}
else {
return WSInteractionSpec.LOCKTYPE_SELECT_FOR_UPDATE;
}
}
return WSInteractionSpec.LOCKTYPE_SELECT;
}
}
- Optional: Erstellen Sie eine eigene Klasse für Ausnahmebehandlungsroutinen. Verwenden Sie den folgenden Code als Leitfaden:
package com.ibm.websphere.examples.adapter;
import java.sql.SQLException;
import com.ibm.websphere.ce.cm.PortableSQLException;
/**
* Beispiel für PortableSQLException-Unterklasse, das veranschaulicht, wie eine
* benutzerdefinierte Ausnahme für die Zuordnung von Ausnahmen erstellt wird.
*/
public class ColumnNotFoundException extends PortableSQLException
{
public ColumnNotFoundException(SQLException sqlX)
{
super(sqlX);
}
}
- Kompilieren Sie die neu erstellten DataStoreHelper-Klassen. Für die Kompilierung müssen die folgenden JAR-Dateien im Klassenpfad enthalten sein:
- Wenn Sie eine Entwicklungsumgebung wie Eclipse verwenden, müssen Sie
diese JAR-Dateien im Klassenpfad definieren, um die Kompilierung durchzuführen. Nachdem Sie Ihre Dateien bearbeitet haben, erstellen Sie eine JAR-Datei des Projekts.
Spezifische Anweisungen finden Sie in der Hilfedokumentation zu Ihrer Entwicklungsumgebung.
- Wenn Sie keine Entwicklungsumgebung haben und den Javac-Compiler verwenden, gehen Sie wie folgt vor:
- Erstellen Sie, wie in Schritt 1 gezeigt,
eine Datei mit der Erweiterung ".java", die "GenericDataStoreHelper" erweitert.
- Wechseln Sie nach der Bearbeitung der Dateien im Befehlszeilendienstprogramm in Ihr Ausgangsverzeichnis.
- Setzen Sie den Klassenpfad mit dem folgenden Befehl:
- Kompilieren Sie Ihre Klassen. Geben Sie beispielsweise unter Windows-Betriebssystemen
den folgenden Befehl ein (dieser Befehl kompiliert alle Dateien mit der Erweiterung ".java" im angegebenen Verzeichnis):
C:\javac Ihr_Verzeichnis\*.java
- Erstellen Sie über das Verzeichnis Java eine JAR-Datei aller kompilierten
Klassendateien in Ihrem Verzeichnis. Geben Sie beispielsweise den folgenden Befehl unter Windows-Betriebssystemen ein (ändern
Sie myFile in den gewünschten Namen für Ihre JAR-Datei):
C:\Java> jar cf myFile.jar *.class
Weitere Informationen zur Verwendung des Javac-Compilers finden Sie auf der Oracle-Website zum Java-Compiler.
- Kopieren Sie Ihre kompilierten JAR-Dateien in ein Verzeichnis, und aktualisieren
Sie den Klassenpfad für den JDBC-Provider so, dass er diese Position enthält. Wenn Ihre JAR-Datei den Namen c:\myFile.jar hat, müssen Sie den Klassenpfad
ändern und c:\myFile.jar einfügen.
- Klicken Sie auf .
- Fügen Sie im Feld Klassenpfad die Position der kompilierten JAR-Dateien hinzu. Positionieren Sie den Cursor in dem Feld, drücken Sie die Eingabetaste, und fügen Sie eine neue
Zeile hinzu:
c:\myFile.jar
- Konfigurieren Sie den Anwendungsserver für die Verwendung der neuen angepassten DataStoreHelpe-Klasse.
- Wählen Sie in der Administrationskonsole
Ressourcen > JDBC > Datenquellen aus.
- Wählen Sie die Datenquelle aus, die Sie mit der angepassten
DataStoreHelper-Klasse konfiguieren möchten.
- Wählen Sie im Abschnitt Name der Helper-Klasse für Datenspeicher
die Option Benutzerdefinierte Helper-Klasse für Datenspeicher angeben aus.
- Geben Sie den Klassennamen für die erstellte Helper-Klasse für Datenspeicher ein.
- Wenden Sie Ihre Änderungen an und wählen Sie OK aus.