下面介绍如何将Oracle的外部表Cache到TimesTen中。因为Oracle的外部表存在着许多的限制,所以相应的步骤会相对来说比较复杂些。
具体步骤如下:
1.创建相应的外部数据文件如下,并保存为data.txt
1,cn
2,us
3,au
4,jp
5,de
2.在Oracle数据库中:
/*在
oracle中创建指向物理地址的逻辑目录,且上面创建的数据文件
data.txt 也放在该目录下
*/
create directory data_dir as ‘/home/oracle’;
/*创建相应的用户,该用户将被用于后面的
cache connect试验
*/grant connect, resource, create any trigger to test;
/*赋予该用户读写目录的权限*/
grant read,write on directory data_dir to test;
/*创建外部表t1*/
create table t1(id int ,name varchar2(15))
organization external (
type oracle_loader default directory data_dir access parameters
(
records delimited by newline
badfile ‘data_bad’
logfile ‘data_log’
fields terminated by ‘,’
enclosed by ‘”‘
(id int,name char)
)
location (’data.txt’))
parallel 10 reject limit unlimited;
/*创建基于外部表的物化视图,为什么要这样做呢?因为cache connect 建立的时候,所应用的表必须有主键或者唯一性索引,而外部表恰恰不能建立任何的主键和索引,所以我们只能通过物化视图的方式来添加主键,即物化视图的 with primary key模式,而不是 with rowID 模式*/
create materialized view mv_t1 refresh with primary key as select * from t1;
3.在TimesTen中:
确定test用户已经在TimesTen中已经建立,且相关创建cache connect的设置已经配置好,且cache agent已经起来。
/*创建cache group,由于是基于物化视图的,所以只能是usermanaged的cache group,且只能是不带autorefresh,对底层的物化视图还必须指定为readonly*/
create usermanaged cache group readcache from mv_t1(id int primary key, name varchar2(15), readonly) where id<4;
/*从Oracle那边Load数据*/
load cache group readcache commit every 10 rows;
/*检查一下,确实相关的数据已经cache到TimesTen中了*/
Command> select * from mv_t1;
< 1, cn >
< 2, us >
< 3, au >
3 rows found.
注意:使用外部表由于牵涉到物化视图,所以导致TimesTen不能自动从Oracle那边刷新数据,如果外部表更新不是很频繁,那么可以通过reload的方式去手工刷新。