实施自定义缓存存储|点燃文档

点燃2023年峰会-按需观看-立即注册!

编辑

实现自定义缓存存储

您可以实现自己的自定义缓存存储并将其用作缓存的底层数据存储。方法点火缓存读取或修改数据将调用缓存存储实施。

下表描述了缓存存储接口。

方法 描述

loadCache()

这个loadCache(…)每当IgniteCache.loadCache(…)被调用,通常用于将数据从底层数据库预加载到内存中。此方法在存在缓存的所有节点上加载数据。

要在单个节点上加载数据,请调用IgniteCache.localLoadCache()在该节点上。

加载(),写入(),删除()

这个加载(),写入()、和删除()每当获取(),put()、和删除()方法在点火缓存接口。这些方法用于启用通读直写处理单个缓存项时的行为。

加载全部(),写入全部(),删除全部()

加载全部(),写入全部()、和删除全部()在中缓存存储无论何时调用方法获取全部(),putAll()、和删除所有()点火缓存接口。这些方法用于在处理多个缓存项时启用读写行为,通常应使用批处理操作来实现,以提供更好的性能。

CacheStoreAdapter(缓存存储适配器)

CacheStoreAdapter(缓存存储适配器)是的扩展缓存存储为批量操作提供默认实现,例如loadAll(Iterable),writeAll(集合)、和deleteAll(集合),通过遍历所有条目并调用相应的加载(),写入()、和删除()对单个条目的操作。

CacheStoreSession(缓存存储会话)

缓存存储会话用于保存存储上多个操作之间的上下文,主要用于提供事务支持。一个事务中的操作使用相同的数据库连接执行,并且在事务提交时提交连接。缓存存储会话由CacheStoreSession(缓存存储会话)类,可以注入您的缓存存储通过实现@网格缓存存储会话资源注释。

有关如何实现事务缓存存储的示例,请参见github.

例子

下面是非事务性实现的示例缓存存储。有关支持事务的实现示例,请参阅缓存JdbcPersonStore.javaGitHub上的文件。

JDBC非事务性
公众的  缓存JdbcPersonStore 延伸 CacheStoreAdapter(缓存存储适配器)<, > {
    //只要在IgniteCache上调用“get(…)”方法,就会调用此方法。
    @覆盖
    公众的  负载( 钥匙) {
        尝试 (连接 康纳 = 连接()) {
            尝试 (已编制报表 标准 = 康纳.编制报表(“从id=?的个人中选择*”)) {
                标准.设置长(1, 钥匙);

                结果集  = 标准.执行查询();

                返回 .下一个() ? 新的 (.获取Int(1), .获取字符串(2)) : 无效的
            }
        } 抓住 (SQL异常 e(电子)) {
             新的 CacheLoader异常(“加载失败:” + 钥匙, e(电子));
        }
    }

    @覆盖
    公众的 空隙 (条目<? 延伸 , ? 延伸 > 进入) 投掷 缓存写入程序异常 {
        尝试 (连接 康纳 = 连接()) {
            //MERGE语句的语法是特定于数据库的,应该用于您的数据库。
            //如果您的数据库不支持MERGE语句,则按顺序使用
            //更新,插入语句。
            尝试 (已编制报表 标准 = 康纳.编制报表(“合并到PERSON(id,name)key(id)VALUES(?,?)”)) {
                 val值 = 进入.获取价值();

                标准.setLong(设置长)(1, 进入.获取密钥());
                标准.setString(设置字符串)(2, val值.获取名称());

                标准.执行更新();
            }
        } 抓住 (SQL异常 e(电子)) {
             新的 缓存写入程序异常(“写入条目失败(” + 进入 + ")", e(电子));
        }
    }

    //只要在IgniteCache上调用“remove(…)”方法,就会调用此方法。
    @覆盖
    公众的 空隙 删除(对象 钥匙) {
        尝试 (连接 康纳 = 连接()) {
            尝试 (已编制报表 标准 = 康纳.编制报表(“从PERSON中删除,其中id=?”)) {
                标准.setLong(设置长)(1, () 钥匙);

                标准.执行更新();
            }
        } 抓住 (SQL异常 e(电子)) {
             新的 缓存写入程序异常(“删除失败:” + 钥匙, e(电子));
        }
    }

    //每当“loadCache()”和“localLoadCache
    //方法在IgniteCache上调用。它用于批量加载缓存。
    //如果不需要大量加载缓存,请跳过此方法。
    @覆盖
    公众的 空隙 loadCache(加载缓存)(点火BiInClosure<, > clo(克隆), 对象... 参数) {
        如果 (参数 == 无效的 || 参数.长度 == 0 || 参数[0] == 无效的)
             新的 CacheLoader异常(“未提供预期的条目计数参数。”);

        最终的 整数 入口Cnt = (整数) 参数[0];

        尝试 (连接 康纳 = 连接()) {
            尝试 (已编制报表 标准 = 康纳.编制报表(“从个人中选择*”)) {
                尝试 (结果集  = 标准.执行查询()) {
                    整数 碳纳米管 = 0

                    虽然 (碳纳米管 < 入口Cnt && .下一个()) {
                          = 新的 (.获取Int(1), .获取字符串(2));
                        clo(克隆).应用(.获取Id(), );
                        碳纳米管++;
                    }
                }
            }
        } 抓住 (SQL异常 e(电子)) {
             新的 CacheLoader异常(“无法从缓存存储加载值。”, e(电子));
        }
    }

    //打开JDBC连接。
    私有的 连接 连接() 投掷 SQL异常 {
        //打开与RDBMS系统的连接(Oracle、MySQL、Postgres、DB2、Microsoft SQL等)
        连接 连接器 = 驱动管理器.获取连接(“jdbc:mysql://[host]:[port]/[database]”, “您的用户名”, “您的密码”);

        康纳.设置自动提交(真的);

        返回 康纳
    }
}