Symfoware

Symfowareについての考察blog

GridDB 画像データのバイナリ(BLOB型)を保存する

GridDBをインストールし、Javaから接続してみました。
GridDBをCentOS 7.2にインストール
GridDBにJavaクライアントから接続し、クエリーを実行する

データの保存形式にはバイト配列も指定できるようなので、
例として画像データを保存してみます。



BLOB型




最初、byteの配列を使えば良いのだろうと思い、こんな定義にしていましたが、


  1.     // 保存するオブジェクトの定義
  2.     static class ImageFile {
  3.         @RowKey String name;
  4.         byte[] image;
  5.     }




エラーになりました。


Exception in thread "main" com.toshiba.mwcloud.gs.common.GSStatementException: [60079:DS_TIM_ROW_DATA_INVALID] Array length of Column[1] exceeds maximum size : 33405 (address=/192.168.1.102:10001, partitionId=95)
    at com.toshiba.mwcloud.gs.subnet.NodeConnection.executeStatementDirect(NodeConnection.java:460)
    at com.toshiba.mwcloud.gs.subnet.NodeConnection.executeStatement(NodeConnection.java:278)
    at com.toshiba.mwcloud.gs.subnet.GridStoreChannel.executeStatement(GridStoreChannel.java:1401)
    at com.toshiba.mwcloud.gs.subnet.SubnetContainer.executeStatement(SubnetContainer.java:289)
    at com.toshiba.mwcloud.gs.subnet.SubnetContainer.put(SubnetContainer.java:1184)
    at com.toshiba.mwcloud.gs.subnet.SubnetContainer.put(SubnetContainer.java:1168)
    at sample.Sample4.main(Sample4.java:56)




こういう場合は、BLOB型を使うようです。
画像を登録するサンプルは以下のようになりました。


  1. package sample;
  2. import java.io.File;
  3. import java.nio.file.Files;
  4. import java.nio.file.Path;
  5. import java.sql.Blob;
  6. import java.util.Properties;
  7. import com.toshiba.mwcloud.gs.Collection;
  8. import com.toshiba.mwcloud.gs.GridStore;
  9. import com.toshiba.mwcloud.gs.GridStoreFactory;
  10. import com.toshiba.mwcloud.gs.RowKey;
  11. public class Sample4 {
  12.     
  13.     // 保存するオブジェクトの定義
  14.     static class ImageFile {
  15.         @RowKey String name;
  16.         Blob image;
  17.     }
  18.     
  19.     private static byte[] load(String filePath) throws Exception {
  20.         
  21.         Path src = new File(filePath).toPath();
  22.         return Files.readAllBytes(src);
  23.         
  24.     }
  25.     
  26.     public static void main(String[] args) throws Exception {
  27.         
  28.         // GridDBへの接続指定
  29.         Properties props = new Properties();
  30.         props.setProperty("notificationAddress", "239.0.0.1");
  31.         props.setProperty("notificationPort", "31999");
  32.         props.setProperty("clusterName", "my_cluster");
  33.         props.setProperty("user", "admin");
  34.         props.setProperty("password", "P@ssw0rd");
  35.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  36.         
  37.         // コレクションを作成
  38.         Collection<String, ImageFile> col = store.putCollection("image", ImageFile.class);
  39.         // code列にインデックスを作成
  40.         col.createIndex("name");
  41.         // 自動保存を無効に
  42.         col.setAutoCommit(false);
  43.         // 保存するオブジェクトを作成
  44.         ImageFile im = new ImageFile();
  45.         im.image = col.createBlob();
  46.         
  47.         im.name = "001.jpeg";
  48.         im.image.setBytes(1, load("001.jpeg"));
  49.         
  50.         // データの保存
  51.         col.put(im);
  52.         // 変更を確定
  53.         col.commit();
  54.         // 接続終了
  55.         store.close();
  56.         
  57.     }
  58. }





登録したデータを取得。
ファイルに復元してみます。


  1. package sample;
  2. import java.io.File;
  3. import java.nio.file.Files;
  4. import java.nio.file.Path;
  5. import java.nio.file.StandardCopyOption;
  6. import java.sql.Blob;
  7. import java.util.Properties;
  8. import com.toshiba.mwcloud.gs.Collection;
  9. import com.toshiba.mwcloud.gs.GridStore;
  10. import com.toshiba.mwcloud.gs.GridStoreFactory;
  11. import com.toshiba.mwcloud.gs.RowKey;
  12. public class Sample5 {
  13.     
  14.     // 保存するオブジェクトの定義
  15.     static class ImageFile {
  16.         @RowKey String name;
  17.         Blob image;
  18.     }
  19.     
  20.     public static void main(String[] args) throws Exception {
  21.         
  22.         // GridDBへの接続指定
  23.         Properties props = new Properties();
  24.         props.setProperty("notificationAddress", "239.0.0.1");
  25.         props.setProperty("notificationPort", "31999");
  26.         props.setProperty("clusterName", "my_cluster");
  27.         props.setProperty("user", "admin");
  28.         props.setProperty("password", "P@ssw0rd");
  29.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  30.         
  31.         // コレクションを作成
  32.         Collection<String, ImageFile> col = store.getCollection("image", ImageFile.class);
  33.         // データを取得
  34.         ImageFile im = col.get("001.jpeg");
  35.         
  36.         Path dest = new File(im.name).toPath();
  37.         Files.copy(im.image.getBinaryStream(), dest, StandardCopyOption.REPLACE_EXISTING);
  38.         
  39.         // 接続終了
  40.         store.close();
  41.         
  42.     }
  43.     
  44. }




無事、画像ファイルの登録と復元が確認できました。



【参考URL】

ファイル・ディレクトリ操作2




関連記事

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

  1. 2016/03/06(日) 17:47:25|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Beanstalkd Buriedになったジョブを削除する | ホーム | GridDB TimeSeriesなコレクションからデータを取得する>>

コメント

コメントの投稿


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

トラックバック

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