package jef.orm.onetable;
import java.sql.SQLException;
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import jef.database.DbClient;
import jef.database.DebugUtil;
import jef.database.NativeQuery;
import jef.database.QB;
import jef.database.Transaction;
import jef.database.cache.Cache;
import jef.database.jmx.JefFacade;
import jef.database.query.Query;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.DatabaseInit;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import jef.orm.onetable.model.CaAsset;
import jef.tools.string.RandomData;
/**
* 测试一级缓存的命中和清洗等场景
*
* @author jiyi
*
*/
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name = "oracle", url = "${oracle.url}", user = "${oracle.user}", password = "${oracle.password}"),
@DataSource(name = "mysql", url = "${mysql.url}", user = "${mysql.user}", password = "${mysql.password}"),
@DataSource(name = "postgresql", url = "${postgresql.url}", user = "${postgresql.user}", password = "${postgresql.password}"),
@DataSource(name = "derby", url = "jdbc:derby:./db;create=true"),
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = ""),
@DataSource(name = "sqlite", url = "jdbc:sqlite:test.db?date_string_format=yyyy-MM-dd HH:mm:ss"),
@DataSource(name = "sqlserver", url = "${sqlserver.url}", user = "${sqlserver.user}", password = "${sqlserver.password}")
})
public class CacheTest extends org.junit.Assert {
private DbClient db;
@DatabaseInit
public void prepare() throws SQLException {
db.createTable(CaAsset.class);
JefFacade.getOrmConfig().setCacheDebug(true);
JefFacade.getOrmConfig().setCacheLevel1(true);
}
//@IgnoreOn(allButExcept = "sqlserver")
@Test
public void case1() throws SQLException {
Transaction session = db.startTransaction();
CaAsset ca = RandomData
.newInstance(jef.orm.onetable.model.CaAsset.class);
session.insert(ca);
Cache cache = DebugUtil.getCache(session);
{
long hit = cache.getHitCount();
CaAsset obj = session.load(ca);//2016-4-5,更改案例,目前插入时不存储缓存。
assertEquals(hit, cache.getHitCount());
}
{
long hit = cache.getHitCount();
CaAsset obj = session.load(ca);// 第二次查询,命中
assertEquals(hit + 1, cache.getHitCount());
}
CaAsset ca2 = RandomData
.newInstance(jef.orm.onetable.model.CaAsset.class);
{
session.insert(ca2);
CaAsset obj = session.load(ca2);//加载一次,使其缓存
//然后更新,使其失效
ca2.startUpdate();
ca2.setNormal("XAA");
ca2.setThedate(new Date());
session.update(ca2);
long miss = cache.getMissCount();
session.load(ca2);// 不命中
assertEquals(miss + 1, cache.getMissCount());
}
{
CaAsset q = new CaAsset();
q.setAcctId(ca.getAcctId());
long miss = cache.getMissCount();
CaAsset obj = session.load(q);// 维度变化,不会命中
assertEquals(miss + 1, cache.getMissCount());// 验证失效
}
{
CaAsset q = new CaAsset();
q.setAssetId(ca.getAssetId());
long hit = cache.getHitCount();
CaAsset obj = session.load(q);
assertEquals(hit + 1, cache.getHitCount());// 验证命中
}
{
NativeQuery<?> q = session
.createNativeQuery("update CA_ASSET set NORMAL = :normal, VALID_DATE = :vdate where ASSET_ID=:assetId");
q.setParameter("normal", "asasa");
q.setParameter("vdate", new Date());
q.setParameter("assetId", ca.getAcctId());
int count = q.executeUpdate();
assertEquals(0, count);// 缓存无变化
long hit = cache.getHitCount();
session.load(ca);
assertEquals(hit + 1, cache.getHitCount());// 验证命中,上个Update语句没有更新任何值,引起不会引起缓存变化
}
{
NativeQuery<?> q = session
.createNativeQuery("update CA_ASSET set NORMAL = :normal, VALID_DATE = :vdate where ASSET_ID=:assetId");
q.setParameter("normal", "asasa");
q.setParameter("vdate", new Date());
q.setParameter("assetId", ca.getAssetId());
int count = q.executeUpdate();
assertEquals(1, count);// 更新了一条记录
long hit = cache.getHitCount();
session.load(ca2);
assertEquals(hit + 1, cache.getHitCount());// 验证命中,update语句更新了一条记录,但不是这条记录,因此此缓存无变化
long miss = cache.getMissCount();
session.load(ca);
assertEquals(miss + 1, cache.getMissCount());// 验证不命中,update语句更新了这条记录,因此缓存被清洗
}
{
Query<CaAsset> q = QB.create(CaAsset.class);
q.getInstance().prepareUpdate(CaAsset.Field.assetType, 50);
session.update(q.getInstance());
// 该表上所有缓存失效
long miss = cache.getMissCount();
session.load(ca);
assertEquals(miss + 1, cache.getMissCount());// 验证失效
miss = cache.getMissCount();
session.load(ca2);
assertEquals(miss + 1, cache.getMissCount());// 验证失效
}
session.commit(true);
}
}