在TimesTen的Cache Group 有 ReadOnly, AWT,SWT 以及 UserManaged 几种类型。ReadOnly / AWT / SWT 三种类型的数据同步机制都是自动,也就是说在创建的时候就设置好了。但针对UserManaged来说,却有很多独特的特性功能,下面我们介绍一下Flush这个操作。
首先,Flush的使用有一些要注意的地方:
- 只能在UserManaged上使用
- 不能Flush Delete操作
- 不能Flush被定义为ReadOnly 或者Propagate 的表
如果要Flush的行已经在Oracle中数据库存在,则Flush的时候Update该行;如果要Flush的行在Oracle数据库中不存在,则Flush的时候Insert该行。
另外Flush的时候也可以带Where或者WithID子句来定义Flush的数据范围。
- 试验如下,首先在Oracle数据库中创建一个测试表,并插入一些记录:
SQL> desc tt;
Name Null? Type
—————————————– ——– —————————-
ID NOT NULL NUMBER(38)
NAME VARCHAR2(15)
SQL> select * from tt;
ID NAME
———- —————
1 china
2 us
3 haha
4 you
5 and
6 me
6 rows selected.
- 在TimesTen中创建UserManaged Cache Group:
Command> call ttcacheuidpwdset(’test’,'test’);
Command> call ttcachestart;
Command> create usermanaged cache group tt_ucg from tt(id tt_bigint primary key,name varchar2(15),not propagate);
Command> cachegroups;
Cache Group TEST.TT_UCG:
Cache Group Type: User Managed
Autorefresh: No
Root Table: TEST.TT
Table Type: Not Propagate
1 cache group found.
- 加载初始数据:
Command> load cache group tt_ucg commit every 10 rows;
6 cache instances affected.
Command> select * from tt;
< 1, china >
< 2, us >
< 3, haha >
< 4, you >
< 5, and >
< 6, me >
6 rows found.
- 在TimesTen中插入新的数据:
Command> insert into tt values(7,’just’);
1 row inserted.
Command> insert into tt values(8,’for’);
1 row inserted.
Command> insert into tt values(9,’testing’);
1 row inserted.
Command> commit;
这时候,新增的数据是不会提交到Oracle那边去的。
- Flush 数据:
Command> flush cache group tt_ucg;
9 cache instances affected.
Command>
- 再次到Oracle那边确认,可以看到数据已经过来了:
SQL> select * from tt;
ID NAME
———- —————
1 china
2 us
3 haha
4 you
5 and
6 me
7 just
8 for
9 testing
9 rows selected.
SQL>
可以看到,定义的时候必须在表之后定义 not propagate 才能使用Flush操作;另外每次Flush的时候都是同步全部的数据的。
- 我们再验证一下Delete的表现:
Command> select * from tt;
< 1, china >
< 2, us >
< 3, haha >
< 4, you >
< 5, and >
< 6, me >
< 7, just >
< 8, for >
< 9, testing >
9 rows found.
Command> delete from tt where id=2;
1 row deleted.
Command> commit;
Command> flush cache group tt_ucg;
8 cache instances affected.
Command>
- 在TimesTen中,一行数据确实被删除了,而且Flush的时候貌似也是只Flush 8 行数据,检查一下Oracle:
SQL> select * from tt;
ID NAME
———- —————
1 china
2 us
3 haha
4 you
5 and
6 me
7 just
8 for
9 testing
9 rows selected.
SQL>
发现还是 9 行数据,所以确实如文档所说,Delete操作不能被Flush过来。按照文档提示,Delete只能被手工提交到Oracle,或者打开propagate的开关同步到Oracle那边。由于打开propagate开关涉及到重建Cache Group,所以个人觉得实际中使用不大。
手工提交方式,我想一种就是在应用中直接连接到Oracle去做相应的Delete,另一种就是通过PassThrough的方式提交到Oracle那边,相对来说,个人觉得PassThrough要方便一些,如果Delete不是很多的话,PassThrough还是有很大优势的,但如果Delete很多的话,直接连接到Oracle去做Delete,性能上可能要好一些。
- 在TimesTen中设置PassThrough来删除一行记录:
Command> autocommit 0;
Command> passthrough 3;
Command> delete from tt where id=3;
1 row deleted.
Command> commit;
Command>
- 这时候再去Oracle确认,发现该行数据确实已经被Delete了:
SQL> select * from tt;
ID NAME
———- —————
1 china
2 us
4 you
5 and
6 me
7 just
8 for
9 testing
8 rows selected.
SQL>
总体来看,Flush操作在有些情况下还是很有好处的。在使用Cache Group的时候,由于TimesTen和Oracle性能上的差异,导致TimesTen那边做完的很多事务无法及时同步到Oracle,而累积在TimesTen的磁盘上,数据的自动同步过程不仅占用了TimesTen的一些宝贵资源,而且给Oracle数据库带来巨大的压力。那么针对实际中的很多应用,比如白天的时候业务繁忙,晚上很空闲,那么我们建立 UserManaged Cache Group ,而不是平常的 AWT / ReadOnly 。这时候因为没有数据的同步,性能会更高,到了空闲的时候,我们再Flush到Oracle那边,或者白天的时候,定时Flush。这样就避免了AWT 或者 Propagate的时候,总是不停地在那数据同步,从而节省了宝贵的资源。
文章 (RSS)