主観的な質問に似ています。質問の主な目的は、java.sql.ResultSetをキャッシュすることです。ただし、Connectionと緊密に結合されているため、推奨されないメカニズムであり、接続が閉じられるとデータがフラッシュされる可能性があることを私は知っています。この問題に対処するために、私はCachedRowSetを使用しています。CachedRowSetのインスタンスは、サードパーティのキャッシュツールを使用してキャッシュされます。これは、db呼び出しを減らすのに役立ちます。
私の実装のコードスニペットを以下に示します。このメソッドexecuteQuery(String)
は、すべてのサブクラスがクエリの実行に使用する抽象クラスに実装されます。このメソッドを使用してシステムからデータをフェッチする顧客サブクラスも存在する可能性があります。
public final ResultSet executeQuery(String query){
try {
// return data if it is available in cache, else execute and store in cache
CachedRowSet cachedRowSet=getDataFromCache(query);
if(cachedRowSet!=null) {
return cachedRowSet;
}
PreparedStatement statement=getStatment();
ResultSet rs= statement.executeQuery(query);
CachedRowSet cachedRowSet=new CachedRowSetImpl();
cachedRowSet.populate(rs);
cachedData(cachedRowSet);
return cachedRowSet;
} catch (Exception e) {
return null;
}
}
今、私は以下の点と少し混乱しています
ResultSetインターフェースの代わりに、CachedResultSetのインスタンスを返します。resultSetの正しい置換になります。ドライバーJAR、DBクラスは、お客様の環境によって異なる場合があります。顧客はカスタムクラスを作成し、AbstractクラスからのresultSetを期待します。それは何か問題を引き起こしますか?以下のようなもの
パブリッククラスCustomerXXはBaseClassを拡張します{
public void process(String query){ ResultSet rs = executeQuery(query); //process rs to fetch data }
}
この種の操作に伴うリスク(キャッシング
CachedRowSet
、データの正確性)作成のパフォーマンス
CachedRowSet
ResultSet
すべての操作との互換性(ResultSet.getString()
、ResultSet.get ..())。ドライバーがResultSet
(SayjdbcResultSet
、BaseResultSet
など)の異なるサブクラスを期待/生成する場合
他にも同じような質問がたくさんありますが、私は自分が有効で優先度が高いと感じているものをいくつか書いています。
私の質問がそれほど曖昧であるかどうかはわかりませんが、私の要件は十分に明確になっています。
どんなアイデア、考え、提案も高く評価されており、事前に感謝します