2

我正在尝试在我的 Web 应用程序中实现 memcache,只是想获得有关我正在做的事情在设计方面是否正确的建议。

我有一个 SimpleDataAccessor 类,它运行我所有的插入、更新和选择 sql 查询。所以任何必须执行的查询都在这个类的方法中执行。

所以在我有我的选择查询实现的方法中,我有一个方法可以像这样将结果集存储在 memcache 中。

storeinMC(resultset.getJSON(),sqlquery);

这里的 sqlquery 是我的关键。

此外,在运行 selectquery 之前,我会在 memcache 中检查我是否已经有该查询的结果集。

if((字符串 res=getRSFromMC(sqlquery)==null)

所以我尽量保持简单明了。你看到这有什么问题吗?

4

2 回答 2

1

正如 rai.skumar 正确指出的那样,您的 SQL 语句可以以不同的方式构造(例如,WHERE 子句可以包含不同顺序的相同条件等)

因此,要克服上述问题,您需要解析 SQL 并从中获取所有相关部分。然后您可以将这些片段组合成一个缓存键。

您可以查看 SQL 解析器:ZQLJSqlParserJava 通用 SQL 解析器,它们会从 SQL 中返回 Java 类。

另一种选择是使用JPA而不是直接的 JDBC。例如, Hibernate具有出色的 JPA 支持,并且完全能够缓存您的查询。

如果你觉得更接近 JDBC,你可以使用MyBatis,它具有非常类似于 JDBC 的语法和缓存支持。

于 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 回答