[pgpool-general-jp: 1173] オンメモリクエリキャッシュ機能について

佐藤慎 s_sato @ eltex.co.jp
2013年 7月 9日 (火) 14:02:20 JST


お世話になっております。エルテックスの佐藤と申します。

前回、問い合わせさせて頂きました「[pgpool-general-jp: 1169] クエリキャッシュの不正」の継続した投稿になります。

PostgreSQL 9.2.4 とpgpool-II 3.2.4 の環境で動作検証行っていますが、
同じSELECTで常に同じ結果が返るはずのものが、SELECTする都度、SELECT結果が違ってしまう、という症状が発生します。
オンメモリクエリキャッシュ機能を有効にした場合のみ、発生します。
SELECT結果が違ってしまう場合、キャッシュからSELECT結果を返しているというpgpoolのログが出ております。

DBは HS/SRクラスタで、pgpoolはmaster-slaveモードになります。

[各種環境]
Apache Tomcat Version 7.0.29
コネクションプーリング tomcat-dbcp.jar(Apache Tomcat 付属)
JDBCドライバー postgresql-9.1-902.jdbc4.jar
PostgreSQL (9.2.4)
pgpool-II (3.2.4)
Java 1.7.0_05-b06
Webサーバー Apache 2.2.23

[SQLの生成方法]
SQLは PreparedStatement を使って実行していますが、LIMIT句とOFFSET句は

        StringBuilder sb = new StringBuilder();
        sb.append(original);
        sb.append(apendOrderby(criteria));
        sb.append("  LIMIT ");
        sb.append(criteria.getCriteriaResult().getLimit());
        sb.append("  OFFSET ");
        sb.append(criteria.getCriteriaResult().getStart() - 1);

のように、SQL中に直接埋め込んでいます。

個別の検索条件にはプレースホルダーを使用していますので、
発行されるSQLのイメージとしては

SELECT
        employee_id
        ,first_name
        ,last_name
        ,email
        ,phone_numeric
        ,hire_date
        ,job_id
        ,salary
        ,commission_pct
        ,manager_id
        ,department_id
    FROM
        employee
    WHERE
        department_id = ?
    ORDER BY
        employee_id limit 10 offset 10;

のようになります。実際のSQLはもっと長いです。

コネクションはTomcatのコネクションプーリングを使用していて、
JNDIでルックアップして取得しています。

上記のSELECTをpsqlで単一のSQLとして、発行した場合は、問題事象は発生しませんが、アプリケーションから実行すると事象発生します。
オンメモリクエリキャッシュ機能を有効にした場合のみ再現し、オンメモリクエリキャッシュ機能を無効にすると問題事象は再現せずに、改善します。

オンメモリクエリキャッシュ機能は共有メモリーを使用しています。
pgpoolのオンメモリクエリキャッシュ機能の設定としては、以下のとおりです。
memory_cache_enabled = on
memqcache_method = 'shmem'
memqcache_memcached_host = 'localhost'
memqcache_memcached_port = 11211
memqcache_total_size = 67108864
memqcache_max_num_cache = 1000000
memqcache_expire = 0
memqcache_auto_cache_invalidation = on
memqcache_maxcache = 409600

「SHOW pool_cache」コマンドからキャッシュストレージのエントリが一杯でないことは確認済みです。

質問事項
-------------------------------------------------------------------------------------------------------------------------------
1. マニュアルを見ると以下記述がございますが、オンメモリクエリキャッシュ機能ではSQLの長さに制限がありますでしょうか。

「オンメモリクエリキャッシュは、問い合わせのSELECT文(拡張問い合わせの場合は更にバインドパラメータ)と
 検索結果をペアで記録し、2回目以降に同じSELECT文が発行された場合に、キャッシュから結果を返します。」

2. 発行するSQLは上記のSQLのようなイメージですが、最後のoffset値だけが0、10、20というように変化します。
 SQLが長すぎて、過去にキャッシュした似たSQLと同一とみなされて、キャッシュから結果を返しているということはありませんでしょうか?

3. 原因を特定するために、確認すべき項目がありましたら、教えて頂けないでしょうか?

------------------------------------------------------------------------------------------------------------------------------

ご回答は一部でもよく、何かヒントになるものでも構いませんので、よろしくお願いいたします。

-- 
―――――――――――――――――――――――――
佐藤 慎
株式会社エルテックス
システムマネージメントサービス部
〒240-0005 横浜市保土ヶ谷区神戸町134
横浜ビジネスパーク イーストタワー14階
電話:045-332-7865 Fax:045-332-6644
URL :http://www.eltex.co.jp/
facebook:http://www.facebook.com/ELTEXinc
――――――――――――――――――(c)ELTEX, Inc.


pgpool-general-jp メーリングリストの案内