Return to Firebird Square

Using Firebird with Jaybird

JaybirdからFirebirdへ接続する

Jaybirdとは

Jaybird は、Firebirdプロジェクトが開発しているタイプ4 jdbcドライバです。javaのデータベース接続用APIであるJDBCのうち、pure javaで書かれたモノがタイプ4となります。
これまでInterBase/Firebirdへの接続には、ボーランドが提供してきたInterClientが広く利用されてきましたが、こちらは中継サーバを利用するタイプ3となっています。

JaybirdとInterClientで最大の違いは何であるかを考えると、Jaybirdはインストールが不要であるという点だと思います。Jaybirdはfirebirdsql-full.jarに必要なクラスが一式含まれているので、これさえあればFirebirdのクライアント・ライブラリも中継サーバも不要です。
一方、リリースノート等によると、InterClientと比較して速くなっている部分もありますが、Insert系などで50%程遅くなっている部分もあります。得手不得手を理解して、使い分ける必要があるかもしれません。

本稿では、JayBirdに付属するサンプルコードの解説を通して、JayBirdの利用方法を示していきます。

(2004/5/23)

実行環境について

Jaybird の最新安定版は、1.0.1 となっています。ダウンロードは、SourceForgeのFirebirdプロジェクト・エリアまたは IBPhoenix社のサイトから行います。

ダウンロードしたFirebirdSQL-1.0.1.zipを解凍すると以下のファイルが出てきます。

faq.html FAQ.txt firebirdjmx.jar firebirdsql-full.jar firebirdsql-test.jar firebirdsql.jar firebirdsql.rar JDBC20_conformance.html release_notes.html <examples> DataSourceExample.java DriverExample.java <lib> jaas.jar log4j-core.jar mini-concurrent.j mini-j2ee.jar

サンプルコードを利用するためには、とりあえずfirebirdsql-full.jarがあれば事足ります。classpathを指定するのが面倒ですから、とりあえずサンプルコードと同じディレクトリに放り込んでおきます。
まずは、DriverExample.javaをコンパイルして実行してみます。

javaの実行環境は、java2SDK 1.4.2_04 on Windows2000を利用しています。

Firebirdは、Windows2000上にインストールされた、Firebird 1.0.3に接続しました。

ソースコード修正点

Jaybird に付属するサンプルコード DriverExample.javaを少しだけ変更してみました。

変更点:
引数によって、ドライバのロード方法を変更出来るようにした。

DriverExample.java
(28-29) 変更前 String user = "sysdba"; String password = "masterkey";
変更後: String user = "sysdba"; try { user = args[1]; } catch (ArrayIndexOutOfBoundsException e) { // At least an argument is needed. User is an option. System.out.println("User is not appointed. 'sysdba' is used."); System.out.println(e.getMessage()); } String password = "masterkey"; try { password = args[2]; } catch (ArrayIndexOutOfBoundsException e) { // At least an argument is needed. Password is an option. System.out.println("Password is not appointed. 'masterkey' is used."); System.out.println(e.getMessage()); }
(59) 変更前: int registrationAlternative = 1;
変更後: int registrationAlternative = 1; try { registrationAlternative = Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { // At least an argument is needed System.out.println("At least an argument is needed"); System.out.println(e.getMessage()); return; } catch (java.lang.NumberFormatException e) { // The argument does not have the appropriate format System.out.println("The argument must be a number format"); System.out.println(e.getMessage()); return; }

実行結果

それでは、まずコンパイルしてみます。-classpath には Jaybirdの.jarファイルを指定します。

>javac -classpath firebirdsql-full.jar DriverExample.java 注: DriverExample.java は推奨されない API を使用またはオーバーライドしています。 注: 詳細については、-deprecation オプションを指定して再コンパイルしてください。

-deprecation オプションを付けてみましょう。

>javac -deprecation -classpath firebirdsql-full.jar DriverExample.java DriverExample.java:41: 警告: java.lang.System の runFinalizersOnExit(boolean) は 推奨されません。 System.runFinalizersOnExit (true); ^ 警告 1 個

警告が出ています。runFinalizersOnExit()は推奨されていないということですが、サンプルコード中の解説は以下のようになっています。

(381) try { if (c!=null) c.close (); } catch (java.sql.SQLException e) { showSQLException (e); } // If you don't close your database objects explicitly as above, // they may be closed by the object's finalizer, but there's // no guarantee if or when the finalizer will be called. // In general, object finalizers are not called on program exit. // It's recommended to close your JDBC objects explictly, // but you can use System.runFinalizersOnExit(true), as at the beginning // of this method main(), to force finalizers to be called before // program exit.
訳:
もし、上記のように明示的にデータベース・オブジェクトをクローズしない場合、データベースオブジェクトはオブジェクトのファイナライザによってクローズされますが、ファイナライザがいつ実行されるのか、また、実行されるのかどうかさえも保証されていません。
一般に、オブジェクトのファイナライザは、プログラム終了時に実行されません。
JDBCオブジェクトについては、明示的にクローズすることが推奨されていますが、System.runFinalizersOnExit(true) を使う事もできます。ここでは、main()メソッドの先頭で記述しました。このようにすると、ファイナライザはプログラム終了時に強制的に実行されるようになります。

サンプルコード中では、Connection c を、最終的にクローズしているので、System.runFinalizersOnExit(true) は不要ですが、こういうやり方もあるということで記述されたのでしょう。

>java -classpath .;firebirdsql-full.jar DriverExample 1 ユーザー名 パスワード Firebird JCA-JDBC driver version 0.1 registered with driver manager. Connection established. Auto-commit is disabled. Transactions are supported. PHONE_LIST is a view. Unable to increase everyone's salary. GDS Exception. Operation violates CHECK constraint INTEG_30 on view or table EMPLOYEE Error Code: 335544558 SQL State: null The query executed has 1 result columns. Here are the columns: FULL_NAME of type VARCHAR Here are the employee's whose salary < $50,000 Bennet, Ann Reeves, Roger Stansbury, Willie Nordstrom, Carol O'Brien, Sue Anne Brown, Kelly Page, Mary Parker, Bill Yanowski, Michael Green, T.J. Montgomery, John Guckenheimer, Mark Closing database resources and rolling back any changes we made to the database.

引数に1~4までの数値を指定して、実行してみると、全て同じ結果を返すことがわかります。

jdbcドライバのロード

DriverExample.javaでは、4通りのjdbcドライバのロード方法を示しています。

jdbcドライバの取得、バージョン情報

次に、DriverManager から、ドライバを取得しています。また、ここでドライバのバージョンを表示しています。
※納得いかないのが、バージョン 0.1になっていることです。

コネクションの取得

コネクションの取得についても、2通りの方法を示しています。

コネクションを通じた操作

ここから、jdbcドライバを通じてFirebirdを操作していきます。

後始末・・・

データーベースへの操作が終了したら、後始末を行います。