首页 > 解决方案 > 如何通过自动生成的 PK 使用 Redisson 直写缓存策略

问题描述

我计划将 Redis 与 Redisson 一起用作我的 Java 应用程序和 PostgreSQL 数据库之间的缓存层。我有一个名为 Nodes 的表,如下所示:

CREATE TABLE nodes
(
node_id bigint GENERATED BY DEFAULT AS IDENTITY(START WITH 1 INCREMENT BY 1),
node_name varchar(100) NOT NULL,
PRIMARY KEY (node_id)
)

我想使用Redisson RMap 持久性来缓存这个结构。我的目标是让 rmap 看起来像这样:

Rmap<Integer, Node> 

其中键是PK,值是节点本身。

我想通过使用 MapLoader 和 MapWriter 使用 read-through 和 write-trhough 策略来缓存这个 Rmap。

然后,我想要一个 Java 方法来创建和持久化一个节点。

public void createNode(String nodeName) {
  Node node = new Node();
  node.setName(nodeName);

  // how can I put elements in the rmap since, 
  // the PK will be available after the INSERT statement will run?
  rmap.put(?, node);
}

问题来了。由于 PK 是从 Postgres 自动生成的,我如何使用 RMapWriter 插入节点,因为为了将元素放入 RMap 我需要密钥,在插入语句运行之前我没有该密钥?

标签: javapostgresqlcachingredisredisson

解决方案


您可以使用准备好的语句从 postgres 获取生成的密钥。

   ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) ;
   ps.execute();
   ResultSet rs = ps.getGeneratedKeys();

推荐阅读