我试图在我的网络应用程序中实现memcache,并且只是希望得到一些建议,即我在做什么在设计方面是正确的。
我有一个类SimpleDataAccessor,它运行我的所有插入,更新和选择sql查询。因此,必须执行的任何查询都在此类的方法内执行。
所以在我有select查询实现的方法中,我有一个方法将结果集存储在这样的memcache中。
storeinMC(resultset.getJSON(),sqlquery的);
这里的sqlquery是我的密钥。
在运行selectquery之前,我在memcache中检查我是否已经为该查询设置了结果集。
if((String res = getRSFromMC(sqlquery)== null)
所以我试图保持简单明了。 你觉得这有什么问题。?
答案 0 :(得分:1)
正如rai.skumar正确地指出你的SQL语句可以用不同的方式构造(例如WHERE子句可以在diff顺序中包含相同的条件等)。
因此,要克服上述问题,您需要解析SQL并从中获取所有相关部分。然后,您可以将这些部分组合到缓存键中。
你可以看一下SQL解析器:ZQL,JSqlParser,General SQL Parser for Java,它们会从你的SQL中返回java类。
另一个选择是使用JPA而不是直接JDBC。例如,Hibernate具有出色的JPA支持,并且完全能够缓存您的查询。
如果您更接近JDBC,可以使用具有非常类似JDBC的语法和缓存支持的MyBatis。
答案 1 :(得分:0)
考虑以下问题:
String k1 = "Select * from table"; //Query1
String k2 = "Select * from TABLE"; // Query2 ; notice TABLE is in caps
上述两个SQL查询都是相同的,并且将获取相同的数据。但是如果上面的查询被用作Memchached中的键,它们将被存储在不同的位置(因为k1.equals(k2)将返回false)。
此外,如果你能确保没有拼写错误或额外空格,那么密钥/查询可能会非常大,效率会不高。