Mittwoch, Juli 06, 2005

Feature requests

1 Comments:

Blogger mep said...

Im DatabaseManager gibt es ab der Version 0.99.39 neu die Methoden:

public DatabaseBulkService retrieveBulkService( SQLProcessor processor )
public DatabaseBulkService retrieveBulkService( TransactionMonitor transactionMonitor,
SQLProcessor processor )
public DatabaseBulkService retrieveBulkService( TransactionMonitor transactionMonitor,
BatchControl batchControl,
SQLProcessor processor )


Was ist der DatabaseBulkService, DatabaseBulkService vs. BatchSQLProcessor
-------------------------------------------------------------------------
Der BatchSQLProcessor dient als Sammeltopf für sämtliche Abfragen und Änderungen an eine Datenbank, welche innerhalb einer Transaktion ablaufen sollen. Der Processor wird dabei vorerst aufgebaut um eine möglichst kurze Transaktions-Phase zu haben. Wenn der BatchSQLProcessor ausgeführt wird mittels executeBatch-Methode sind sämtliche SQL-Statements vorbereitet und die Eingabe-Parameter definiert. Das beschriebene Verhalten hat aber auch seine Nachteile: Wenn grosse Datenmengen verarbeitet werden müssen, d.h. viele Insert-, Update- oder Delete-Statement ausgeführt werden müssen und mit dem BatchSQLProcessor gearbeitet wird werden sämtliche Daten zuerst im Heap abgelegt und bei der Ausfürhung der Datenbank übergeben. Diese muss diese Daten auch verarbeiten und somit wird viel Arbeitsspeicher verwendet und benötigt, welches sicher auch in der Performance niederschlägt.

Hier setzt der DatabaseBulkService an. Ziel der Implementierung ist, dass bei der Verarbeitung von sehr grossen Datenmengen (>1000) die Daten nach und nach der Datenbank übergeben werden kann. Der grundlegende Mechanismus des Bulk-Services ist derselbe wie im gesamten jptools-Datenbank Framework. Zuerst wird ein SQLProcessor definiert (besser mittels SQLProcessor aus dem SQL-Code generiert). Danach kann mittels einer Instanz des SQLProcessors ein DatabaseBulkService angefordert werden. Dieser Service bietet folgende Methoden an:

/**
* Adds the data for one new row.
* @param values the parameter values
* @throws SQLException
*/
public void add( Object[] values )


/**
* Abords the service
*/
public void abordService()


/**
* Close the underlining service.
* @throws SQLException
*/
public void closeService()
throws SQLException


Nach dem Empfangen des Services kann direkt mittels add-Methode Daten übergeben werden (die Grösse des Object-Arrays muss bei jedem Aufruf genau stimmen!). Dieser übergibt diese der Datenbank nach und nach. Wenn die Daten-Übertragung abgeschlossen ist kann dies mittels closeService realisiert werden. Danach werden sämtliche Daten commitet. Die abordService-Methode veranlasst einen Rollback. Nach dem Abbrechen oder Schliessen des Services kann der Service nicht mehr verwendet werden!

Nachteil des DatabaseBulkService ist, dass nur ein spezifisches Statement ausgeführt werden kann und nicht wie beim BatchSQLProcessor mehrere unterschiedliche. Zudem steht die Transaktion vom start (retrieveBulkService) bis zum closeService offen. Dies kann auch sehr heikel sein, dafür ist das ganze performanter!

Beim Aufruf der Methode

public DatabaseBulkService retrieveBulkService( TransactionMonitor transactionMonitor,
BatchControl batchControl,
SQLProcessor processor )

Kann ein BatchControl übergeben werden. Es existieren momentan zwei: JDBCBatchControl und OracleBatchControl. Wenn man mit Oracle arbeitet sollte man für die performanteste Übertragung der Daten den OracleBatchControl verwenden. Dieser verwendet Oracle-Spezifische Bulk-Operations, schneller geht es nicht (nicht mal mit PL/SQL!). Per default wird mit JDBCBatchControl gearbeitet.

Meine Messungen haben ergeben, dass bereits ab einer Datenmenge von 2MB mit ca. 20'000 Rows die Verarbeitung um rund 40% verbessert wird unter Oracle (Vergleich zwischen BatchSQLProcessors vs. DatabaseBulkServce).

Momentan ist das API noch nicht definitiv in den Stein gemeiselt, d.h. es werden bestimmt noch 2-3 Helper-Methoden ergänzt oder umbenannt.

16 August, 2005 09:01  

Kommentar veröffentlichen

<< Home