Symfoware

Symfowareについての考察blog

JDBC over Thriftを作成する その1(JDBCドライバの作り方)

Linux版のSymfoware V10を無理やりCentOSにインストールして動かしてみました。

Linux版のSymfoware V10をCentOSで動作させる(インストール編)
Linux版のSymfoware V10をCentOSで動作させる(起動編)
CentOSにインストールしたSymfoware V10にデータベースを作成する


ただ、評価版なのでWindows用のドライバが付属していない・・・
なんとかWindowsから接続してみようとThriftを経由して触ってみました。

Linux版のSymfoware V10 Thrift経由でWindows + Javaからデータ取得
Linux版のSymfoware V10 Thrift経由でWindows + Javaからデータ取得 その2


Thriftを経由すれば、Windows + JavaからCentOSで動いているSymfowareに
アクセスできそうです。

せっかくなので、Thriftをあまり意識せずJDBCドライバっぽく
使えるようにしてみたいと思います。




JDBCドライバの作り方



さて、JDBCドライバって使ったことはもちろんあるのですが、
一から作るとなると、どうすればいいものやら・・・

と思って調べてみると
HiveJDBC を S2JDBC 経由で使えるようにする

なるほど、HiveJDBCというものがあるようです。

ソースは、以下のURLから閲覧できました。
http://svn.apache.org/viewvc/hadoop/hive/trunk/jdbc/src/java/org/apache/hadoop/hive/jdbc/



org.apache.hadoop.hive.jdbc.HiveDriver
org.apache.hadoop.hive.jdbc.HiveConnection



これら二つのソースを参考に、JDBCドライバの登録とコネクションの作成の
雛形を考えて見ます。




ドライバークラスの概要



org.apache.hadoop.hive.jdbc.HiveDriverのソースと、
Class.forName で DB アクセスできるようになる理由
こちらを参考にさせていただきました。


これから作成するJDBCドライバの名前は、
com.fc2.blog68.symfoware.jdbc.ThriftDriver
としておきます。

java.sql.Driverをimplementsすると、最低限以下のメソッドを実装する必要があるようです。


public boolean acceptsURL(String arg0) throws SQLException
public Connection connect(String arg0, Properties arg1) throws SQLException
public int getMajorVersion()
public int getMinorVersion()
public DriverPropertyInfo[] getPropertyInfo(String arg0, Properties arg1)
public boolean jdbcCompliant()



また、これらのメソッドに加えてjava.sql.DriverManager.registerDriverで
自分自身を登録してやる必要があります。





コネクションクラスの概要



org.apache.hadoop.hive.jdbc.HiveConnectionのソースを見てみると、
java.sql.Connectionをimplementsしたクラスを作成すればよいようです。

com.fc2.blog68.symfoware.jdbc.ThriftConnection
という名前のコネクションクラスを作成することにしました。

※実装するメソッドは、数が多いので省略。





DriverManagerがコネクションを獲得する仕組み



これがしばらくわからず、はまりました。

java.sql.Driverをimplementsして実装するメソッドはいくつかあるのですが、
この中でコネクション獲得において重要なメソッドは「connect」のようです。

大まかな流れは、

1.Class.forName("com.fc2.blog68.symfoware.jdbc.ThriftDriver")により、
ThriftDriverのstaticメソッドが実行される。

ここに記載している、
java.sql.DriverManager.registerDriver(new ThriftDriver());
により、JDBCドライバの候補としてこのクラスが登録される。


2.DriverManager.getConnection(String url)を実行して、
コネクションを獲得しようとすると、登録されているJDBCドライバクラスの
connect(String url, Properties info)を順番に呼び出してみる。

nullが返却されたドライバは「ハズレ」とみなされ、次に登録しているJ
DBCドライバのconnectメソッドを呼び出す。


3.登録されている全てのJDBCドライバのconnectメソッドを試して、
コネクションが獲得できなかった場合は、

java.sql.SQLException: No suitable driver found for (接続文字列)


のエラーを出力して終了。


という感じのようです。




connectメソッドの引数



connect(String url, Properties info)
この二つの引数で、コネクションが作成できるかの判断と、
コネクションの作成を行います。

第一引数は、もちろん接続文字列。
"jdbc:xxxx"で始まるはずなので、処理できる接続文字列であるか判定します。



第二引数ですが、
DriverManager.getConnection(String url)
このメソッドから呼び出された場合は、何も設定されていません。


DriverManager.getConnection(String url, String user, String password)
このメソッドで呼び出された場合は、userとpasswordというキーに
引数で指定された値が設定されています。


DriverManager.getConnection(String url, Properties info)
この場合は、そのままinfoの値が渡されます。

Propertiesの値は、
info.get("user")
のような記載で取得できます。

今回、userやpasswordは引数に取らず、設定されていても無視することにします。


大まかな流れがわかったので、作成したJDBCドライバのロードと
コネクションオブジェクトが獲得できるところまでプログラムに
書いてみます。





関連記事

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

  1. 2010/04/17(土) 12:10:17|
  2. 開発
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<JDBC over Thriftを作成する その2(JDBCドライバのロード) | ホーム | Cassandra なんちゃってN-gramで全文検索(データ検索編)>>

コメント

コメントの投稿


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

トラックバック

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