mimdbとは

mimdbは、javaで作られた読み込み専用のデータベースシステムです。
簡単なSQL文(Selectのみ)対応しています。
また、テーブル結合や、group byや、having、集計処理（select count(*) from xxxx程
度は利用可能でそれ以外)は利用できません。

mimdbは、CSVファイルや他のJDBC接続で取得した値をテーブルとして利用できます。
そして、これらの情報はインメモリで動作します。
また、mimdbは、組み込み専用で動作します。

これによって、一般的なRDBMSと比べて、大体10倍程度の比較的速い速度で、情報検索が
可能となります。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
mimdbの利用方法

sampleフォルダ内を元に説明します。
mimdbSampleフォルダーには、以下のファイルが存在します。

[mimdbSample]
    >mimdb.conf
       mimdb基本定義ファイル

    >sample.conf
       サンプルデータベース定義ファイル

    >postal_master.conf
       postal_master(郵便番号マスター)テーブル定義ファイル

詳しくは、それぞれのファイルを参照してください。
簡単に説明しますと、mimdb.confファイルが、mimdbの中心的な定義ファイルとなります。
これに各データベースの登録を行ったり、外部メンテナンスが必要な場合のコネクション
定義を行ったりします。

sample.confは、データベースの定義です。
データベースの定義は、データベースで管理するテーブル定義を行います。
データベース定義ファイルは、プログラム中において、以下のように定義されることで、
データベース定義内のテーブル群が有効となります。

[mimdb組み込み実行]
Embedded.create( "mimdb定義ファイルが存在するfolder名" ) ;

mimdbを組み込みで利用する場合は、必ず１度上記処理を呼び出す必要があります.

[Mimdb接続]
MimdbConnection conn = MimdbConnection.create() ;
MimdbStatement stmt = conn.getStatement() ;
MimdbPreparedStatement ps = conn.getPreparedStatement( sql ) ;

MimdbResult res = stmt.executeQuery( sql ) ;

MimdbResult res = ps.executeQuery() ;

version1.02以前と違い、MimdbConnectionを定義して、ステートメント、
プリコンパイル済みステートメントを生成して、クエリー実行を行うようになりました。


[JDBC接続]
Connection conn = DriverManager.getConnection( "jdbc:mimdb:embedded" ) ;

上記のように定義することで、データベースが有効となります。

＊サーバーモード.

mimdb1.02から、サーバー接続モードがサポートされます。
使い方は、mimdb.cmd(linuxの場合は,mimdb)を引数付きで起動させます.

>mimdb.cmd mimdb定義ファイルが存在するfolder名

これで、mimdbサーバーが起動します.
また、サーバーをシャットダウンさせたい場合は、

>mimdbdw.cmd

これで、起動中のサーバーがシャットダウンします.

[mimdb接続]
サーバーに接続する場合は、[Embedded.create]は必要ありません。
代わりに、MimdbConnectionの生成時において、

MimdbConnection conn = MimdbConnection.create( "127.0.0.1" ) ;
のように、接続先のIPアドレスを設定する必要があります.
この辺の内容は、JavaDocを参照してください.

[jdbc接続]
JDBC接続では、ドライバーマネージャで、

Connection conn = DriverManager.getConnection( "jdbc:mimdb:127.0.0.1" ) ;

のように、接続先のIPアドレスを設定することで、接続できます。
また、ポート指定を行う場合は、

Connection conn = DriverManager.getConnection( "jdbc:mimdb:127.0.0.1:3456" ) ;

のように、することで、ポート指定が可能となります.
また、コネクションタイムアウト値を設定する場合は、

Properties pro = new java.util.Properties() ;
pro.put( "timeout","5000" ) ;
Connection conn = DriverManager.getConnection( "jdbc:mimdb:127.0.0.1",pro ) ;

とすることで、コネクションタイムアウト値が設定できます.



・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
mimdbの注意点

1.SQL文のwhere実行を行うカラム名は、インデックスが有効になっている必要があります。
もしもインデックスが指定されていない場合は、エラーとなります。


2.mimdbのSQL文はかなり限定的です。
select xxx from yyyy where yyyyy order by xxx desc , yyy ase limit xxx offset yyyy ;

この程度しか出来ません。
また、集計処理なども行えませんし、テーブル結合も行えません。
ただし、
select count(*) from xxxx ;
で件数取得だけは行えます。

3.mimdbは実行時にCSVファイルか、JDBC経由で他DBから情報を取得して、テーブルを作成します。
あまり情報量が多い条件を読み込むと、起動時間がかかってしまいます。
サンプルにある郵便番号の情報が10万件ちょっとですが、これを取り込むのに、４秒ぐらい
かかってしまいます。

4.あまり巨大な情報を読み込むのは、お勧めしません。メモリ上にデータとインデックスを
  作成するので、メモリを圧迫してしまいます。それにCSVファイルの読み込み、インデックス
  の作成に時間がかかってしまうからです

5.大部テスト実行はしましたが、潜在的なバグはあると思います。

6.全件数が65535件を越えた時や複数のorder byの場合は、バケットソートを使わず、Java標準の
  Arrasy.sortを利用するので、速度が遅くなってしまいます。

7.インデックス以外でorder byを利用した場合、インデックスが利かないので、特に文字ソートが
  激遅になってしまいます。

8.JDBCからmimdbにアクセスできるのですが、限定的な機能しか対応していません。たとえば
  java.sql. DatabaseMetaDataとか、未実装です。

9.select xx from xxx where a in (？)で、inのパラメータが配列で定義できる。
  一々複数の？でin定義をせずとも、１つで複数の条件が定義できますが、純粋なSQL文と違い、
  互換性がありません。

10.select xx from xxx where a between (？)
  これも項９と同じく純粋なSQL文と違い互換性がありません。
  
  また、欠点の説明ではありませんが、使い方も違って、範囲指定を複数定義したい場合は、
  ※たとえば、1000〜2000番目と、4000〜4500番まで取得したい場合
  select xx from xxx where a between (1000,2000,4000,4500)
  このように定義することが出来ます。
  また、1000〜1500番目、3000番目から最後まで取得したい場合は、
  select xx from xxx where a between (1000,1500,3000,null)
  もしくは、
  select xx from xxx where a between (1000,1500,3000)
  とすることで、対応できます.

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
メンテナンス機能

テーブルを追加したり、削除したり、カラム名を変更したり、その度にシステムを再起動
させるのは不経済です。

mimdbでは、簡単なメンテナンス機能が備わっています。

1.mimdb.confでメンテナンス接続を有効にする。
mimdb.confのファイル内にある説明にしたがって定義しなおしてください。

2.クライアント接続を行う
org.maachang.mimdb.MimdbMaintenanceClient#mainを実行してください。

3.コマンド説明
項２のクライアントプログラムを使います。
普通にSQL文を打ち込めば結果が返却されます。
それ以外のコマンドが知りたい場合は、-helpを実行します。

データベース全体を更新した意場は、
reload ${databaseName}
を実行すると、更新されます。

１つのテーブルを更新したい場合は、
update ${databaseName} ${tableName}
を実行すると、更新されます。

更新されたか否かを確認したい場合は、
id ${databaseName} ${tableName}
を実行すると、テーブルの更新IDが返却されます。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
最後に

mimdbのライセンスは、Apache2.0です。
詳しくはLICENSEか、LICENSE-JPを参照してください。
