Plug-ins für die Kommunikation mit Datenbanken

Mit einem Loader-Plug-in kann sich eine ObjectGrid wie ein Speichercache für Daten verhalten, die gewöhnlich in einem persistenten Speicher auf demselben System oder einem anderen System gespeichert werden. Gewöhnlich wird eine Datenbank oder ein Dateisystem als persistenter Speicher verwendet. Es kann auch eine ferne Java Virtual Machine (JVM) als Datenquelle verwendet werden, was die Erstellung Hub-basierter Caches mit ObjectGrid ermöglicht. Ein Loader enthält die Logik für das Lesen aus einem und das Schreiben in einem persistenten Speicher.

Loader (Ladeprogramme) sind BackingMap-Plug-ins, die aufgerufen werden, wenn Änderungen an der BackingMap vorgenommen werden oder wenn die BackingMap eine Datenanforderung nicht bedienen kann (Cachefehler).

Abbildung 1. Loader
Der Loader befindet sich im primären Shard. Der Loader kommuniziert mit der Datenbank und der BackingMap.

WebSphere eXtreme Scale enthält zwei integrierte Loader für die Integration relationaler Datenbank-Back-Ends. Die JPA-Loader (Java Persistence API) verwenden die ORB-Funktionen (Object-Relational Mapping, objektrelationale Zuordnung) der OpenJPA- und Hibernate-Implementierungen der JPA-Spezifikation.

Loader verwenden

Wenn Sie der BackingMap-Konfiguration einen Loader hinzufügen möchten, können Sie die programmgesteuerte Konfiguration oder die XML-Konfiguration verwenden. Ein Loader steht mit einer BackingMap in folgender Beziehung:
  • Eine BackingMap kann nur einen einzigen Loader haben.
  • Eine Client-BackingMap (naher Cache) kann keinen Loader haben.
  • Eine Loader-Definition kann auf mehrere BackingMaps angewendet werden, aber jede BackingMap hat eine eigene Loader-Instanz.

Loader in Multimasterkonfigurationen

Hinweise zur Verwendung von Loadern in Multimasterkonfigurationen finden Sie im Abschnitt Hinweise zu Ladeprogrammen in einer Multimastertopologie.

Loader programmgesteuert integrieren

Das folgende Code-Snippet veranschaulicht, wie ein anwendungsdefinierter Loader in die BackingMap für map1 über die API "ObjectGrid" integriert wird:

import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
import com.ibm.websphere.objectgrid.ObjectGridManager;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.BackingMap;
ObjectGridManager ogManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogManager.createObjectGrid( "grid" );
BackingMap bm = og.defineMap( "map1" );
MyLoader loader = new MyLoader();
loader.setDataBaseName("testdb");
loader.setIsolationLevel("read committed");
bm.setLoader( loader );

In diesem Snippet wird davon ausgegangen, dass die Klasse "MyLoader" die anwendungsdefinierte Klasse ist, die die Schnittstelle "com.ibm.websphere.objectgrid.plugins.Loader" definiert. Da die Assoziation eines Loaders zu einer BackingMap nach der Initialisierung des ObjectGrids nicht mehr geändert werden kann, muss der Code vor dem Aufruf der Methode "initialize" der aufgerufenen ObjectGrid-Schnittstelle aufgerufen werden. Es wird eine Ausnahme vom Typ "IllegalStateException" in einem Aufruf der Methode "setLoader" ausgelöst, wenn diese nach der Initialisierung aufgerufen wird.

Der anwendungsdefinierte Loader kann definierte Eigenschaften haben. In dem Beispiel wird der Loader "MyLoader" verwendet, um Daten aus einer Tabelle in einer relationalen Datenbank zu lesen und Daten in diese Tabelle zu schreiben. Der Loader muss den Namen der Datenbank und die SQL-Isolationsstufe angeben. Der Loader "MyLoader" enthält die Methoden "setDataBaseName" und "setIsolationLevel", mit denen die Anwendung diese beiden Loader-Eigenschaften setzen kann.

XML-Konfiguration für die Integration eines Loaders

Ein anwendungsdefinierter Loader kann auch über eine XML-Datei integriert werden. Das folgende Beispiel veranschaulicht, wie der Loader "MyLoader" in die BackingMap "map1" mit demselben Datenbanknamen und denselben Loader-Eigenschaften für die Isolationsstufe integriert wird. Sie müssen den Klassennamen für Ihren Loader, den Datenbanknamen und die Verbindungsdetails sowie die Eigenschaften für die Isolationsstufe angeben. Sie können dieselbe XML-Struktur verwenden, wenn Sie lediglich einen Preloader verwenden. Geben Sie in diesem Fall nur den Klassennamen des Preloaders an Stelle des vollständigen Loader-Klassennamens an.
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
 xmlns="http://ibm.com/ws/objectgrid/config">
<objectGrids>
    <objectGrid name="grid">
        <backingMap name="map1" pluginCollectionRef="map1" lockStrategy="OPTIMISTIC" />
    </objectGrid>
</objectGrids>
<backingMapPluginCollections>
    <backingMapPluginCollection id="map1">
        <bean id="Loader" className="com.myapplication.MyLoader">
            <property name="dataBaseName" 
                      type="java.lang.String" 
                      value="testdb" 
                      description="database name" />
            <property name="isolationLevel" 
                      type="java.lang.String" 
                      value="read committed" 
                      description="iso level" />
        </bean>
    </backingMapPluginCollection>
</backingMapPluginCollections>
</objectGridConfig>