kaakaa Blog

この世は極楽 空にはとんぼ

[clubdb2] 「第158回 Javaプログラマーに贈る:Groovyで楽

最近Groovyにハマってる&殆どDB触ったこと無いから今年はDBやらなきゃと思ってる。
という想いから、なかなかドンピシャな会があったので参加してみた。


ClubDB2 - 第158回

参加者は20人ぐらい?
内、Groovy触ったことあるのは自分含め3人。

JDBCプログラミングの憂鬱

  • 書く量が多い ...
  • 例外が面倒 ...

JavaJDBC書くのは面倒ですよねって話。
自分もJDBCはサンプルレベルでしか触ったことないけど、
普通の「Java書くのだるい」より一つ上のレベルの面倒臭さだったという印象。

JDBCで面倒なのは記述だけでなく、

  • DBの型定義を意識しなくてはいけない
  • finallyで順にリソースをクローズしなくてはいけない
  • SQL実行してResultSet取って来れても、結果をBeansに詰めるのが面倒
  • DB内で起こったエラーは軽いものも重大なものもSQLException
    • 後は開発者任せ
    • しかもチェック例外
    • しかも使うDBに応じて対応する必要がある

想像しただけで発狂しそう…。


ココらへんの面倒がGroovyだと解消されますよって話。

Groovyで楽をしよう

  • Groovy超入門
  • Javaとの連係

ココらへんは「プログラミングGroovy」に載ってる話。

プログラミングGROOVY

プログラミングGROOVY

Groovyの細かい話は上の書籍を読めば済む話なので、詳しく書きません。

JavaプログラマがGroovyのパワフルさを理解するには、@kiy0takaさんの下のスライドが分かりやすい。

Jenkins and Groovy

Groovy SQL

  • DB2に接続する
  • SELECT
  • INSERT/UPDATE/DELETE
  • Batch

ここはもう、Groovyマンセーな話。楽〜。

@Grab('mysql:mysql-connector-java:5.1.23')
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql
user = '****'
pass = '****'
sql = Sql.newInstance('jdbc:mysql://*.*.*.*:3306/mysql',user,pass,'com.mysql.jdbc.Driver')

result = sql.rows('SELECT Db,User from db')

result.each{ row ->
    println "${row.Db}:${row.User}"
}

あと、Prepared Statementの話。

Prepared Statementを使うメリット

Prepared Statement自体は速度向上が期待出来るが、Groovyでは実装の問題上、速度向上を妨げる部分がある。

Groovy2.1.1のgroovy.sql.Sql.java

Preparedでない場合。

public void query(String sql, Closure closure) throws SQLException {
  Connection connection = createConnection();
  Statement statement = getStatement(connection, sql);
  ResultSet results = null;
  try {
    log.fine(sql);
    results = statement.executeQuery(sql);
    closure.call(results);
  }
...

Preparedの場合。

public void query(String sql, List<Object> params, Closure closure) throws SQLException {
  Connection connection = createConnection();
  PreparedStatement statement = null;
  ResultSet results = null;
  try {
    log.fine(sql);
    statement = getPreparedStatement(connection, sql, params);
    results = statement.executeQuery();
    closure.call(results);
  }
...

結局Preparedしても、毎回Statementを生成しているので、その部分はPreparedの良さを殺している…かもしれない。
ただし、RDBの多くは実行計画*1をキャッシュしてるため、Listで渡しで同じようなSQLを続けて打つような後者の実装なら速度向上が見込める可能性は高い。


その他の利点やGroovyの問題点などありましたが、DBに疎い自分が書くと間違ったことを書いてしまう恐れがあるのでやめときます。
多分、ClubDB2のWikiで発表資料は公開されると思うので。
⇒公開して下さいました:#clubdb2 「Javaプログラマーに贈る:Groovyで楽にSQLを実行してみよう」の資料を公開しました | Unofficial DB2 BLOG

Groovy,jdbcともに基礎的な内容だったけど、jdbcに関しては色々得るものも多く、Groovyに関してもプログラミングGroovy読んだけど忘れてる部分などもあって復習になった。
何より、人がGroovyが楽だと言うことを説明してるのを見るとテンション上がる。

最後は

DB2 10 エバリュエーション・ガイドブック

DB2 10 エバリュエーション・ガイドブック

を賭けたじゃんけん大会。

DB2を今日知った自分がもらっても良いかと不安になりながらでしたが、しっかり負けたので一安心でした。

*1:コメントを受けて実行結果→実行計画に修正しました