【问题标题】:How to configure @Transactional support to Redis in Springboot?如何在 Spring Boot 中为 Redis 配置 @Transactional 支持?
【发布时间】:2021-07-03 00:21:20
【问题描述】:

我目前正在开发一个项目,该项目主要使用 Redis 进行缓存,我使用 Oracle 作为主数据库,使用 Spring Data JPA 来处理我项目中的数据库层。我需要知道如何使用 @Transactional 注释支持来处理 Redis 中的事务。我已经参考了很多关于这个场景的教程和文档。在大多数这些教程中,总是有相同的源代码集可用。但是,我仍然对实施没有明确的想法。因为在我的应用程序中已经有一个可用的数据源,我通过属性文件配置了它。 (Oracle 数据库) 所以我怀疑dataSource bean 的执行。而且我也无法理解 transactionManager bean 的用法。我应该如何正确实施,请给出详细说明。

我在网上找到的源代码。

@Configuration
@EnableTransactionManagement // 1
public class RedisConfig {

    @Bean
    public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        // Configure redisTemplate
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        / / Open transaction support
        stringRedisTemplate.setEnableTransactionSupport(true); // 2
        return stringRedisTemplate;
    }

    @Bean
    public PlatformTransactionManager transactionManager() throws SQLException {
        return new DataSourceTransactionManager(dataSource()); // 3
    }

    @Bean
    public DataSource dataSource() throws SQLException {
        // ...
    }
}

更新: apppication.properties 文件中当前配置的数据源属性。

# OracleDB connection settings
spring.datasource.url=jdbc:oracle:thin:@192.168.20.108:1521:orcl
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

# HikariCP settings
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.poolName=redis-sample-pool

Resource about the Redis Transactions handling

【问题讨论】:

  • 这就是您需要做的所有事情。您是否发现此代码有任何问题?
  • @sonus21 问题是我对dataSource bean的实现没有任何明确的想法。正如我提到的,这是我从互联网上获得的代码。这不是我的代码。在这里你可以看到 dataSource bean 实现是空的。我应该在该方法中实现什么。

标签: java spring-boot redis spring-data-redis jedis


【解决方案1】:

有两种配置数据源的方法

  • 使用配置文件

    spring.datasource.url= jdbc:oracle:thin:@//localhost
    spring.datasource.username=test
    spring.datasource.password=test1234
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    #hibernate config dialect for JPA, choose dialect based on the db version
    spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
    

您可以在 DataSourceBuilder 的帮助下通过读取这些属性手动创建相同的文件

@Bean
public  DataSource dataSource(){
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("oracle.jdbc.OracleDriver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("test");
        dataSourceBuilder.password("test1234");
        return dataSourceBuilder.build();
}

【讨论】:

  • @Sonous21 我已经在我的 application.properties 文件中配置了这些属性。请参阅我原始帖子的更新部分。我在这里问的是 oracle 配置是如何涉及到这个 redis 配置的。我意思是在这种情况下我可以忽略dataSource bean的定义吗,因为正如我上面提到的,我已经在application.properties文件中实现了它。那么我也可以忽略transactionManger bean的实现吗。
  • 简而言之,我需要知道的是我可以忽略transactionManger bean和dataSource bean的实现。
  • 是的,您可以忽略 PlatformTransactionManager 的实现,因为您添加了 spring-boot-starter-jdbc 依赖项。 starter JDBC 将为您创建这个 bean。
  • @sonous21 非常感谢您的承诺。最后,我需要澄清一下在实现对 Transactional annotation 的支持以处理 Redis 中的事务时,根据我的应用程序,我需要做的是通过忽略 transactionManger bean 和 dataSource bean 来实现上述源代码。我是正确的?
  • 您似乎在 RDBMS 和 Redis 中混合了事务支持。 Redis 事务不同,NoSQL db 和 Redis 一样支持不同用途的事务。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2019-10-18
  • 2019-11-01
  • 2020-10-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多