SQLクエリを実行する古いアプリケーションを次のように古い方法で変換しようとしています。
java.sql.Connection connection = ....
String queryStr="select acct from Person where acct in (select acct from Document where dbcreate_date > DATEADD(hh,-12, GETDATE())) and status not in ('A','P')";
...
...
java.sql.Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery(queryStr);
上記のコードは約10ミリ秒かかります。これには、データベース接続の取得、ステートメントの作成、およびクエリの実行が含まれます。
私は現在HibenateHQLを使用しており、次のようなHQLクエリを作成しました。
Query query = session.createQuery("select p.acct from Person p where p.acct in (select acct from Document d where create_date > :date and status not in ('A','P'))");
現在、このステートメント「session.createQuery(....)」は約105ミリ秒かかります。これは、上記の古い方法でクエリ全体を実行する場合よりも約10倍長くなります。
Hibernateクエリキャッシングがどのように機能するかはよくわかりませんが、同じHQLステートメントを2回実行すると、約5ミリ秒かかります。
さて、私の質問は、なぜこの動作がHibernateHQLを使用して発生するのかということです。「session.createQuery(...)」メソッドの内部で何が起こっているのかを知っている人はいますか。最初の実行にははるかに時間がかかりますが、2回目の実行にははるかに時間がかかります。また、「query.list()」を実行するときに、Hibernateがデータベースに対してSQLを実行することにも気づきました。
ありがとう。