TimesTen Note 3 – Cache Group简介

1. Cache Group简介

Cache group是一组在Timesten中缓存的Oracle数据库表。这些在Timesten中缓存的数据库表称为缓存表(cache table)。
Timesten数据库可以包含多个cache group,每个cache group包含一个或者多个缓存表。但是同一个Oracle数据库表不能同时被cache到同一TT数据库的多个cache group中。可以在TT中的缓存表中创建额外索引会提高查询速度(建立非唯一索引,否则影响和Oracle数据库中源表业务一致性)。
缓存表要求每一张表必须有主键或者唯一索引:
a).如果存在主键,则在对应的cache group中创建对应列的主键。例如:

例如:

b). 如果只存在唯一索引,则同样需要在对应的cache group中唯一索引对应的列中创建主键。

当cache group中包含多张表时,只能有一张根级父表存在。且子表不能有超过一个父表存在,但是父表可以被多个子表关联。

2. 初始化&创建cache grid

首先在sys.odbc.ini的对应数据库中添加OracleNetServiceName数据库参数。

然后在tt中创建cache group管理用户。

在对应的Oracle数据库完成初始化工作。初始化脚本在$TT_HOME/oraclescripts中。需要指定一个表空间(这里是users)和timesten使用的用户(这里是ttorauser)。ttorauser需要对cache group管理的表有读(非read-only要有写)的权限。

使用cache group管理用户登录timesten数据库,创建一个cache grid。

在Oracle端创建测试表

3. 创建Read-Only Cache Group

使用CREATE CACHE GROUP语句来创建一个cache group。cache group分为System-managed和User-managed两种,其中System-managed包括:
Read-only cache group:TT中的cache group只读,DML操作在Oracle数据库中进行。
Asynchronous writethrough (AWT) cache group:异步。DML操作先在TT中进行,提交返回,Cache Agent检查log buffer或transaction log file异步将DML操作在oracle中执行。
Synchronous writethrough (SWT) cache group同步。DML操作先在TT中进行,然后通过Cache Agent进程在oracle中提交,若此时出现错误,则TT中也会被rollback。效率低下,应用场景不多。
在Read-Only cache group中,TT里的缓存表只能进行查询,而对Oracle数据库源表中已提交的事务会自动更新到缓存表中。
虽然read-only cache group不能直接更新,可以设置passthrough级别到2来让对TT中缓存表的提交事务操作传递到Oracle数据库源表中,然后这些更新将会自动刷新到缓存表中。

关于read only,注意要注意几点:
(1). 在Oracle数据库源表上执行的TRUNCATE TABLE不会自动刷新到read only cache group中。
(2). 由于read only cache group不能直接更新,所以缓存表在创建时不能指定ON DELETE CASCADE(删除父表行同样删除外键关联的子表的对应行)。
(3). 不能指定主键索引为 HASH索引(即创建索引时指定UNIQUE HASH ON primary_column)
(4).只有当read only cache group为空或者dynamic时才可以 LOAD CACHE GROUP

AUTOREFRESH属性
a.自动将oracle中的更新刷新到tt中;
b.只适用于Read-only和User-managed cache groups;
c.Automatic refresh state可以为:on,off,paused(default)三个选项;
d.Automatic refresh mode可以为:full(全量),incremental(增量);
若mode=incremental,则TT会在oracle创建触发器、日志表、及其他临时对象。当dml操作发生时,触发器会将涉及到行的primary key记录进log表;cache agent进程周期性检查log表的primary key并与基表做join,将要cache进TT的数据刷新到TT。此种情况若要drop cache group,则需unload掉cache的数据,否则oracle中的log表会不断累积。
e.Automatic refresh interval可以设置自动刷新间隔时间(minutes, seconds,milliseconds);
f.autorefresh属性可以在create readonly cache group时指定,也可以通过alter cache group修改。
下面创建一缓存组customer_orders 来缓存customer(root table)和orders(child table)

通过cachegroups查看刚刚定义的cache group:

插入测试数据:

在timesten中我们可以看到更新已经刷新到缓存表中。

Reference:

http://docs.oracle.com/cd/E16655_01/timesten.121/e21634/operations.htm#TTCAC291

http://docs.oracle.com/cd/E16655_01/timesten.121/e21634/define.htm#TTCAC215

Posted in Database, NoSQL, Oracle.
    • 异步可更新的cg性能也是可以的,但是跨tt多个节点操作的可更新cg效果就差了。