mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#2016 - L2 Cache - missing puts with explicit bean cache + findByIds/keys + after transaction writes
This commit is contained in:
@@ -313,4 +313,9 @@ public interface SpiTransaction extends Transaction {
|
||||
* Return true when nested transactions should create Savepoints.
|
||||
*/
|
||||
boolean isNestedUseSavepoint();
|
||||
|
||||
/**
|
||||
* Return true if explicitly set to skip cache (ignores skipOnWrite).
|
||||
*/
|
||||
boolean isSkipCacheExplicit();
|
||||
}
|
||||
|
||||
@@ -158,6 +158,11 @@ public abstract class SpiTransactionProxy implements SpiTransaction {
|
||||
transaction.setSkipCache(skipCache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCacheExplicit() {
|
||||
return transaction.isSkipCacheExplicit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCache() {
|
||||
return transaction.isSkipCache();
|
||||
|
||||
@@ -578,6 +578,10 @@ public final class OrmQueryRequest<T> extends BeanRequest implements SpiOrmQuery
|
||||
return cacheKey != null && query.getUseQueryCache().isPut();
|
||||
}
|
||||
|
||||
public boolean isBeanCachePutMany() {
|
||||
return !transaction.isSkipCacheExplicit() && query.isBeanCachePut();
|
||||
}
|
||||
|
||||
public boolean isBeanCachePut() {
|
||||
return !transaction.isSkipCache() && query.isBeanCachePut();
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine {
|
||||
|
||||
SpiQuery<T> query = request.getQuery();
|
||||
|
||||
if (request.isBeanCachePut()) {
|
||||
if (request.isBeanCachePutMany()) {
|
||||
// load the individual beans into the bean cache
|
||||
BeanDescriptor<T> descriptor = request.getBeanDescriptor();
|
||||
Collection<T> c = result.getActualDetails();
|
||||
|
||||
@@ -140,6 +140,11 @@ class ImplicitReadOnlyTransaction implements SpiTransaction, TxnProfileEventCode
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCacheExplicit() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSkipCache(boolean skipCache) {
|
||||
}
|
||||
|
||||
@@ -293,6 +293,11 @@ class JdbcTransaction implements SpiTransaction, TxnProfileEventCodes {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCacheExplicit() {
|
||||
return (skipCache != null && !skipCache);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCache() {
|
||||
if (skipCache != null) return skipCache;
|
||||
|
||||
@@ -200,6 +200,11 @@ class NoTransaction implements SpiTransaction {
|
||||
public void setSkipCache(boolean skipCache) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCacheExplicit() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSkipCache() {
|
||||
return false;
|
||||
|
||||
+40
-11
@@ -2,6 +2,7 @@ package org.tests.cache;
|
||||
|
||||
import io.ebean.BaseTestCase;
|
||||
import io.ebean.DB;
|
||||
import io.ebean.Transaction;
|
||||
import io.ebean.cache.ServerCache;
|
||||
import io.ebean.cache.ServerCacheStatistics;
|
||||
import org.ebeantest.LoggedSqlCollector;
|
||||
@@ -26,7 +27,7 @@ public class TestBeanCache extends BaseTestCase {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(TestBeanCache.class);
|
||||
|
||||
private ServerCache beanCache = DB.getDefault().getServerCacheManager().getBeanCache(OCachedBean.class);
|
||||
private final ServerCache beanCache = DB.getDefault().getServerCacheManager().getBeanCache(OCachedBean.class);
|
||||
|
||||
@Test
|
||||
public void findById_when_idTypeConverted() {
|
||||
@@ -53,10 +54,39 @@ public class TestBeanCache extends BaseTestCase {
|
||||
assertThat(sql).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void idsIn_explicitCache_expect_cachePut() {
|
||||
|
||||
List<OCachedBean> beans = createBeans(Arrays.asList("k0","k1"));
|
||||
List<Long> ids = beans.stream().map(OCachedBean::getId).collect(Collectors.toList());
|
||||
|
||||
beanCache.clear();
|
||||
beanCache.getStatistics(true);
|
||||
try (Transaction transaction = DB.beginTransaction()) {
|
||||
|
||||
// skipCacheAfterWrite set after this write ...
|
||||
final OCachedBean junk = createBean("junk");
|
||||
DB.save(junk);
|
||||
|
||||
List<OCachedBean> list = DB.find(OCachedBean.class)
|
||||
.where().idIn(ids)
|
||||
.setUseCache(true)
|
||||
.findList();
|
||||
|
||||
assertThat(list).hasSize(2);
|
||||
transaction.commit();
|
||||
}
|
||||
|
||||
ServerCacheStatistics statistics = beanCache.getStatistics(true);
|
||||
assertThat(statistics.getHitCount()).isEqualTo(0);
|
||||
assertThat(statistics.getMissCount()).isEqualTo(2);
|
||||
assertThat(statistics.getPutCount()).isEqualTo(2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void idsInExpression() {
|
||||
|
||||
List<OCachedBean> beans = createBeans();
|
||||
List<OCachedBean> beans = createBeans(Arrays.asList("z0", "z1", "z2"));
|
||||
List<Long> ids = beans.stream().map(OCachedBean::getId).collect(Collectors.toList());
|
||||
|
||||
beanCache.clear();
|
||||
@@ -133,22 +163,21 @@ public class TestBeanCache extends BaseTestCase {
|
||||
assertThat(statistics.getMissCount()).isEqualTo(missCount);
|
||||
}
|
||||
|
||||
private List<OCachedBean> createBeans() {
|
||||
|
||||
List<String> names = Arrays.asList("z0", "z1", "z2");
|
||||
|
||||
private List<OCachedBean> createBeans(List<String> names) {
|
||||
List<OCachedBean> beans = new ArrayList<>();
|
||||
for (String name : names) {
|
||||
OCachedBean bean = new OCachedBean();
|
||||
bean.setName(name);
|
||||
beans.add(bean);
|
||||
beans.add(createBean(name));
|
||||
}
|
||||
|
||||
DB.saveAll(beans);
|
||||
|
||||
return beans;
|
||||
}
|
||||
|
||||
private OCachedBean createBean(String name) {
|
||||
OCachedBean bean = new OCachedBean();
|
||||
bean.setName(name);
|
||||
return bean;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void find_whenNotExits() {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user