首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存ResultSet

缓存ResultSet
EN

Stack Overflow用户
提问于 2012-10-21 19:13:48
回答 1查看 13.4K关注 0票数 4

它更像一个主观的问题,问题的主要目的是缓存java.sql.ResultSet。但我知道它不是首选的机制,因为它与连接紧密耦合,当连接关闭时,数据可能会被刷新。为了解决这个问题,我使用CachedRowSet。CachedRowSet实例将使用第三方缓存工具进行缓存,这将帮助我减少db调用。

下面给出了我实现的代码片段。方法executeQuery(String)是在一个抽象类中实现的,所有子类都将使用该类来执行查询。也可能有客户子类使用这种方法从我们的系统中获取数据。

代码语言:javascript
复制
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;
        }
    }

现在,我有点困惑于以下几点

  1. 我将返回CachedResultSet实例,而不是CachedResultSet接口。会是resultSet的正确替代品。驱动程序JAR,DB类可以在不同的客户环境中发生变化。客户将编写自定义类,并期望从抽象类获得resultSet。这会引起什么问题吗?像下面这样的东西 公共类CustomerXX扩展BaseClass { 公共空进程(字符串查询){ ResultSet rs =executeQuery(查询);//process rs以获取数据} }
  2. 这类操作所涉及的风险(缓存CachedRowSet、数据正确性)
  3. 创建CachedRowSet的性能
  4. 与所有ResultSet操作( ResultSet.getString(),ResultSet.get.())兼容。如果驱动程序期望/生成ResultSet的不同子类(例如jdbcResultSetBaseResultSet等)

我有类似的许多其他问题是我的想法,我只是写了几个我觉得有效,并有更高的优先权。

不确定我的问题是否如此含糊不清,我的要求是否足够明确。

任何想法、想法、建议都会受到高度赞赏,并事先表示感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-21 20:13:16

实现自定义CachedRowSet可能会很痛苦,因为您已经实现了由ResultSet接口公开的所有方法。

我建议不要在jdbc级别缓存,而是在数据访问层缓存一些值对象。

例如,如果您的用户表中包含id、name和email列,则可以具有以下值对象

代码语言:javascript
复制
class User {
    Long id;
    String name;
    String email;
} 

接下来,您可以介绍数据访问层。

代码语言:javascript
复制
interface UserRepository {
    List<User> retrieveUsers();
}

使用默认的JdbcUserRepository从数据库加载数据。

可以使用代理模式实现缓存:

代码语言:javascript
复制
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;
    }

}

实现缓存是最具挑战性的部分。你必须担心:

  1. 并发性-几个线程将访问缓存。
  2. 内存缓存可能变得太大,可能会发生OutOfMemoryException。

我建议使用一些现有的缓存解决方案,而不是编写自己的解决方案。我发现谷歌番石榴是稳定和易于使用的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13001216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档