当前位置: 首页 > 知识库问答 >
问题:

eh使用Spring@Transactional缓存本地事务

晏经武
2023-03-14

我正在尝试使用Spring@cacheable和@transactional来设置一个事务性的ehcache。

我的缓存与@cacheable一起工作很好,但一旦我将缓存设置为使用本地事务:

<cache name="currencyCodeMaps" maxElementsInMemory="100" overflowToDisk="false" timeToIdleSeconds="5" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" transactionalMode="local"/>
net.sf.ehcache.transaction.TransactionException: transaction not started
org.springframework.orm.jpa.JpaTransactionManager

但这将很难,因为我想要将ehcache事务与DB事务同步,而DB事务是由@Transactional控制的。

有没有办法让本地Ehcache事务与Spring@Transactional一起工作?

共有1个答案

弘靖琪
2023-03-14

是的,有一种方法可以达到你的目标。

>

  • 因为您有2个事务资源(JTA和Ehcache)并且不使用JTA,所以必须使用复合事务管理器,如来自spring-data项目的org.SpringFramework.Data.transaction.ChainedTransactionManager

    @Bean
    public PlatformTransactionManager transactionManager() {
        return new ChainedTransactionManager(ehcacheTransactionManager(), jpaTransactionManager());
    }
    
    @Bean
    public EhcacheTransactionManager ehcacheTransactionManager() {
        return new EhcacheTransactionManager(ehcacheManager().getTransactionController());
    }
    
    @Bean
    public PlatformTransactionManager jpaTransactionManager() {
        return new JpaTransactionManager(entityManagerFactory());
    }
    

    您需要指定默认情况下应使用哪个事务管理器:

    @Configuration
    public class Configuration implements TransactionManagementConfigurer {
    ...
        @Override
        public PlatformTransactionManager annotationDrivenTransactionManager() {
            return transactionManager();
        }
    ...
    }
    
    import net.sf.ehcache.TransactionController;
    import net.sf.ehcache.transaction.local.LocalTransactionContext;
    import org.springframework.transaction.TransactionDefinition;
    import org.springframework.transaction.TransactionException;
    import org.springframework.transaction.support.AbstractPlatformTransactionManager;
    import org.springframework.transaction.support.DefaultTransactionStatus;
    
        public class EhcacheTransactionManager extends AbstractPlatformTransactionManager {
    
        private TransactionController transactionController;
    
        public EhcacheTransactionManager(TransactionController transactionController) {
            this.transactionController = transactionController;
        }
    
        @Override
        protected Object doGetTransaction() throws TransactionException {
            return new EhcacheTransactionObject(transactionController.getCurrentTransactionContext());
        }
    
        @Override
        protected void doBegin(Object o, TransactionDefinition transactionDefinition) throws TransactionException {
            int timeout = transactionDefinition.getTimeout();
            if (timeout != TransactionDefinition.TIMEOUT_DEFAULT) {
                transactionController.begin(timeout);
            } else {
                transactionController.begin();
            }
        }
    
        @Override
        protected void doCommit(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
            transactionController.commit();
        }
    
        @Override
        protected void doRollback(DefaultTransactionStatus defaultTransactionStatus) throws TransactionException {
            transactionController.rollback();
        }
    
        public class EhcacheTransactionObject {
    
            private LocalTransactionContext currentTransactionContext;
    
            public EhcacheTransactionObject(LocalTransactionContext currentTransactionContext) {
                this.currentTransactionContext = currentTransactionContext;
            }
    
        }
    
    }
    
      null

    这对我来说是个问题,所以我用不同的方式实现了这个功能。检查“me.qnox.springframework.cache.tx.txawareCacheManagerProxy”,上面描述的问题已经解决,在同一个存储库中

  •  类似资料:
    • Serenity 提供一些缓存抽象和实用功能让你更容易地使用本地缓存。 术语 本地(local) 的意思是指在本地内存中缓存项目(因此没有涉及到序列化)。 当你的应用程序在网站群(web farm) 中部署时,本地缓存可能还不够或者有时合适。我们将在 分布式缓存 章节中讨论该场景。

    • 我被阻止了几天,因为Hibernate缓存在Spring上下文中使用@Transactional注释。 我尝试了在网上找到的所有解决方案,但没有成功。。。 唯一可行的解决方案是使用@Cacheable-Spring注释(来自Spring上下文支持),但我并不满意,因为我无法在实体上使用Hibernate@Cache注释@Cacheable只能用于服务方法之类的方法,我检索实体时不使用方法。。。 例

    • 我已经创建了一个Spring Boot应用程序,并在maven项目中实现了EhCache。我的EhCache的xml配置文件如下: 我已在参数timeToIdle秒中设置到期时间为300 但这对我不起作用。我没有使用任何配置bean来实现缓存。我使用@Cacheable注释来表示要在缓存中使用的方法。 为什么它没有被驱逐或清除?

    • 我正在探索Ignite事务性缓存。我已经有了一段代码,它对JDBC使用Spring事务管理。我想使用Spring缓存抽象在代码中集成ignite事务性缓存。 我遇到了SpringTransactionManager(由Ignite提供),但我无法找到正确的使用方法。本质上,我想做一些类似的事情: 当事务提交时,数据库和缓存应该一起提交。为此,Ignite文档提到了使用SpringTransacti

    • 问题内容: 我有一个Jenkins实例,该实例使用从requirements.txt中附带的PyPI包来构建我的项目。但是,与TravisCI构建一样,每次从头开始构建都非常耗时,并且意味着构建要花费> 4-5分钟,这比理想情况要慢得多。 我正在寻找的是一种在本地缓存下载的软件包的方法,因此,当启动具有相同依赖项的构建时,不必从PyPI获取它就可以在本地获取,而当版本发生更改时,它可以获取上游软件

    • 假设我们网站有一个使用多个查询生成的简介页面。我们有此页的模型,如 UserProfile 类,它包含用户所有简介数据,及一个获取指定用户 id 简介的 GetProfile 方法。 public class UserProfile { public string Name { get; set; } public List<CachedFriend> Friends { get;