使用Spring事务管理点亮事务缓存

时间:2017-10-26 09:30:24

标签: spring caching spring-transactions ignite

我正在探索Ignite事务缓存。我已经有一段代码,它使用JDBC的Spring事务管理。我想使用Spring缓存抽象在代码中集成点火事务缓存。

我遇到了SpringTransactionManager(由Ignite提供),但我无法找到正确的使用方法。基本上,我想做一些事情:

@Transactional
@Cacheable(cacheNames="personcache", key="#person.id", unless="#result == null")
public Person create(Person person) {
    String queryPerson = "insert into Person (id, name) values (?,?)";
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.update(queryPerson, new Object[] { person.getId(), person.getName() });
    System.out.println("Inserted into Person Table Successfully");
    return person;
}

当事务提交时,数据库和缓存应该一起提交。为此,Ignite文档提到了SpringTransactionManager https://www.gridgain.com/sdk/pe/latest/javadoc/org/apache/ignite/transactions/spring/SpringTransactionManager.html的使用。

我不确定如何将此事务管理器与Spring的DriverManagerDataSource一起插入https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html

有人可以指导我吗?一个例子会有很大帮助。 谢谢!

1 个答案:

答案 0 :(得分:2)

如果您向Spring提供SpringTransactionManager,它将围绕使用@Transactional注释的方法创建一个Ignite事务。首先,我相信在这种情况下甚至不会启动数据库事务。即使它确实如此,它也将独立于Ignite的那个。

我看到两个选项来解决这个问题:

  1. 使用JTA [1]配置Ignite并使用也会了解数据库事务的JtaTransactionManager
  2. 使用通过@Cacheable [2] [3]集成Ignite和DB,而不是CacheStore,并使用直写。在这种情况下,Ignite将负责事务一致性。
  3. [1] https://apacheignite.readme.io/docs/transactions#integration-with-jta

    [2] https://apacheignite.readme.io/docs/3rd-party-store

    [3] https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/datagrid/store/spring/CacheSpringStoreExample.java