はじめに
とあるアプリケーションのデータベースとして、H2を採用していた。そのアプリケーションでは問題があり、都合上DBへ挿入するデータに重複があり、どうしても一意制約違反(既に主キーが存在している項目をinsertすると発生する)が発生してしまっていた。
エラーが発生してもアプリケーション自体には問題はないが、アラートがうるさい(これは致命的)ので、なんとかこのケースの場合は例外をにぎりつぶすこととした。
JavaのJDBCのエラーについて
ハンドリングする前に一点知っておくべきこととして、JDBC経由のエラー、つまりJavaのRDBMSに関わるエラーはすべてSQLExceptionが例外として、発生する。
だから、例外クラスではハンドリングすることはできない。
SQLExceptionのエラーコードを使おう
throwされた例外クラスにはgetErrorCode()
というpublicなメソッドが存在しており、文字通りエラーコードを取得できる。
エラーコードとは?
これがエラーの内容そのものとなるのだが、ひとつ厄介な点がある。
エラーコードはRDBMS毎に異なるのだ。例えば今回使用するH2については以下にエラーコード一覧が記載されている。
通常これ全てについて考慮する必要があるのかどうかわからないが、真面目にやるならば列挙型等を用いて性格なエラーメッセージが出力されるようにハンドリングしてやらないと行けない。
実際のコード
今回は一意成約違反の例外のみについてハンドリングすることとする。上のサイトによれば、一意制約違反については23505
が該当するようだ。
一部書き換えているので動作は保証できないが、おおよそ以下のようなコードで対応できた。
public int insertQuery(String key) { int res=0; int errorCode = 0; try { query=this.INSERT_QUERY + key res=statement.executeUpdate(query); return res; }catch(SQLException e){ errorCode = e.getErrorCode(); if(errorCode==23505){ return 1; }else{ system.println("Unexpect Error Occurred") e.printStackTrace(); return errorCode; } } }
終わりに
もしかしたら、便利なライブラリがあるかもしれない。ご存じの方はぜひ教えて下さい。