Symfoware

Symfowareについての考察blog

RedisのJDBCドライバもどきを作ってみる

ライブラリ非依存でRedisにGET、SETしてみました。
ライブラリに依存しないJavaプログラムでRedisにデータを登録、取得する(SET、GET)

これをJDBCドライバ風に扱えるようにしてみます。



JDBCドライバの作り方



以前JDBCドライバの作り方を調べたことがあります。

JDBC over Thriftを作成する その1(JDBCドライバの作り方)
JDBC over Thriftを作成する その2(JDBCドライバのロード)
JDBC over Thriftを作成する その3(Connectionクラスの実装)
JDBC over Thriftを作成する その4(Statementクラスの実装)
JDBC over Thriftを作成する その5(ResultSetクラスの実装)
JDBC over Thriftを作成する その6(サーバーモジュールの作成)
JDBC over Thriftを作成する その7(動作確認用のサンプル)

この時の内容を参考にしました。




仕様



以下の4つが満たせるドライバを実装してみます。

・SETでバイト配列が登録できること。
・SET時、EX(TTLの指定)が行えること。
・GETでバイト配列が取得できること。
・SELECT(データベースの切り替え)が行えること。




イメージしている使い方はこんな感じ。


  1. String url = "jdbc:symredis://192.168.1.111:6379/";
  2. Class.forName("com.fc2.blog68.symfoware.redis.jdbc.SymRedisDriver");
  3. Connection con = DriverManager.getConnection(url);
  4. PreparedStatement pstmt = con.prepareStatement(null);
  5. // 登録
  6. pstmt.setString(0, "key");
  7. pstmt.setBytes(0, "value".getBytes());
  8. //pstmt.setInt(0, 10); // TTLを指定したい場合
  9. pstmt.execute();
  10. // 検索
  11. pstmt.setString(0, "key");
  12. ResultSet rs = pstmt.executeQuery();
  13. String result = new String(rs.getBytes(0));




PreparedStatementの
setStringでキーを指定
setBytesでデータを指定。
setIntでTTLを指定。

executeで登録を実行。


検索は、executeQueryで行う感じです。





作ってみた



エラーチェックとかザルですが動くようになりました。

https://bitbucket.org/symfo/tomcat7-redis-session-manager





コネクションプール



JDBCの形式にしたかったのは、Tomcatのコネクションプールが使いたかったからです。
Tomcat JDBC Connection Poolで通常のJavaプログラムからPostgreSQL 9.3に接続する


自作したJDBCドライバもどきでもプールできるか試してみます。
簡単なJUnitのテストコードを書いて動かしてみると、
一応動いてくれているようです。


  1. import static org.hamcrest.core.Is.is;
  2. import static org.hamcrest.core.IsInstanceOf.instanceOf;
  3. import static org.junit.Assert.assertThat;
  4. import java.sql.Connection;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import org.apache.tomcat.jdbc.pool.DataSource;
  8. import org.apache.tomcat.jdbc.pool.PoolProperties;
  9. import org.junit.Test;
  10. public class PoolTest {
  11.     
  12.     @Test
  13.     public void testPool() throws Exception {
  14.         PoolProperties p = new PoolProperties();
  15.         
  16.         // 接続情報の設定
  17.         p.setUrl("jdbc:symredis://192.168.1.111:6379/");
  18.         p.setDriverClassName("com.fc2.blog68.symfoware.redis.jdbc.SymRedisDriver");
  19.         
  20.         // その他オプション
  21.         p.setJmxEnabled(true);
  22.         p.setTestWhileIdle(false);
  23.         p.setTestOnBorrow(true);
  24.         p.setTestOnReturn(false);
  25.         p.setValidationInterval(30000);
  26.         p.setTimeBetweenEvictionRunsMillis(30000);
  27.         p.setMaxActive(100);
  28.         p.setInitialSize(10);
  29.         p.setMaxWait(10000);
  30.         p.setRemoveAbandonedTimeout(60);
  31.         p.setMinEvictableIdleTimeMillis(30000);
  32.         p.setMinIdle(10);
  33.         p.setLogAbandoned(true);
  34.         p.setRemoveAbandoned(true);
  35.         p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
  36.                 + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
  37.         
  38.         
  39.         DataSource datasource = new DataSource();
  40.         datasource.setPoolProperties(p);
  41.         Connection con = null;
  42.         try {
  43.             con = datasource.getConnection();
  44.             
  45.             PreparedStatement pstmt = con.prepareStatement(null);
  46.             
  47.             assertThat(pstmt, instanceOf(SymRedisPreparedStatement.class));
  48.             
  49.             pstmt.setString(0, "key");
  50.             pstmt.setBytes(0, "value".getBytes());
  51.             
  52.             pstmt.execute();
  53.             
  54.             ResultSet rs = pstmt.executeQuery();
  55.             assertThat(rs, instanceOf(SymRedisResultSet.class));
  56.             
  57.             String result = SymRedisUtil.toString(rs.getBytes(0));
  58.             assertThat(result, is("value"));
  59.             
  60.         } finally {
  61.             if (con != null) {
  62.                 try {
  63.                     con.close();
  64.                 } catch (Exception ignore) {
  65.                 }
  66.             }
  67.         }
  68.     }
  69. }


関連記事

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

  1. 2014/03/22(土) 17:15:18|
  2. Redis
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Redisに改行コードを含むバイナリデータを保存するプロトコル | ホーム | ライブラリに依存しないJavaプログラムでRedisにデータを登録、取得する(SET、GET)>>

コメント

コメントの投稿


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

トラックバック

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