Symfoware

Symfowareについての考察blog

Firebird 2.5.2にJava1.7 + JaybirdでMessagePackの登録と取得を行う

JavaからFirebirdに接続してみました。
Firebird 2.5.2にJava1.7からJaybirdで接続する

今回はMessagePackなバイナリを登録してみます。


テーブルの作成



BLOBのSUB_TYPEに「BINARY」を指定したフィールドを作成。
ここにMessagePackなバイナリを登録してみることにしました。


CREATE TABLE post_mp(
address BLOB SUB_TYPE BINARY
)






登録



こちらで実行した内容を参考にします。
MessagePackでシリアライズした内容をPostgreSQLのbytea列にJavaで登録する

同様に郵便番号情報約12万件を登録してみます。
サンプルはこんな感じになりました。


  1. package com.fc2.blog68.symfoware.fb.mp;
  2. import java.io.BufferedReader;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.sql.Connection;
  9. import java.sql.DriverManager;
  10. import java.sql.PreparedStatement;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import org.msgpack.MessagePack;
  14. import org.msgpack.packer.Packer;
  15. public class PostUpdateMsgPack {
  16.     public static void main(String[] args) {
  17.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  18.         String user = "sysdba";
  19.         String password = "masterkey";
  20.         String sql = "INSERT INTO post_mp(address) VALUES (?)";
  21.         try (Connection con = DriverManager.getConnection(url, user, password)) {
  22.             con.setAutoCommit(false);
  23.             try (PreparedStatement stmt = con.prepareStatement(sql)) {
  24.                 load(con, stmt);
  25.             } catch (Exception e) {
  26.                 e.printStackTrace();
  27.             }
  28.             con.commit();
  29.         } catch (Exception e) {
  30.             e.printStackTrace();
  31.         }
  32.     }
  33.     private static void load(Connection con, PreparedStatement stmt)
  34.             throws Exception {
  35.         try (InputStream in = new FileInputStream("data.csv");
  36.                 InputStreamReader isr = new InputStreamReader(in, "utf8");
  37.                 BufferedReader reader = new BufferedReader(isr)) {
  38.             MessagePack msgpack = new MessagePack();
  39.             String line;
  40.             while ((line = reader.readLine()) != null) {
  41.                 String[] ary = line.split(",");
  42.                 Map<String, String> map = new HashMap<String, String>();
  43.                 map.put("全国地方公共団体コード", ary[0]);
  44.                 map.put("郵便番号", ary[1]);
  45.                 map.put("都道府県名カナ", ary[2]);
  46.                 map.put("市区町村名カナ", ary[3]);
  47.                 map.put("町域名カナ", ary[4]);
  48.                 map.put("都道府県名", ary[5]);
  49.                 map.put("市区町村名", ary[6]);
  50.                 map.put("町域名", ary[7]);
  51.                 // シリアライズ実行
  52.                 ByteArrayOutputStream out = new ByteArrayOutputStream();
  53.                 Packer packer = msgpack.createPacker(out);
  54.                 packer.write(map);
  55.                 byte[] bytes = out.toByteArray();
  56.                 stmt.setBytes(1, bytes);
  57.                 stmt.execute();
  58.                 stmt.clearParameters();
  59.             }
  60.         } catch (IOException e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64. }




特にエラーもなく登録完了です。




検索



検索も行なってみます。


  1. package com.fc2.blog68.symfoware.fb.mp;
  2. import static org.msgpack.template.Templates.TString;
  3. import static org.msgpack.template.Templates.tMap;
  4. import java.io.ByteArrayInputStream;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.ResultSet;
  8. import java.sql.Statement;
  9. import java.util.Map;
  10. import org.msgpack.MessagePack;
  11. import org.msgpack.template.Template;
  12. import org.msgpack.unpacker.Unpacker;
  13. public class PostSearchMsgPack {
  14.     public static void main(String[] args) throws Exception {
  15.         
  16.         String url = "jdbc:firebirdsql:192.168.1.101/3050:/usr/local/firebird/post.fdb?encoding=UTF8";
  17.         String user = "sysdba";
  18.         String password = "masterkey";
  19.         try (Connection con = DriverManager.getConnection(url,user, password);
  20.                 Statement stmt = con.createStatement()) {
  21.             String query = "SELECT * FROM post_mp";
  22.             // nameタグの値を取得
  23.             ResultSet rs = stmt.executeQuery(query);
  24.             
  25.             MessagePack msgpack = new MessagePack();
  26.             // 復元用の定義体
  27.             Template<Map<String, String>> mapTmpl = tMap(TString, TString);
  28.             while (rs.next()) {
  29.                 
  30.                 byte[] bytes = rs.getBytes("address");
  31.                 
  32.                 // デシリアライズ
  33.                 ByteArrayInputStream in = new ByteArrayInputStream(bytes);
  34.                 Unpacker unpacker = msgpack.createUnpacker(in);
  35.                 
  36.                 Map<String, String> map =unpacker.read(mapTmpl);
  37.                 
  38.                 if (map.get("町域名").indexOf("銀座") == -1) {
  39.                     continue;
  40.                 }
  41.                 StringBuilder sb = new StringBuilder();
  42.                 sb.append(map.get("都道府県名"));
  43.                 sb.append(map.get("市区町村名"));
  44.                 sb.append(map.get("町域名"));
  45.                 System.out.println(sb.toString());
  46.             }
  47.         } catch (Exception e) {
  48.             e.printStackTrace();
  49.         }
  50.         
  51.     }
  52. }



想定通りの結果が得られました。



速度



登録と検索の速度を測定してみます。

まず、登録速度。単位はmsです。

1回目2回目3回目4回目5回目平均
51,47358,54659,41058,99757,93057,271



次は検索。

1回目2回目3回目4回目5回目平均
45,48745,13145,29845,55745,24445,343


全件フェッチに、登録と同じくらい時間がかかるようです。



サンプルプログラムはここに置いておきます。
https://bitbucket.org/symfo/firebird-map-sample/src/
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/02(日) 21:38:08|
  2. Firebird
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Firebird 2.5.2にJava1.7 + JaybirdでMap形式のデータ登録方法の考察 | ホーム | Firebird 2.5.2にJava1.7 + JaybirdでJSONの登録と取得を行う(JSONIC使用)>>

コメント

コメントの投稿


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

トラックバック

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