JavaでMS-Accessを使う

ファイルシステム上に配置するだけで複数ユーザーから
共有して使用できるデータベースが必要になったので、とりあえずMS-Accessを使ってみる。

接続方法

以下のようなドライバと接続文字列で接続が可能

データベース DriverType クラス名 接続文字列
MS-Access 1 sun.jdbc.odbc.JdbcOdbcDriver jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=[MDBファイルパス];
MS-Access 4 com.hxtt.sql.access.AccessDriver jdbc:access:/[MDBファイルパス]

排他など

DBMSがいるわけじゃないので、排他とかに制約があるだろうと思ったので調べてみました。
2つのプロセスから同時にDB操作
①プロセス1 検索
②プロセス2 検索
③プロセス1 更新
④プロセス2 更新
⑤プロセス1 コミット
⑥プロセス2 コミット

とりあえず以下のような制約があります。OKは正常に終了。NGは、後続の処理実行時に例外が発生しました。

  • 2プロセスからの同時接続 → OK
  • 同時に同じテーブルの同じレコードをセレクト → OK
  • 同時に同じテーブルにレコード追加 → NG
  • 同時に別テーブルにレコード追加 → OK
  • 同時に同じテーブルの同じレコードを更新 → NG
  • 同時に同じテーブルの異なるレコードを更新 → NG
  • 同時に異なるテーブルのレコードを更新 → OK
  • 同時に同じテーブルの同じレコードを削除 → NG
  • 同時に同じテーブルの異なるレコードを削除 → NG
  • 同時に異なるテーブルのレコードを削除 → OK

どうやら、TYPE1のドライバを使った場合はテーブル単位でロック(表ロック)されるみたいですねー。
トランザクションが多いと厳しい気もしますが、今回は、まあ良しとするか。

逆にTYPE4のドライバは使い方が悪いのかトランザクション管理がうまくいかない感じ。
setAutoCommit(false)が効かず、updateを発行した瞬間にcommitされてしまいました。
これは駄目っぽい。使いかたおかしいのかなぁ。

ドライバのバージョン

確認したODBCドライバは以下の通り。バージョンによっていろいろ違うのかな。そもそもこれは
どのタイミングでインストールされるんだろう

Microsoft Access Driver(*mdb) 4.00.6304.00
Microsoft Access Driver(*mdb) 4.00.6305.00

エラーコード

エラーコードがいろいろと返却されているんだけど、どれをどのようにハンドリングするか考える必要あり。

その他

DerbyとかH2とかSQLiteとか、ファイルシステムに置くだけで使えるデータベースをしらべてみよう。