Symfoware

Symfowareについての考察blog

Firebird embeddedにJava1.7 + Jaybird + Ubuntuで接続する

Firebirdにはembeddedモードがあるようです。
このモードだと、サーバーをインストールすることなく
データベースファイルに接続できる模様。

SQLiteと同様に扱えるという解釈でいいのかな?と思います。

Java 1.7 + Jaybirdで試してみます。
OSはUbuntu 12.04 64bitを使用しました。





ダウンロード



JDBCドライバであるJaybirdを以下のURLからダウンロードします。
http://www.firebirdsql.org/en/jdbc-driver/

351_01.png


「Jaybird-2.2.4JDK_1.7.zip」をダウンロードしました。


解凍したフォルダの中に「jaybird-full-2.2.4.jar」があるので、
これを取り出しておきます。


もうひとつ、「libjaybird22_x64.so」も取り出しておきます。

OSに応じて、使用するファイルは異なります。

Windows 32bit:jaybird22.dll
Windows 64bit:jaybird22_x64.dll
Linux 32bit:libjaybird22.so
Linux 64bit:libjaybird22_x64.so





Firebird 64-bit Embeddedを以下のURLからダウンロードします。
http://www.firebirdsql.org/en/firebird-2-5-2-upd1/

351_02.png


今回はUbuntu 12.04 64bitで動かすので、
「FirebirdCS-2.5.2.26540-0.amd64.tar.gz」をダウンロードしました。

解凍したフォルダの中に「buildroot.tar.gz」という圧縮ファルがあるので、更に解凍。


opt/firebird/libの中にあるファイルを全て取り出しておきます。


libfbclient.so
libfbclient.so.2
libfbclient.so.2.5.2
libfbembed.so
libfbembed.so.2.5
libfbembed.so.2.5.2
libib_util.so
libicudata.so
libicudata.so.30
libicudata.so.30.0
libicui18n.so
libicui18n.so.30
libicui18n.so.30.0
libicuuc.so
libicuuc.so.30
libicuuc.so.30.0



libfbembed.so.2.5.2だけでいいのかな?と思っていましたが、他のファイルも必要です。
このセットがないとエラーになりました。








サンプルプログラム



こちらを参考にしました。
How to use Firebird embedded with Java (via JDBC)?

libfbembed.so.2.5.2だけあればいいように思いますが、
上記の通り全てのファイルが必要っぽいです。

こんなエラーが発生します。


Exception in thread "main" java.lang.RuntimeException: Failed to initialize Jaybird native library. This is most likely due to a failure to load the firebird client library.
    at org.firebirdsql.gds.impl.jni.JniGDSImpl.attemptToLoadAClientLibraryFromList(JniGDSImpl.java:106)
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSImpl.<init>(EmbeddedGDSImpl.java:31)
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSImpl.<init>(EmbeddedGDSImpl.java:21)
    at org.firebirdsql.gds.impl.jni.EmbeddedGDSFactoryPlugin.getGDS(EmbeddedGDSFactoryPlugin.java:40)
    at org.firebirdsql.gds.impl.GDSFactory.getGDSForType(GDSFactory.java:275)
    at org.firebirdsql.jca.FBManagedConnectionFactory.getGDS(FBManagedConnectionFactory.java:114)
    at org.firebirdsql.jdbc.AbstractDriver.connect(AbstractDriver.java:120)
    at java.sql.DriverManager.getConnection(DriverManager.java:579)
    at java.sql.DriverManager.getConnection(DriverManager.java:243)
    at sample.FBEmbedded.main(FBEmbedded.java:15)




http://sourceforge.net/p/firebird/code/HEAD/tree/client-java/tags/Jaybird_2_2_4/src/native/jaygds/source/generic_unix/platform.cpp
ここらへんを読んで、dlopenを調べてやっとわかりました。


サンプルプログラムは簡単です。


  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. public class FBEmbedded {
  6.     
  7.     public static void main(String[] args) throws Exception {
  8.         
  9.         String url = "jdbc:firebirdsql:embedded:/home/baranche/post.fdb?encoding=UTF8";
  10.         
  11.         try (Connection con = DriverManager.getConnection(url);
  12.                 Statement stmt = con.createStatement()) {
  13.             
  14.             // テーブル作成
  15.             stmt.execute("create table embtest (id int, name varchar(100))");
  16.             
  17.             // データ登録
  18.             stmt.execute("insert into embtest(id,name) values(1,'テストだよー')");
  19.             
  20.             // 登録したデータを検索
  21.             ResultSet rs = stmt.executeQuery("select * from embtest");
  22.             while(rs.next()) {
  23.                 System.out.println(rs.getString("name"));
  24.             }
  25.         }
  26.     }
  27. }




ただ、実行するまでが長かった。
Eclipseで実行する場合、「実行の構成」に手を加える必要があります。

確認するポイントは2つ。

「引数」タブの「VM引数」に、「libjaybird22_x64.so」を保存したディレクトリのパスを指定します。
私は「/home/baranche/workspace/fbsample/lib/libjaybird22_x64.so」に保存したので、
こういう指定を行いました。


-Djava.library.path=/home/baranche/workspace/fbsample/lib



351_03.png


「環境」タブに変数を追加します。
名前が「LD_LIBRARY_PATH」
値は「libfbclient.soやlibfbembed.soをコピーしたパス」

私は「/home/baranche/workspace/fbsample/embed」にファイルをコピーしたので、
こんな指定になりました。

351_04.png


これでサンプルが実行できるはずです。
fdbファイルは、
FreeBSD 10.0 + Firebird 2.5.2 データベースファイルを作成する
こちらで作成したものをコピーして使いました。

サーバーで作成したファイルにもテーブルの作成が行えます。
ただし、ID、パスワード付きでログインして作成したテーブルは
読み取り、書き込み共にアクセス権がないというエラーになりました。


Exception in thread "main" org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544352. no permission for read/select access to TABLE POST_NORMAL
    at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:869)
    at sample.FBEmbedded.main(FBEmbedded.java:21)
Caused by: org.firebirdsql.gds.GDSException: no permission for read/select access to TABLE POST_NORMAL
    at org.firebirdsql.gds.impl.jni.JniGDSImpl.native_isc_dsql_prepare(Native Method)
    at org.firebirdsql.gds.impl.jni.BaseGDSImpl.iscDsqlPrepare(BaseGDSImpl.java:576)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.firebirdsql.gds.impl.jni.GDSSynchronizationPolicy$AbstractSynchronizationPolicy.invoke(GDSSynchronizationPolicy.java:119)
    at com.sun.proxy.$Proxy0.iscDsqlPrepare(Unknown Source)
    at org.firebirdsql.gds.impl.GDSHelper.prepareStatement(GDSHelper.java:190)
    at org.firebirdsql.jdbc.AbstractStatement.prepareFixedStatement(AbstractStatement.java:1441)
    at org.firebirdsql.jdbc.AbstractStatement.internalExecute(AbstractStatement.java:1423)
    at org.firebirdsql.jdbc.AbstractStatement.execute(AbstractStatement.java:867)
    ... 1 more






【参考URL】

Failed to load Firebird client library: Embedded database with Jaybird

Using Firebird with IBX under Linux
関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2014/03/04(火) 22:53:50|
  2. Firebird
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<WindowsでFirebird embeddedにJava1.7 + Jaybirdから接続する | ホーム | Firebird 2.5.2にJava1.7 + JaybirdでMap形式のデータ登録方法の考察>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1312-a5ca5555
この記事にトラックバックする(FC2ブログユーザー)