Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Apache Derby eingebettet im WebSpere einsetzen

Für die Speicherung unkri­ti­scher Daten oder wäh­rend der Entwicklung kann es sinn­voll sein, anstatt eines kom­ple­xen DBMS´s eine leicht­ge­wich­tige ein­ge­bet­tete Datenbank, wie z.B. Apache Derby einzusetzen.

In die­sem Artikel soll beschrie­ben wer­den, wie man die Erstellung einer Apache Derby Datenbank im Embedded Mode für die Verwendung in einer Enterprise Application in IBM WebSphere bewerk­stel­li­gen kann.

Vorbereitung

Als ers­tes muss sicher­ge­stellt wer­den, dass im ent­spre­chen­den Scope die fol­gen­den benö­tig­ten Umgebungsvariablen im WebSphere gesetzt sind:

Variablenname
Bedeutung
Beispielwert
DERBY_JDBC_DRIVER_PATH  Zeigt auf das Verzeichnis, wel­ches den JDBC Treiber für die Derby Datenbank enthält. ${WAS_INSTALL_ROOT}/derby/lib
WAS_INSTALL_ROOT 
(optio­nal)
Zeigt auf das Installationsverzeichnis des WebSphere Servers. /opt/IBM/WebSphere/AppServer
USER_INSTALL_ROOT  Zeigt auf das ent­spre­chende Installationsverzeichnis des Nutzers /opt/IBM/WebSphere/AppServer/profiles/AppSrv01 

 

Einrichtung

Falls noch nicht vor­han­den, muss unter dem Menüpunkt Resources -> JDBC -> JDBC Providers ein neuer Provider für die Derby Datenbank im ent­spre­chen­den Scope erstellt werden.

Anschließend muss unter Resources -> JDBC -> Data Sources mit den fol­gen­den Schritten eine neue Derby Datasource ange­legt wer­den. Bei der Auswahl des JDBC Providers muss der gewünschte Derby JDBC Provider aus­ge­wählt wer­den, z.B.  "Default Grid Derby JDBC Provider".

Datenquelle erstellen

JDBC Provider auswählen
JDBC Provider auswählen

 

screen_create_datasource_3
Datenbanknamen ver­ge­ben

 

screen_create_datasource_4
Security ali­a­ses

Abschließend muss noch in den Custom Properties der soeben erstell­ten Derby Datasource ein­ge­stellt wer­den, dass sie bei Bedarf neu im Dateisystem ange­legt wer­den soll. Diese Einstellung erreicht man unter Resources -> JDBC -> Data sources -> ${My Derby DataSource} -> Custom Properties (auf der rech­ten Seite). Anschließend öff­net sich die fol­gende Ansicht:

Custom Properties
Custom Properties

Der Wert für createDatabase muss hier auf "create" gesetzt wer­den. Anschließend kann die Verbindung getes­tet wer­den und die Derby Datenbank wird unter ihrem kon­fi­gu­rier­ten JNDI - Namen erreich­bar sein.

Code Beispiel

Es folgt ein ver­ein­fach­tes Beispiel, was exem­pla­risch den Zugriff auf die ein­ge­bet­tete Datenbank demonstriert:

 
public class DerbyService {
  private Hashtable<String, String> env;
  private Context ctx;
  private static final String SQL_TABLE_NAME = "EMPLOYEE";
  private static final String SQL_CREATE_TABLE = "CREATE TABLE employee(id INT PRIMARY KEY, name CHAR(40), vorname CHAR(40))";
  private static final String SQL_INSERT_ENTRY = "INSERT INTO employee(id, name, vorname) VALUES (?, 'Mustermann', 'Max')";
  private static final String SQL_SELECT_ALL = "SELECT * FROM employee";
  public DerbyService() {
    env = new Hashtable<String, String>();
    env.put(PROPS.JNDI_CACHE_OBJECT, PROPS.JNDI_CACHE_OBJECT_CLEARED);
    try {
      ctx = new InitialContext(env);     
      DataSource ds = (DataSource) ctx.lookup("jdbc/test/derby");      
      Connection connection = ds.getConnection();
      DatabaseMetaData md = connection.getMetaData();
      ResultSet rs = md.getTables(null, null, "%", null);
      boolean tableExists = false;
      while (rs.next()) {
        if (rs.getString(3).equals(SQL_TABLE_NAME)) {
          tableExists = true;
        }
      }
      Statement st = connection.createStatement();
      if(!tableExists) {
        st.execute(SQL_CREATE_TABLE);
      }       
      int id = 0;
      rs = st.executeQuery(SQL_SELECT_ALL);
      if(rs.next()) {
        String name = rs.getString("name");
        id = rs.getInt("id");
      }
      id++;
      PreparedStatement psInsertSQL = 
	        connection.prepareStatement(SQL_INSERT_ENTRY);
      psInsertSQL.setInt(1, id);
      psInsertSQL.execute();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Weiterführende Quellen:

18. November 2014

Pin It on Pinterest