Ruby on Rails und IBM DB2

Rails und DB2 haben mich ein wenig beschäftigt. Das Ganze hat irgendwie hingehauen, hat mir aber einige Hürden bereitet.

Grundsätzlich habe ich gedacht durch den abstrahierten Datenbank-Handler wäre es kein Problem mein Projekt (Rails 3.0.6) von MySQL auf DB2 umzustellen. Im Endeffekt war es auch kein großes Problem, dennoch gab es einige „Hürden“ die es zu bewältigen gab.

Als DB2-Version kam zu Entwicklungszwecken ein DB2 9.7.4 Express-C zum Einsatz. Ich lokal auf meinem Entwicklungsplatz dafür das Paket mit dem kompletten Datenbank-Server installiert. Per „db2cc“ war es auch einfach möglich eine Datenbank zu erstellen.

In Rails hat sich der DB2-Handler „ibm_db“ dann auch gleich mit der Datenbank korrekt verbunden. Dennoch funktionierte mein Projekt nicht mehr. Es gab hier Fehler, die ich nicht erklären konnte. Nach genauem sichten des Codes, habe ich bemerkt, dass DB2 viel genauer arbeitet als MySQL. So habe ich Abfragen getätigt, bei denen ich keine Typ-Konvertierung durchgeführt habe. MySQL hat dieses auf Anhieb verstanden, DB2 gibt mir einen Fehler aus. Ich habe beispielsweise bei ein ID (natürlich eine Zahl) in einer Abfrage verwendet. Die abzufragende Tabelle hat diese ID allerdings als String gespeichert. Da ich hier den Typ nicht konvertiert habe, kam es zu einem Fehler. Mit einem ergänzendem „.to_s“ war der Fehler beseitigt.

Sehr schön. Aber es gab noch ein Problem. Das Produktivszenario sieht so aus, dass ein DB2-Server vom Applikationsserver getrennt arbeitet. Die Rails-Anwendung sollte also nicht mit meinem lokalen Datenbank-Server kommunizieren, sondern über das Netzwerk eine Verbindung aufbauen. Ohne DB2-Libs und Includes ist es aber nicht möglich das ibm_db Gem per „gem install ibm_db“ zu installieren. Und den großen Datenbank-Server zu installieren erschien mir übertrieben und ist ach nicht gewollt.

Auf der IBM-Seite des DB2 Expess-C läßt sich auch nicht sofort ein passendes Runtime-Paket o.ä. finden. Nach etwas Zeit und Suchen folgte ich dem Link zu „Data server drivers for Java, .NET, and other platforms“, der direkt von der Express-C Seite abgeht. Hier gab es also noch weitere Downloads für DB2-Express-C. Unter anderem das Paket „IBM Data Server Client“. Dieses beinhaltet alle notwendigen Ressourcen zur Installation des DB2-Handlers. Wichtig dabei war allerdings, dass ich die Pfade zum Lib und Include-Verzeichnis angeben. Mit

export IBM_DB_INCLUDE=/home/user01/Downloads/dsdriver/include/
export IBM_DB_LIB=/home/user01/Downloads/dsdriver/lib/

war das schnell erledigt. Anschließen wurde das Gem fehlerfrei installiert.

Und trotzdem fand meine Rails Anwendung nicht die Datenbank auf dem entfernten Server. Meine database.yml sah ungefähr so aus (Auszug!):

production:
      database: mydbprd
      username: user01
      password: Start123
      schema: mydb
      host: db2host
      port: 50002

Wenn man DB2 auf einem Client benutzt und dieser sich per Netzwerk mit einem DB2-Server verbinden soll, ist es notwendig, dass der DB2-Handler weiß, wo die Datenbank liegt. Dafür muss die Datenbank katalogisiert werden. Katalogisieren kann man mit dem Befehl „db2“, welches sich im Paket des Datenbank-Server befindet, allerdings nicht im Handler-Paket mit den passenden Ressourcen.

Ich benötigte daher noch ein weiteres Paket. Auch dieses gab es auf der von mir entdeckten Seite.

>> IBM Runtime Client

Wenn dieses installiert ist, kann auch die lokale DB2-Konsole (Command Line Processor = CLP) geöffnet werden. Per Befehl „db2“ gelangt man dorthin und kann nun katalogisieren. Als erstes den passenden Node über den die Kommunikation des DB2-Servers durchgeführt wird. Dieser wird über den Befehl

CATALOG TCPIP NODE mydb2node REMOTE db2host SERVER 50002

katalogisiert. Anschließend ist es noch notwendig die Datenbank zu katalogisieren:

CATALOG DATABASE mydbprd as prod_db AT mydb2node

Über den DB2-CLP habe ich noch überprüft, ob die Verbindung zur Datenbank hergestellt werden kann. Dies erfolgt mit dem Befehl „Connect“:

CONNECT TO mydbprd USER user01 USING Start123

Als diese Schritte durchgeführt wurden, konnte meine Rails-Anwendung mit der entfernten DB2-Datenbank kommunizieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *