Hibernate SQLクエリ実行のタイムアウト時間設定

2009/09/04 17:12Update
TAGS: Hibernate | クエリ | timeout | JDBC

SQLを発行して、なかなか返してこない、そのため、次の処理を進まない、実行中のSQLをキャンセルしたいという場合がしばしばあります。本文はHibernateでのSQLクエリ実行のタイムアウト時間設定方法について解説します。

JDBCのタイムアウト設定


ちなみに、JDBCの場合、Statement.setQueryTimeout(秒数)でタイムアウト設定ができます。

java.sql.Statement#
    public void setQueryTimeout(int seconds)
JDBCドライバが Statement オブジェクトの実行の待つ秒数を指定します。
この時間を経過すると、SQLException がスローされます。
※Oracleでテストしてみました、データベースに発行済みのSQLの実行もキャンセルされるらしい。

コード
String sql = ...;    //SQL文
Connection conn = ...;    //JDBCコネクション取得

try {
    PreparedStatement statement = conn.prepareStatement(sql);
    ...
    statement.setQueryTimeout(60);    //60秒でタイムアウト
} catch (SQLException e) {
    ...    //TODO エラー処理
}

int count = statement.executeQuery();    //クエリSQL実行


Hibernateのタイムアウト設定


Hibernateの場合、以下のようにタイムアウト時間を設定します。

■トランザクション・タイムアウト
Session session = ...;    //Session取得
Transaction transaction = session.getTransaction();

transaction.setTimeout(60);    //60秒でタイムアウト
transaction.begin();
...
transaction.commit();


■クエリ・タイムアウト
Session session = ...;    //Session取得
...
String queryHql = ...;    //HQL文

Query query = session.createQuery(queryHql);    //getNamedQuery
...
query.setTimeout(60);    //60秒でタイムアウト
...


■c3p0
Hibernate c3p0 - よく利用されているコネクションプーリング

参考資料


PreparedStatement (Java Platform SE 6)
org.hibernate.Query API doc
org.hibernate.Transaction API doc

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments