我正在尝试使用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一起工作?
是的,有一种方法可以达到你的目标。
>
因为您有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;
}
}
}
这对我来说是个问题,所以我用不同的方式实现了这个功能。检查“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;