它更像一个主观的问题,问题的主要目的是缓存java.sql.ResultSet。但我知道它不是首选的机制,因为它与连接紧密耦合,当连接关闭时,数据可能会被刷新。为了解决这个问题,我使用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;
}
}现在,我有点困惑于以下几点
CachedRowSet、数据正确性)CachedRowSet的性能ResultSet操作( ResultSet.getString(),ResultSet.get.())兼容。如果驱动程序期望/生成ResultSet的不同子类(例如jdbcResultSet、BaseResultSet等)我有类似的许多其他问题是我的想法,我只是写了几个我觉得有效,并有更高的优先权。
不确定我的问题是否如此含糊不清,我的要求是否足够明确。
任何想法、想法、建议都会受到高度赞赏,并事先表示感谢。
发布于 2012-10-21 20:13:16
实现自定义CachedRowSet可能会很痛苦,因为您已经实现了由ResultSet接口公开的所有方法。
我建议不要在jdbc级别缓存,而是在数据访问层缓存一些值对象。
例如,如果您的用户表中包含id、name和email列,则可以具有以下值对象
class User {
Long id;
String name;
String email;
} 接下来,您可以介绍数据访问层。
interface UserRepository {
List<User> retrieveUsers();
}使用默认的JdbcUserRepository从数据库加载数据。
可以使用代理模式实现缓存:
class CachingUserRepository implements UserRepository {
private Cache cache;
private UserRepository delegate;
List<User> retrieveUsers() {
List<User> result = cache.get(USERS_KEY);
if (result == null) {
result = delegate.retrieveUsers();
}
return result;
}
}实现缓存是最具挑战性的部分。你必须担心:
我建议使用一些现有的缓存解决方案,而不是编写自己的解决方案。我发现谷歌番石榴是稳定和易于使用的。
https://stackoverflow.com/questions/13001216
复制相似问题