Oracleデータベースの下でPreparedStatementCacheメモリの問題解決策

2491 ワード

PreparedStatementCacheの意味
Oracleでは、PreparedStatementがサーバに対応するカーソルをサポートしています.PreparedStatementがキャッシュされて繰り返し実行されると、PreparedStatementが閉じられず、サーバ側のカーソルが閉じられず、パフォーマンスが大幅に向上します.SELECT*FROM T WHERE ID=?このようなシーンでは、パフォーマンスが数段向上する可能性があります.
PreparedStatementCacheの性能向上が顕著であるため、DruidDataSource、DBCP、JBossDataSource、WeblogicDataSourceともにPreparedStatementCacheを実現した.
PreparedStatementCacheがもたらす問題
アリババはjboss接続プールを使ってPreparedStatementCacheをしていたところ、full gcが頻繁に問題に遭遇した.matでjmap dumpを解析した結果,T 4 CPreparedStatementはメモリが多く,問題のあるいくつかの項目,300 M,500 M,最も誇張された900 Mであることが分かった.これらのアプリケーションは、jboss接続プールを使用してOracleデータベースにアクセスします.T 4 CPreparedStatementは、Oracle JDBC DriverのPreparedStatementの実装です.
oracle driverはオープンソースではなく、インバースエンジニアリングおよびmat分析により、メモリに含まれるフィールドchar[]defineChars、defineCharsサイズの計算式が次のようになっていることがわかりました.defineChars = rowSize * rowPrefetchCount
rowPrefetchCountはOracleで、デフォルト値は10です.
ここでrowSizeは、クエリー設計を実行する各カラムのサイズの和です.計算式は次のとおりです.rowSize = col_1_size + col_2_size + ... + col_n_size
悲劇的に、いくつかのカラムのデータ型はvarchar 2(4000)で、rowSizeは巨大で、多くのテーブルに関連するSQL、rowSizeは数十Kに達する可能性があり、rowPrefetchCountを乗じて、defineCharsのサイズは1 Mに近い.考えてみれば、maxPoolSizeが30、PreparedStatementCacheSizeが50に設定されているシーンでは、PreparedStatementCacheがGのメモリを占有する可能性があります.実際のテストの結果は次のとおりです.
varchar2(4000)
col_size 4000 chars
clob -> col_size
col_size 4000 bytes
実際にメモリを占有する数式: = defineChars * PreparedStatementCacheSize * MaxPoolSize
実際の解析では,1つのアプリケーションで実行されるSQLは約数百本,PreparedStatementCacheSizeは50,PreparedStatementCacheのアルゴリズムはLRUであり,多くのSQLが実行された後,CacheでHitCountが0で淘汰され,淘汰されたプロセスは,その位置が1から50にシフトし,この長いプロセスはdefineCharsがyoung gcに回収されないことを招いた.
Druidのソリューション
ヒット率の低いSQLは、defineCharsキャッシュを持たない.
OracleStatementでは、defineCharsをクリーンアップするclearDefinesメソッドが用意されています.DruidDataSourceは、PreparedStatementがCacheに参加している間にhitCount<1を発見した場合、clearDefinesメソッドを呼び出します.これにより、ヒット率0のPreparedStatementがメモリを消費することを回避します.テストによると、200 SQL、PreparedStatementCacheSizeが50のシーンで、young gcを半分に減らすことができる.(生産環境はまだテストしていない)
PreparedStatementが実行した結果に基づいてRowPrefetchサイズを計算
PreparedStatementCacheカウンタの追加
次の内容が含まれます.
  • PreparedStatementCacheCurrentSize
  • P r e p a r e d S t e m e n t CacheDeleteCountキャッシュ削除回数
  • PreparedStatementCacheHitCountキャッシュヒット回数
  • P r eparedStatementCacheMissCountキャッシュ不ヒット回数
  • PreparedStatementCacheAccessCountキャッシュアクセス回数この5つのカウンタを通して、PreparedStatementCacheの動作状況を明確に理解し、実際の状況に応じて調整します.