Java 缓存结果集
它更像是一个主观问题,问题的主要目的是缓存java.sql.ResultSet。但我知道它不是首选机制,因为它与连接紧密耦合,当连接关闭时,数据可能会被刷新。为了解决这个问题,我使用CachedRowSet。CachedRowSet的实例将使用第三方缓存工具进行缓存,这将帮助我减少db调用 下面给出了我的实现的代码片段。方法Java 缓存结果集,java,sql,caching,resultset,cachedrowset,Java,Sql,Caching,Resultset,Cachedrowset,它更像是一个主观问题,问题的主要目的是缓存java.sql.ResultSet。但我知道它不是首选机制,因为它与连接紧密耦合,当连接关闭时,数据可能会被刷新。为了解决这个问题,我使用CachedRowSet。CachedRowSet的实例将使用第三方缓存工具进行缓存,这将帮助我减少db调用 下面给出了我的实现的代码片段。方法executeQuery(String)在一个抽象类中实现,所有子类都将使用该抽象类执行查询。也可能有客户子类使用此方法从我们的系统中获取数据 public final Re
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;
}
}
现在,我对以下几点感到困惑
public void process(String query){
ResultSet rs = executeQuery(query);
//process rs to fetch data
}
}CachedRowSet
,数据正确性)ResultSet
操作的兼容性(ResultSet.getString()
,ResultSet.get..())。如果驱动程序期望/生成不同的ResultSet
子类(比如jdbcsresultset
,BaseResultSet
,等等)我们非常感谢您的任何想法、想法和建议,并在此之前向您表示衷心的感谢实现自定义
CachedRowSet
可能会很痛苦,因为您已经实现了ResultSet
接口公开的所有方法
我建议不要在jdbc级别上缓存,而是在数据访问层上缓存一些值对象
例如,如果您使用id、名称和电子邮件列的用户表,则可以使用以下值对象
class User {
Long id;
String name;
String email;
}
接下来,您可以介绍数据访问层
interface UserRepository {
List<User> retrieveUsers();
}
接口用户存储库{
列出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;
}
}
类CachingUserRepository实现UserRepository{
专用缓存;
私有用户库代理;
列出retrieveUsers(){
列表结果=cache.get(USERS\u KEY);
如果(结果==null){
结果=委托。检索用户();
}
返回结果;
}
}
实现缓存是最具挑战性的部分。你必须担心:
我发现它稳定且易于使用。如果客户期望
ResultSet
,并且CachedRowSet
扩展/实现ResultSet
,客户将乐于接受CachedRowSet
“CachedRowSet”是Java API,称为断开连接的ResultSet。我已经有了稳定的缓存解决方案,我在帖子中也提到了是的,但是在公共JavaAPI中没有实现它。您正在使用的实现是com.sun.*包层次结构的一部分,它不适合最终用户使用,在将来的Java版本中可能会发生更改,并且在非Oracle Java版本中不受支持。最好避免使用它。