2

Iamは自分のWebアプリケーションにmemcacheを実装しようとしていて、iamが行っていることが設計の観点から正しいかどうかについての提案を得たいと思っていました。

すべての挿入、更新、およびSQLクエリの選択を実行するSimpleDataAccessorクラスがあります。したがって、実行する必要のあるクエリはすべて、このクラスのメソッド内で実行されます。

したがって、selectクエリの実装があるメソッドの中に、このように結果セットをmemcacheに格納するメソッドがあります。

storeinMC(resultset.getJSON()、sqlquery);

ここのsqlqueryが私の鍵です。

また、selectqueryを実行する前に、memcacheで、そのクエリの結果セットがすでにあるかどうかを確認します。

if((String res = getRSFromMC(sqlquery)== null)

だから私はそれをわかりやすくシンプルに保つように努めました。これに問題がありますか?

4

2 に答える 2

1

rai.skumarが正しく指摘したように、SQLステートメントは異なる方法で構成される可能性があります(たとえば、WHERE句に同じ条件を異なる順序で含めることができるなど)。

したがって、上記の問題を克服するには、SQLを解析し、S​​QLから関連するすべての部分を取得する必要があります。次に、これらの部分を組み合わせてキャッシュキーにすることができます。

SQLパーサーを見ることができます:ZQLJSqlParser、 SQLからJavaクラスを返すJava用の一般的なSQLパーサー。

もう1つのオプションは、ストレートJDBCの代わりにJPAを使用することです。たとえば、Hibernateは優れたJPAサポートを備えており、クエリを完全にキャッシュできます。

JDBCに近づいたら、構文やキャッシュをサポートするJDBCのようなMyBatisを使用できます。

于 2012-12-04T02:23:53.167 に答える
0

以下のクエリを検討してください。

 String k1 = "Select * from table";   //Query1
 String k2 = "Select * from TABLE";  // Query2 ; notice TABLE is in caps

上記のSQLクエリはどちらも同じであり、同じデータをフェッチします。ただし、上記のクエリがMemchachedでキーとして使用されている場合、それらは異なる場所に保存されます(k1.equals(k2)はfalseを返すため)。

また、何らかの方法でタイプミスや余分なスペースがないことを確認できれば、キー/クエリが非常に大きくなる可能性があるため、あまり効率的ではありません。

于 2012-12-01T09:00:05.033 に答える