TimesTen内存数据库-第三章 定义缓存集合

这章将讨论不一样的缓存集合类型以及怎样进行定义。数据库

建立缓存集合定义

可使用CREATE CACHE GROUP语句来建立一个缓存集合定义,包括为每一个将被缓存的Oracle表分别定义缓存表。浏览器

表 3.1 显示一个简单缓存集合定义的组成。缓存集合定义的每一个部分将在下面部分讨论。缓存

表 3.1 缓存集合定义的组成服务器

组 成异步

CREATEtypeCACHE GROUP工具

owner.name编码

Cache group and tablespa

attributes.net

FROMtable definition代理

[WHERE ...]

[AGING ...]

也可使用Web浏览器经过Cache Administrator来建立缓存集合。

缓存集合命名

在CREATE CACHE GROUP语句中,缓存集合的名称标识使用以下形式:

owner.name

若是在缓存集合的名称中不指定owner,则ID或当前会话用户将做为owner。

选择缓存集合类型

缓存集合类型能够是系统管理用户管理系统管理缓存集合强制指定数据操做,而用户管理缓存集合的数据操做能够自定义。系统管理缓存集合包括:

• READONLY cache groups

• SYNCHRONOUS WRITETHROUGH (SWT) cache groups

• ASYNCHRONOUS WRITETHROUGH (AWT) cache groups

READONLY缓存集合

A READONLY缓存集合经过AUTOREFRESH机制进行强制缓存操做,将Oracle表中的更新应用到TimesTen。此缓存不能进行直接更新。

图 3.1 显示一个READONLY缓存集合

图3.1 READONLY缓存集合

clip_image022

使用CREATE READONLY CACHE GROUP语句来建立READONLY缓存集合。缺省的:

• AUTOREFRESH缓存集合属性被设置为INCREMENTAL模式。

• AUTOREFRESH INTERVAL值为5 MINUTES。

• AUTOREFRESH STATE为PAUSED。

可使用ALTER CACHE GROUP语句来改变任何AUTOREFRESH缓存集合属性的缺省设置或彻底阻止Oracle表中的更新应用到缓存中。

在建立READONLY缓存集合以前,经过使用ttCacheUidPwdSet内部程序来设置缓存管理用户ID和口令或使用带有-cacheUidPwdSet选项的ttAdmin工具。缓存管理用户将在Oracle上建立一个触发器,因此它必须拥有显示在表 4.1中关于CREATE READONLY CACHE GROUP的Oracle权限。

对于每一个数据存储,缓存管理用户ID和口令只需设置一次。若是数据存储被重写或破坏,则须要从新设置缓存管理用户ID和口令。

试图在READONLY缓存集合中更新缓存的表,将致使TimesTen错误8225 “Table is read only”。可是,若是PassThrough属性被设置为2或3,DML语句也能够经过缓存传递到Oracle,并经过AUTOREFRESH再从Oracle传回到缓存集合中。在READONLY缓存集合中的passed-through语句的效果不会在包含此语句的事务中产生。只有在此事务被提交到Oracle,而后在下一次缓存的AUTOREFRESH完成时才会体现。

使用READONLY缓存集合时的限制

当使用READONLY缓存集合时,有下列限制:

• READONLY缓存集合中的表不能直接更新。

• 缓存集合和其中的表可使用下列属性:

– AUTOREFRESH

– UNIQUE HASH ON

– ON DELETE CASCADE

• 不容许使用手动FLUSH操做。

• TRUNCATE TABLE语句不能自动刷新。

• 当使用LOAD CACHE GROUP语句时缓存集合必须为空。

• 当使用LOAD CACHE GROUP或REFRESH CACHE GROUP语句时,AUTOREFRESH STATE必须为PAUSED。

• WHERE子句中的全部字段(列和表)的引用必须彻底合法。例如:user.tableuser.table.column

• LOAD CACHE GROUP和REFRESH CACHE GROUP语句不能包含WHERE子句。

• 不能指定Least recently used (LRU)老化。

示例:建立READONLY缓存集合

此例建立一个包含customerordertab表的READONLY缓存集合,名为customer_orders

CREATE READONLY CACHE GROUP customer_orders

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid)),

user1.ordertab (orderid NUMBER NOT NULL,

custid INTEGER NOT NULL,

PRIMARY KEY (orderid),

FOREIGN KEY (custid) REFERENCES CUSTOMER(custid));

SYNCHRONOUS WRITETHROUGH (SWT)缓存集合

SYNCHRONOUS WRITETHROUGH (SWT)缓存集合将进行强制执行:把TimesTen中被更新的缓存数据传送到Oracle。当使用CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP语句建立SWT缓存集合时,在建立缓存集合以后,缓存集合中的内容必须手动从Oracle表加载。SWT缓存集合的内容能够在须要时进行手动加载、卸载或刷新。

对SWT缓存集合的更新将被同步提交。当应用提交一个事务时,在它提交到TimesTen以前先被提交到Oracle。应用将被锁定,而且表中的行也同进被锁定,直到事务完成到TimesTen的提交。

若是到Oracle的事务提交失败,则到TimesTen的事务提交必须被回滚。若是Oracle事务成功但TimesTen事务失败,则缓存集合的数据将与Oracle数据不一样步。若是产生这种状况,必须手动将缓存集合与Oracle重同步。这可能经过调用ttCachePropagateFlagSet程序先中止到Oracle的数据传递,而后从新应用此事务到TimesTen缓存集合。做为另外一选择,也能够从新从Oracle加载数据。

图 3.2 显示一个SYNCHRONOUS WRITETHROUGH缓存集合。

图3.2 SYNCHRONOUS WRITETHROUGH缓存集合

clip_image024

使用SWT缓存集合的限制

当使用SWT缓存集合时,有以下限期完成:

• 缓存集合和其中的表属性中,可使用UNIQUE HASH ON和ON DELETE CASCADE属性。

• 不容许使用手动FLUSH操做。

• 在此类型的缓存集合定义中不能显示使用WHERE子句。

• TRUNCATE TABLE语句不能应用到缓存集合的表中。

示例:建立SWT缓存集合

此示例为一单独Oracle表vendor建立一个SYNCHRONOUS WRITETHROUGH缓存集合,名为vendors。在缓存集合中的vendor表的更新将自动传送到Oracle。

CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP vendors

FROM

user1.vendor (vendor_id INTEGER NOT NULL,

vendor_name VARCHAR2(100) NOT NULL,

contact_name VARCHAR2(100) NOT NULL,

phone VARCHAR2(15),

street VARCHAR2(100),

city VARCHAR2(30),

state VARCHAR2(30),

zip VARCHAR2(10),

PRIMARY KEY(vendor_id));

ASYNCHRONOUS WRITETHROUGH (AWT)缓存集合

ASYNCHRONOUS WRITETHROUGH (AWT)缓存集合与SWT缓耻集合同样强制执行一样的操做:更新TimesTen中的缓存数据,并传送到Oracle。AWT缓存集合能够提供比SWT缓存集合理快的时间响应,由于TimesTen提交的产生与Oracle的提交不一样步。这就容许应用持续执行,而没必要等待Oracle事务的提交完成。并且也可在Oracle数据库关闭后更新AWT缓存集合。当Oracle数据库返回到操做时,此更新将被应用到Oracle数据库。

图 3.3 显示TimesTen缓存集合的更新被异步复制到Oracle。

图3.3 ASYNCHRONOUS WRITETHROUGH缓存集合

clip_image026

AWT缓存集合要求包含此缓存集合的数据存储的缓存代理和复制代理都要启动。缓存代理可能加载和刷新缓存内容。缓存代理没必要运行卸载此缓存。

AWT缓存集合经过CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP语句建立。

为了使用AWT缓存集合,必须有相应的Oracle权限,并在启动缓存代理和复制代理以前使用ttCacheUidPwdSet程序设置缓存管理用户ID和口令。

当使用AWT缓存集合时,提交到TimesTen和Oracle的事务是异步的。因此当更新提交到Oracle时,应用不必定可靠。

AWT缓存集合能保证什么

AWT缓存集合能够以下保证:

• 不会由于TimesTen和Oracle这间的通讯失败而丢失事务。

– 若是复制代理丢失到Oracle的链接,则在代理可能链接到Oracle以后,AWT将从新启动。

– 若是数据存储上的复制代理与缓存集合一块儿关闭,则代理将从备份从新开始并再次启动事务。

• 对于一个单独TimesTen数据存储被提交的事务被提交到Oracle的顺序与被提交到TimesTen的顺序相同。

• 若是到Oracle的事务失败,则失败将被报告在dataStoreName.awterr错误文件中。

AWT缓存集合不能保证什么

AWT缓存集合不能保证:

• 全部在TimesTen中执行的事务都将被应用到Oracle。Oracle上执行错误将引发整个事务被回滚。例如,可能由于违反惟一约束而引发Oracle上的插入失败。产生执行错误的事务将不会再试。

• 要绝对保证Oracle的更新顺序,由于AWT不能解决更新冲突。这儿有一些例子:

– 一行首先被更新到一个AWT表并被提交。而后一些被更新的行经过Oracle传送操做并提交。AWT代理最后应用到此行的第一次更新并从新覆盖传送操做。

– 在两个独立的数据存储中(DS1, DS2),都有一个拥有相同Oracle基表的AWT表。一行在DS1中被更新并提交。一行在DS2中被更新并提交。由于缓存集合的动做是异步的,DS2中的更新也许先于DS1中的更新应用到Oracle数据库,结果是DS1中的更新覆盖DS2中的更新。

使用AWT缓存集合的限制

关于SWT缓存集合的限制讨论也适用于AWT缓存集合:

• 缓存集合和表的属性可使用UNIQUE HASH ON和ON DELETE CASCADE属性。

• 不容许使用手动FLUSH操做。

• WHERE子句不能出如今此类型的缓存集合的表定义中。

• TRUNCATE TABLE语句不能应用于缓存集合的表中。

• AWT缓存表中的VARCHAR二、NVARCHAR二、VARBINARY和TT_VARCHAR列必须限制为256K字节。

下面是只对AWT缓存集合适用的另外限制:

• 在AWT缓存集合中数据存储路径名的最大长度不能超过248字符。

• 在传送更新到Oracle的过程当中产生的错误和警告,将记录在一个特殊的错误文件中,而且在提交到TimesTen之后均可以一直报告。

• AWT缓存集合不容许使用在日志被关闭的数据存储中(Logging=0)。

• 在建立或删除AWT缓存集合以前,必须中止复制代理。

• 在复制代理启动以前,更新将不会从TimesTen传送到Oracle。

• 在Oracle上的更新冲突将不会被发觉并解决。当从TimesTen传送更新时将覆盖直接到Oracle基表的更新。

• 与单一条相关的SQL语句的约束检查将当即进行。例如,假设在一个AWT表中有一个惟一索引integer字段。有10条记录,而且此字段的值的范围是从1到10。发布一条增长此字段的更新语句。此语句在TimesTen中成功,但当应用到Oracle时极可能失败。缘由就是TimesTen在语句结束以后检查此惟一索引约束,但当更新应用到Oracle时,此约束是在每一行都被更新以后进行检查。因此当值为1的记录被设置为2时,它将与此字段已经为2的其它行发生冲突。

• 在一个返回twosafe服务的复制计划中不能包含AWT缓存集合。

示例:建立一个AWT缓存集合

此示例为一单独表customer建立一个ASYNCHRONOUS WRITETHROUGH缓存集合,名为customers

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

PRIMARY KEY(custid));

为AWT建立Oracle对象

TimesTen须要在Oracle中建立一个状态表来支持AWT。此表用来跟踪状态和最近应用到Oracle的事务。此表由CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP语句自动建立。做为选择,也能够在建立AWT缓存集合以前,手工建立此Oracle表。

设置AWT缓存集合

当设置AWT缓存集合时,执行下列任务:

1. 设置缓存管理用户ID和口令。

经过使用ttCacheUidPwdSet内部程序或使用带有-cacheUidPwdSet选项的ttAdmin工具来设置缓存管理用户ID和口令。

缓存管理用户将应用更新到Oracle。因此缓存管理用户账号必须拥有相应的Oracle权限。

对于每一个数据存储,缓存管理用户ID和口令只需设置一次。若是数据存储被覆盖或被破坏,则必须从新设置缓存管理用户ID和口令。

2. 建立AWT缓存集合。

使用CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP SQL语句。

3. 启动缓存代理。

4. 启动复制代理。

建立AWT缓存集合时将自动建立复制计划以容许数据存储与Oracle数据库进行通讯。此复制计划彻底由TimesTen管理,并不须要用户干涉。当使用DROP CACHE GROUP来删除AWT缓存集合时,此复制计划也将被删除。

在加载缓存集合以前,没必要启动复制代理,可是若是复制代理已经首先启动,最好让它执行完毕。

5. 加载缓存集合。

使用LOAD CACHE GROUP语句。

USERMANAGED缓存集合

若是系统管理缓存集合(READONLY、AWT和SWT)不适合工做须要,可使用CREATE USERMANAGED CACHE GROUP语句来建立缓存集合以实现自定义缓存操做:

• 能够经过设置AUTOREFRESH和PROPAGATE属性来定义USERMANAGED缓存集合在Oracle和TimesTen之间进行自动刷新和传送更新。两个属性同时设置以激活双向传送,这样就能够在二者之间经过互相传送便可以更新TimesTen,又可更新Oracle。

• 可使用SQL语句来控制Oracle和TimesTen之间的数据传送。例如,能够:

– 在应用中使用FLUSH CACHE GROUP SQL语句来将TimesTen缓存集合中的更新发送至Oracle。

– 使用LOAD CACHE GROUP或REFRESH CACHE GROUP语句来将Oracle中的更新加载或刷新到TimesTen缓存中。

• 可能经过使用UNLOAD CACHE GROUP语句从用户管理缓存集合中删除全部数据或选择的数据。

• 能够在用户管理缓存集合中为每一个表指定PROPAGATE或READONLY属性,以在表级上定义可写或只读操做。

示例:建立USERMANAGED缓存集合

这部分显示使用EATE USERMANAGED CACHE GROUP语句建立自定义缓存集合的一些示例。

例 3.1此例为一单独表customer建立一个USERMANAGED缓存集合,名为update_anywhere_customerscustomer表中的更新经过“双向”彼此传送来更新TimesTen或Oracle。图 3.4 显示update_anywhere_customersUSERMANAGED缓存集合。

图3.4简单USERMANAGED缓存集合

clip_image028

在此例中,设置了AUTOREFRESH属性,以使此缓存集合能够每隔30秒从Oracle进行增量更新。用户是user1。表中描述的PROPAGATE属性显示TimesTen缓存中的customer表的更新将被传送到Oracle:

CREATE USERMANAGED CACHE GROUP update_anywhere_customers

AUTOREFRESH

MODE INCREMENTAL

INTERVAL 30 SECONDS

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

PRIMARY KEY(custid),

PROPAGATE);

例 3.2此例建立一个USERMANAGED缓存集合,名为western_customers,包含四个相关联的表:customerordertaborder_detailscust_interest。图 3.5 显示此缓存集合和它的表。

图3.5复杂USERMANAGED缓存集合

clip_image030

western_customers缓存集合中的每一个表都有一个主键。缓存集合中的表经过关联的外键相互链接。customer表为根表,因此在缓存集合它不能引用其它表。根表包含一条WHERE子句以限制缓存中表的行数。

指定了PROPAGATE属性,以使缓存中表的任何变化在提交时将被自动传送到相应的Oracle表。

CREATE USERMANAGED CACHE GROUP western_customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR2(100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid),

PROPAGATE)

WHERE (customer.region = 'Western'),

user1.ordertab(orderid NUMBER NOT NULL,

custid INTEGER NOT NULL,

PRIMARY KEY (orderid),

FOREIGN KEY (custid) REFERENCES customer(custid),

PROPAGATE),

user1.order_details(orderid NUMBER NOT NULL,

itemit NUMBER NOT NULL,

quantity NUMBER NOT NULL,

PRIMARY KEY (orderid, itemid),

FOREIGN KEY (orderid) REFERENCES ordertab(orderid),

PROPAGATE),

user1.cust_interest(custid INTEGER NOT NULL,

interest VARCHAR2(10) NOT NULL,

PRIMARY KEY (custid, interest),

FOREIGN KEY (custid) REFERENCES customer(custid),

PROPAGATE);

定义缓存集合和表属性

下表总结可用于CREATE CACHE GROUP语句的属性。

表 3.2 总结AUTOREFRESH缓存集合属性。

表 3.3 列出了可应用于缓存集合中单个表定义的属性。

表 3.2 完整缓存集合的属性

缓存集合属性

描述

AUTOREFRESH

将Oracle表中产生的更新变化自动应用到TimesTen缓存。此属性能够在READONLY和USERMANAGED缓存集合中设置。

表 3.3 缓存集合中表的属性

缓存表属性

描述

UNIQUE HASH ON

为被建立的表指定一个哈希索引。能够为任何类型缓存集合中的表进行设置。

PROPAGATE

在提交时自动地将缓存表中的更新传送到相应的Oracle表。只能为USERMANAGED缓存类型中的表进行设置。

READONLY

指定缓存集合中的表不能更新到TimesTen。只能为USERMANAGED缓存集合中的表进行设置。

ON DELETE CASCADE

指定当包含被引用键的值从父表中删除时,子表中依靠外键链接的行也要被删除。能够为任何类型的缓存集合中的表进行设置。限制:

• 使用PROPAGATE属性的缓存集合表。

• SWT和AWT缓存集合表。

AUTOREFRESH缓存集合属性

AUTOREFRESH属性是READONLY和USERMANAGED缓存集合的一个选项属性。

AUTOREFRESH自动将Oracle表中的变化应用到TimesTen缓存。

TimesTen支持两种AUTOREFRESH模式:

• FULL:经过卸载内容而后再从Oracle表从新加载来刷新整个缓存集合。

• INCREMENTAL:Oracle跟踪更新状况并周期性地只更新Oracle中已经变化行到缓存集合中。此模式将使用Oracle中的专用对象来跟踪变化状况。

缺省值:

• AUTOREFRESH MODE了为 INCREMENTAL。

• AUTOREFRESH STATE 为 PAUSED。

• AUTOREFRESH INTERVAL 值为5 MINUTES。

缓存集合使用相同的自动刷新间隔在相同的时间被刷新。

AUTOREFRESH 以 INCREMENTAL模式对于Oracle中的每一个更新将产生一些额外的花销来刷新缓存集合。而使用AUTOREFRESH 和 FULL模式时则没有额外的花销。

在使用AUTOREFRESH属性建立缓存集合以前,要使用ttCacheUidPwdSet内部程序或带有-cacheUidPwdSet选项的ttAdmin工具来设置缓存管理用户ID和口令。缓存管理用户将在Oracle上建立一触发器,因此它必须拥有使用AUTOREFRESH属性的READONLY缓存集合和USERMANAGED缓存集合相应的Oracle权限。

对于每一个数据存储,缓存管理用户ID和口令只须要设置一次。若是数据存储被覆盖或破坏,则必须从新设置缓存管理用户ID和口令。

指定AUTOREFRESH缓存集合属性

当使用CREATE CACHE GROUP语句建立缓存集合时,能够指定AUTOREFRESH。在建立缓存集合以后,可使用ALTER CACHE GROUP来改变MODE、STATE和INTERVAL的设置。ALTER CACHE GROUP语句不能用于没有使用AUTOREFRESH 属性建立的缓存集合。

AUTOREFRESH产生的频率将取决于INTERVAL值。可使用CREATE CACHE GROUP 或ALTER CACHE GROUP语句来设置AUTOREFRESH STATE为ON、OFF或PAUSED。当提交STATE设置为ON的事务时,AUTOREFRESH将由TimesTen管理。

当STATE被设置为OFF时,到Oracle表的更新将不会被捕获或记录。当状态为PAUSED时,Oracle表中的更新将被捕获并记录在Oracle中,但不会应用到TimesTen缓存集合的表中。

当一个AUTOREFRESH操做在处理中,而且试图将STATE改变为OFF或删除缓存集合时:

• 若是LockWait普通链接属性大于0,则AUTOREFRESH操做将中止。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF 和 DROP CACHE GROUP 语句将优先于AUTOREFRESH操做。

• 若是LockWait普通链接属性为0,则AUTOREFRESH操做将继续。ALTER CACHE GROUP SET AUTOREFRESH STATE OFF 和 DROP CACHE GROUP 语句将失败,并产生一个锁定终止错误。

当以INCREMENTAL模式使用AUTOREFRESH时,在Oracle中发生的变化将在change log table中进行维护。在肯定的环境下,在应用到TimesTen缓存集合以前,事务中的一些记录可能将从更新日志表中被清除。若是发生这种状况,Cache Connect to Oracle启动缓存集合的彻底自动更新。

使用AUTOREFRESH的限制

当使用AUTOREFRESH时有以下限制:

• 若是在Oracle基表上使用了TRUNCATE TABLE语句,则增量AUTOREFRESH将不会工做。若是Oracle基表上使用了TRUNCATE,则必须从新设置AUTOREFRESH。使用ALTER CACHE GROUP语句来将AUTOREFRESH STATE设置为PAUSED,而后手工刷新缓存集合。再发送另外一条ALTER CACHE GROUP来将AUTOREFRESH STATE从新设置为ON。

• 为了使用AUTOREFRESH特性,缓存集合中的全部表必须指定为PROPAGATE或READONLY。不能使用NOT PROPAGATE属性指定AUTOREFRESH。

• 当手工加载或刷新缓存集合时,AUTOREFRESH STATE必须为PAUSED。

• 当使用LOAD CACHE GROUP语句时,缓存集合必须为空。

• WHERE 子句中引用的全部字段(列和表)必须彻底合法。例如:user.tableuser.table.column

• 对于AUTOREFRESH的缓存集合的LOAD CACHE GROUP和REFRESH CACHE GROUP语句不能包含WHERE子句。

• 不能在AUTOREFRESH缓存集合中实现LRU老化。

缓存表属性

这部分包括下列缓存表属性:

• PROPAGATE

• READONLY

• ON DELETE CASCADE

• UNIQUE HASH ON

PROPAGATE

PROPAGATE属性只能为USERMANAGED缓存集合中的表进行指定。可是,这里讨论的传送操做与同步写(SWT)缓存集合类似。

PROPAGATE指定在提交时TimesTen缓存集合中表的任何变化将被自动传送到相应的Oracle表。NOT PROPAGATE将取传送能力。

若是缓存表使用PROPAGATE属性定义,到缓存表中的更新在TimesTen提交过程当中将被传送回Oracle。是以同步的方式:

1. 提交首先尝试到Oracle。若是向Oracle提交失败,则不会再向TimesTen提交,而且TimesTen事务被做上须要回滚的标记。这种方式,Oracle数据库不会遗失数据更新。

2. 若是向Oracle提交成功,将尝试向TimesTen提交。若是向TimesTen提交失败,将收到一条说明失败缘由的TimesTen错误信息。

用户的操做经过链接到Oracle的应用进行提交。对于用户的登陆和口令必须指定在DSN中或到TimesTen的链接串中的UIDOraclePWD属性中。

关于传送提交到Oracle,必需知足下列要求:

• 被缓存在TimesTen中的Oracle表的列必须包括此Oracle表中至少一个惟一键或主键中的全部列。组成惟一键或主键的列在Oracle必须为非NULL值的列,而且在TimesTen缓存集合中它们必须申明为主键。

这个要求的目的就是要确保在TimesTen中被更新的行之间和Oracle中原来的数据保持一对一的映射关系。肯定此一对一的映射,就不会担忧应用的更新会受到非缓存行的影响。

• 表的缓存版本必须有一个主键申明。

缺省地,缓存表使用NOT PROPAGATE属性被建立,以使表中的更新不会传送到Oracle。当PROPAGATE被激活时,应用有时候偶尔须要更新缓存表,但不向Oracle提交。使用ttCachePropagateFlagSet内部程序来取消它,而后从新激活传送。

当传送被取消时,可使用FLUSH CACHE GROUP语句来选择传送插入并更新到Oracle。

当使用PROPAGATE时有以下限制:

• 若是使用PROPAGATE,它必须为缓存集合中的全部表进行指定。

• 在同一个缓存集合中,不能同时使用PROPAGATE和READONLY缓存表。

• TimesTen不会检查冲突以防止覆盖多个当前到Oracle更新的操做。基于这个缘由,更新将分别在TimesTen缓存或Oracle中进行,但不是同时。

• 若是缓存集合的AUTOREFRESH被激活或在AUTOREFRESH缓存集合的拷贝中,不能为表设置NOT PROPAGATE。

• 在缓存集合被指定为PROPAGATE以后,就不能再改变此属性。

注意:对于表使用PROPAGATE属性的缓存集合,TimesTen将不会检查向表的插入和更新是否与定义缓存集合时的WHERE子句有无约束。所以不会阻止插入和更新,而且将传送到Oracle。

READONLY

READONLY表属性只能为USERMANAGED缓存集合中的表进行指定。

注意:不要混淆READONLY表属性和READONLY缓存集合类型。READONLY缓存集合类型包含只读表,但READONLY表只能显示地为USERMANAGED缓存集合指定。

能够为每一个缓存集合表指定READONLY表属性,以禁止TimesTen应用更新这些表。

下面是使用READONLY表属性时的限制:

• 若是使用READONLY,它必须为缓存集合中的全部表进行指定。

• 不能与PROPAGATE表属性一块儿指定READONLY表属性。

ON DELETE CASCADE

当建立缓存集合时,ON DELETE CASCADE表属性能够为全部缓存集合类型的表进行指定。也能够为不在缓存集合中后进行指定。

ON DELETE CASCADE表属性指定当从父表中删除包含引用键值的行时,经过外键相关联的子表中插也将被删除。根表是缓存集合中全部其它表的父表。

全部从父表到子表的方式必须是要么是“删除”或要么是“不删除”。不能父表到子表一些是删除,而另外一些是不删除。对于子表的删除方式是指定ON DELETE CASCADE。

下面是使用ON DELETE CASCADE的限制:

• 对于AWT和SWT缓存集合和使用PROPAGATE属性的缓存集合表,有ON DELETE CASCADE属性的TimesTen表的外键必须是Oracle中有ON DELETE CASCADE属性的表中的外键相的相应的一个子集。在Oracle表上的ON DELETE CASCADE动做应用到TimesTen时将做为单独的删除动做。TimesTen中的ON DELETE CASCADE动做应用到Oracle时将做为一个级联操做。

• TimesTen和Oracle之间的外键匹配只是在建立缓存集合时强制进行。若是Oracle上的外键后来进行过修改,ON DELETE CASCADE将不会正常的工做。

UNIQUE HASH ON

UNIQUE HASH ON属性能够为全部缓存集合类型中的表进行指定。也能够为不在缓存集合中的表进行指定。

UNIQUE HASH ON指定在缓存集合中的一个表上建立一个哈希索引。指定在哈希索引中的列必须一样是主键中的列。

定义缓存集合表

绝大多数缓存集合的基本类型是在TimesTen中缓存一个单一的Oracle表。在一个缓存集合中缓存多个表复杂的多,并要求理解另外的Cache Connect to Oracle概念。

一般状况下,每一个被缓存的Oracle表至少有一个主键或非空值的惟一索引。另外,在TimesTen缓存集合表中定义的主键和惟一索引将与那些Oracle表中的相匹配。例如,若是Oracle表有主键或惟一索引列C1C2C3,则相应的TimesTen缓存表中的主键也应该有列C1C2C3

能够为TimesTen缓存表建立任意多个非惟一索引。增长缓存表的索引将提升一样查询非缓存TimesTen表的SQL速度。不要建立与Oracle表不匹配惟一索引,由于将起惟一约束失败。

注意:Oracle临时表不能被缓存。

定义一单一的缓存集合表

以下建立一个简单缓存集合定义来缓存一单一表:

CREATETYPECACHE GROUPowner.name

FROM

owner.root_table(column_list,

PRIMARY KEY(primary_key_column_list));

说明:

owner.root_table是Oracle表或一个Oracle表私有同义词的拥有者和表名。

column_list是一个被缓存的表的列清单和它们的数据类型。

primary_key_column_list是一个组成主键的列的清单。

当为列选择数据类型时,要考虑Oracle列中的数据类型并为缓存集合中的表选择相应的数据类型映射。

例 3.3图 3.6 显示一个单表READONLY缓存集合,名为target_customers,缓存Oracle表customer。TimesTen缓存集合中的数据是一个更大的存储在Oracle数据中全部用户数据集的子集。

图3.6在TimesTen中缓存单个Oracle表

clip_image032

使用CREATE READONLY CACHE GROUP语句来建立单表缓存集合target_customers

CREATE READONLY CACHE GROUP target_customers

FROM

user1.customer (cust_num NUMBER NOT NULL PRIMARY KEY,

region VARCHAR2(5) NOT NULL,

name VARCHAR2(80),

address VARCHAR2(255) NOT NULL);

定义多个缓存集合表

若是多个Oracle表被缓存在同一个缓存集合中,必须定义一个根表和多个子表。在一个缓存集合中只能有一个根表。

在有多表的缓存集合中,缓存集合中的每一个子表必须经过外键约束与缓存集合中的根表或另外一个子表相关联。尽管在TimesTen中缓存集合中的表必须经过外键约束关联,但在Oracle实例中,这些表不必定要关联起来。缓存集合中的根表不能经过外键约束引用缓存集合中另外的任何表。缓存集合中另外全部表都是子表。

每一个表的定义必须包含一个主键。每一个子表也必须包括一个引用到它父表主键的外键。缓存集合中表层次能够指定子表到父表或其它子表,但缓存集合中的表不能是一个在此缓存集合中有多个父表的子表。参阅图 3.7 关于一个正确缓存集合表配置的示例。图 3.8 显示一个不正确的表配置,图 3.9 显示如何工做来解决问题。

必须在缓存集合中为每一个将被包括在缓存中的Oracle表建立单独的表定义。定义在缓存集合中的表的全部者和名称必须与Oracle表的全部者和名称相匹配。能够建立一个表定义来缓存Oracle表中列的全部数据或它的一个子集。

注意:每一个Oracle表能够只被定义在一个缓存集合中。不能建立多个缓存集合来缓存相同的Oracle表。

例 3.4建立一简单缓存集合定义来缓存一个根表和一个子表以下:

CREATETYPECACHE GROUPowner.name

FROM

owner.root_table(column_list,

PRIMARY KEY(primary_key_column_list)),

owner.child_table(column_list,

PRIMARY KEY(primary_key_column_list),

FOREIGN KEY(reference_column_list)

REFERENCESowner.root_table(primary_key_column_list));

说明:

owner.root_table是Oracle表或Oracle表的私有同义词的全部者和表名。

owner.child_table是Oracle表或Oracle表的私有同义词的全部者和表名。

column_list是一个被缓存表中的列清单。

primary_key_column_list是一个组成主键的列的清单。

reference_column_list是一个child_table中引用一个外键的列的清单。

图 3.7 显示先前显示在图 3.6中的target_customers缓存集合的多表版本。

图3.7多表缓存集合

clip_image034

在此例中,缓存集合被扩展到缓存三个Oracle表:customerordersorder_item。缓存集合中的数据是一个更大的存储在Oracle数据库中全部用户数据集的一个子集。target_customers缓存集合中的每一个父表有一个主键(显示为粗体),经过一个相关的外键(显示为箭头)被子表引用。表customer是根表,它不能缓存集合中任何另外的表。customer表的主键是对于target_customers缓存集合的主键。ordersorder_item表是子表。

例 3.5使用CREATE READONLY CACHE GROUP语句来建立target_customers多表缓存集合:

CREATE READONLY CACHE GROUP target_customers

FROM

user1.customer (cust_num NUMBER NOT NULL PRIMARY KEY,

region VARCHAR2(10) NOT NULL,

name VARCHAR2(80),

address VARCHAR2(255) NOT NULL),

user1.orders (ord_num NUMBER NOT NULL PRIMARY KEY,

cust_num NUMBER NOT NULL,

when_placed TIMESTAMP NOT NULL,

when_shipped TIMESTAMP,

FOREIGN KEY (cust_num) REFERENCES user1.customer (cust_num)),

user1.order_item (ord_num NUMBER NOT NULL,

prod_num NUMBER NOT NULL,

quantity NUMBER NOT NULL,

PRIMARY KEY (ord_num, prod_num),

FOREIGN KEY (ord_num) REFERENCES user1.orders (ord_num));

图igure 3.8 显示缓存集合中不正确的表配置。

图3.8问题:两个根表

clip_image036

不能在拥有customerordersorder_item表的同一个缓存集合中定义productsinventory表。这是由于products表没有引用(直接或间接)到根表customer的外键。这就意谓着products表也被认为是一个根表,由于一个缓存集合不能同时拥有多个根表,所以无效。

为了缓存全部表,能够为productsinventory表建立第二个缓存集合,如图 3.9所示。

图3.9解决:两个独立的缓存集合

clip_image038

缓存Oracle分区表

当缓存常规Oracle表时,能够在缓存集合中根据规则规定定义Oracle分区表。例如,在只读缓存集合中的分区表在Oracle中必须有一个相应的惟一非NULL值索引。用于缓存集合的分区表能够是任何样式(哈希、列表、排列或合成)的分区或子分区表。

下面是缓存Oracle分区表时的限制:

• 除非有数据丢失,在分区上的DDL操做不会影响缓存集合。例如,若是一个分区的数据被截短,AUTOREFRESH不会从相应的缓存表中删除数据。

• 缓存集合中的WHERE子句操做不引用单独的分区或子分区。例如,试图定义下列分区表user1.partitioned_table,将返回一个错误:

CREATE READONLY CACHE GROUP badcachegroup

FROM

user1.partitioned_table(ii NUMBER NOT NULL PRIMARY KEY, jj NUMBER)

WHERE ii IN (SELECT ii

FROM user1.partitioned_table PARTITION(F200402));

注意:在离线分区上试图缓存操做(如LOAD CACHE GROUP、UNLOAD

CACHE GROUP或REFRESH CACHE GROUP)将致使ORA-00376或ORA-01110错误。可是,若是分区将离线(如在一个备份操做期间),则不会产生错误,除非这时试图访问分区。

关于Oracle同义词

一个定义在缓存集合中的表能够引用Oracle其表的私有的Oracle同义词。实际的Oracle基表能够存在于另外一个Oracle账号中,并有一个不一样的名称,但做为同义词它必须驻留在同一个Oracle服务器上。缓存集合中的表名必须是私有同义词名称,但同义词能够指向另外一个公有或私有的同义词。同义词最终必须指向(直接或间接)一个表、分区表或物化视图。

包含为Oracle同义词的表定义的缓存集合能够是一个USERMANAGED、SWT或AWT缓存集合。USERMANAGED缓存集合支持LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP 操做,但不能使用AUTOREFRESH或READONLY属性配置此缓存集合。不能在READONLY缓存集合中为Oracle同义词定义表。

使用WHERE子句

在使用CREATE CACHE GROUP语句为用户管理和READONLY缓存集合中的表的定义能够包含一条WHERE子句来指定搜索条件来将Oracle数据拷贝到缓存中。

另外,能够在LOAD CACHE GROUP、UNLOAD CACHE GROUP、MERGE和FLUSH CACHE GROUP语句中指定WHERE子句。一些语句,如LOAD CACHE GROUP和REFRESH CACHE GROUP,将致使链接的WHERE子句中缓存集合中的WHERE子句将先于语句中的WHERE进行计算。全部的WHERE子句将经过TimesTen解析。不要使用TimesTen不支持的Oracle SQL语法。

例 3.6此例建立一个名为western_customers的缓存集合,指定一条WHERE子句来从Oracle表customer中只缓存那些西部地区中有邮政编码的用户的相关数据:

CREATE USERMANAGED CACHE GROUP western_customers

FROM

user1.customer (custid INTEGER NOT NULL,

name VARCHAR(2100) NOT NULL,

addr VARCHAR2(100),

zip VARCHAR2(10),

region VARCHAR2(10),

PRIMARY KEY(custid),PROPAGATE)

WHERE (user1.customer.region = 'Western');

而后在LOAD CACHE GROUP语句中指定另一条WHERE子句来只缓存来自西部地区的ID小于或等于100的用户:

LOAD CACHE GROUP western_customers WHERE (custid <= 100)

COMMIT EVERY 256 ROWS;

CREATE CACHE GROUP和LOAD CACHE GROUP 语句中的WHERE子句,在数据被加载到缓存集合以前,在Oracle上进行计算。

表 3.4 显示LOAD CACHE GROUP, UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP语句的WHERE子句是否在TimesTen、Oracle或二者上都要计算。若是CREATE CACHE GROUP语句也包含一条WHERE子句,此表显示在Oracle上计算的另外的WHERE子句。

表 3.4 WHERE子句的计算

SQL语句

语句的WHERE子句的计算处...

CREATE CACHE

GROUP WHERE子句计算处...

LOAD

Oracle

Oracle

UNLOAD

TimesTen

-

REFRESH

TimesTen和Oracle

Oracle

FLUSH

TimesTen

-

表 3.5 显示对每一条SQL语句的WHERE子句是否只由TimesTen或同时由TimesTen和Oracle解析。

表 3.5 WHERE子句解析

SQL语句

由TimesTen解析

由Oracle解析

LOAD

Yes

Yes

UNLOAD

Yes

No

REFRESH

Yes

Yes

FLUSH

Yes

No

CREATE

Yes

Yes

与详细日志一块儿,全部面对Oracle执行的SQL语句将记录在Oracle服务器日志中。查看此日志以更好的理解缓存集合操做的机制和执行。

下面是Cache Connect to Oracle使用WHERE子句的限制:

• CREATE CACHE GROUP语句中的WHERE子句不能指定子查询,因此它们不能引用任何当前的其它表。LOAD CACHE GROUP, UNLOAD CACHE GROUP、REFRESH CACHE GROUP和FLUSH CACHE GROUP语句中的WHERE子句能够指定子查询。

• WHERE子句不能包含Oracle PARTITION扩展名。

• LOAD CACHE GROUP、REFRESH CACHE GROUP、FLUSH CACHE GROUP语句(表和同义词)中的WHERE子句只能够引用根表,除非WHERE子句包含一个子查询。

• 当建立一个多表缓存集合时,全部WHERE子句中的列名必须合法,如:user.table.column

WHERE子句中本地中立性

在缓存集合和Oracle Database之间的操做将继承此会话中使用的TimesTen全球支持的链接属性值。这些操做包括传送、加载、刷新、更新和同步写。

不直接与指定用户会话相关联的缓存集合操做将缺省使用全球支持的链接属性设置。这些操做包括自动刷新、老化和异步写。例如,这此操做使用BINARY做为NLS_SORT的值。

若是缓存集合操做使用了与全球支持的链接属性不一样的值,将产生矛盾。例如,考虑下面的语句:

CREATE CACHE GROUP cachegroup1 FROM table1(

column1 NUMBER NOT NULL PRIMARY KEY,

column2 NCHAR(30))

WHERE column2 < 'string';

WHERE子句中的字符串将使用这些字符的二进制值来进行比较。这将在基于本地组装缓存集合表时,可能致使非预期结果。

为了保证WHERE子句中的字符串使用它们语言学的值来进行比较,使用CREATE CACHE GROUP语句时使用一条与面类似的WHERE子句:

CREATE CACHE GROUP cachegroup1 FROM table1(

column1 NUMBER NOT NULL PRIMARY KEY,

column2 NCHAR(30))

WHERE

NLSSORT(column2,'NLS_SORT=TCHINESE_RADICAL')

< NLSSORT('string','NLS_SORT=TCHINESE_RADICAL');

在缓存集合中实现老化

能够为缓存集合中的根表定义一个老化性质。老化性质引用老化类型和老化属性,也就是老化状态(ON或OFF)。能够指定下列之一的老化类型:基于使用基于时间基于使用老化将删除指定数据存储使用范围内最近使用过(LRU)的数据。基于时间老化将根据指定的数据生存期和老化处理频率来删除数据。在相同的数据存储中,能够在同一个数据存储定义基于使用基于时间的老化,但在指定的缓存集合或表中只能定义一种老化类型。

CREATE CACHE GROUP语句中使用表定义来为新缓存集合的根表指定一个老化性质。若是表中没有定义老化性质,可使用ALTER TABLE语句来为已存在的缓存集合中的根表增长老化性质。能够经过先删除老化性质而后再添加老化性质来改变老化性质。

老化性质只能定义在缓存集合的根表上,由于老化是基于缓存实例的。

能够为那些没在缓存集合中的表定义老化性质。

基于使用老化

基于使用老化将保证在指定的极限范围内经过删除最近使用过(LRU)的数据来保持数据存储中可以使用内存的大小。LRU老化可用于除了使用AUTOREFRESH属性的缓存集合之外的全部类型的缓存集合。

经过在CREATE CACHE GROUP语句中的表定义中使用AGING LRU子句来为一个缓存集合定义LRU老化。若是状态是ON,老化将自动开始。若是根表是数据存储中第一个拥有LRU老化性质定义的表,老化将当即开始。不然,老化将在已有LRU老化性质定义的表上发生老化时在根表上同时发生。

使用ttAgingLRUConfig内部程序来为数据存储中的全部表指定LRU老化属性。此属性将应用到有LRU老化性质的数据存储中全部的表。若是不调用ttAgingLRUConfig内部程序,则将使用属性的缺省值。

下表总结LRU老化属性:

LRU老化属性

描述

LowUsageThreshhold

LRU老化被解除时数据存储PermSize的百分比。

HighUsageThreshhold

LRU老化激活时数据存储PermSize的百分比。

AgingCycle

在两个老化周期之间的分钟数。

在定义LRU老化性质以后,若是为AgingCycle设置了一个新值,老化的产生将基于当前时间和新的周期。例如,若是原来的周期是15分钟,而且LRU在10分钟以前已经产生,则老化预计将在5分钟以后再次发生。可是,若是将AgingCycle参数改变为30分钟,则老化将从使用新的AgingCycle值调用ttAgingLRUConfig程序之时起30分钟后发生。

若是自从上一次老化周期后一行被访问或引用,它就不符合LRU老化的条件。若是下列之一为真时,行就认为被访问或引用过:

• 行被用来创建一条SELECT语句的结果集。

• 行已经做上被更新或删除的标记。

• 行被用来创建一条INSERT SELECT语句的结果集。

使用ALTER TABLE语句来执行下列任务:

• 经过在缓存集合的根表上使用带有SET AGING {ON|OFF}子句的ALTER TABLE语句来激活或非激活老化状态。

• 经过使用带有ADD AGING LRU [ON|OFF]子句的ALTER TABLE语句来在为已存在的根表增长一LRU老化性质。

• 经过使用带有DROP AGING子句的ALTER TABLE语句来删除根表上的老化。

使用ttAgingScheduleNow内部程序来肯定老化的开始。

为了将缓存集合的老化从LRU改变为基于时间,首先使用带有DROP AGING子句的ALTER TABLE语句来删除根表上的老化。而后经过使用带有ADD AGING USE子句的ALTER TABLE语句来为根表增长基于时间的老化。

基于时间老化

基于时间老化将根据指定的数据生存期和老化处理频率从缓存集合的根表中删除数据。在CREATE CACHE GROUP语句的表定义中的AGING USE子句中定义基于时间的老化。使用带有AGING USE子句的ALTER TABLE语句来为已存在缓存集合中的根表增长一基于时间的老化性质。

AGING USE子句有一个ColumnName参数。ColumnName是用于基于时间老化的列的名称。做为简化,称呼此列为timestamp列。timestamp列必须定义以下:

• TIMESTAMP或DATE数据类型

• NOT NULL

应用将更新timestamp列的值。若是此列的值对于某些行来讲是未知的,而且不想这些行被老化,则使用一个较大的缺省值来定义此例。能够在timestamp列上建立一个索引,以提升老化处理的执行速度。

注意:不能在已存在的表中增长或修改一个列,而后将它用做timestamp列,由于不能增长或修改一个列并定义它为NOT NULL。

不能从已经有基于时间老化性质的表中删除timestamp列。

在CREATE CACHE GROUP语句中的LIFETIME子句中以days、hours或minutes指定生存期。

timestamp列中的值将从SYSDATE中被减去。被截短的结果使用指定单位(minute、hour、day),并与指定的LIFETIME值进行比较。若是结果大于LIFETIME值,则行将成为老化的候选行。

使用CYCLE子句来指定系统检查行的周期以删除超过指定的生存期的数据。若是没有指定CYCLE,则每隔五分钟产生一次老化。若是指定CYCLE为0,则老化将持续产生。若是状态为ON,老化将自动开始。

使用ALTER TABLE语句来执行下列任务:

•经过使用SET AGING {ON|OFF}子句来在使用基于时间老化性质的根表上激活或非激活老化状态。

• 经过使用SET AGING CYCLE子句来在使用基于时间老化性质的根表上改变老化周期。

• 经过使用SET AGING LIFETIME子句来改变根表中生存期。

• 经过使用ADD AGING USE子句来为没有老化性质的已存在的根表增长基于时间老化。

• 经过使用DROP AGING子句来删除根表上的老化。

当老化开始时使用ttAgingScheduleNow内部程序来安排时序。

为了将缓存集合的老化从基于时间改成LRU,首先删除根表上的老化。而后使用带有ADD AGING LRU子句的ALTER TABLE语句来为根表增长LRU老化。

注意:若是要改变AUTOREFRESH缓存集合根表的属性,必须中止缓存代理。在AUTOREFRESH 缓存集合中增长、改变或删除老化以前,中止缓存代理。

老化和外键

经过外键关联的表必须拥有相同的老化性质。

若是LRU老化在起做用过程当中而且子表中的行最近被访问过,则无论是父表仍是子表中的行都将被删除。

若是基于时间老化在起做用过程当中而且父表中的行已成为老化候选行,则父行和它全部的子行都将被删除。

若是表的ON DELETE CASCADE被激活,则将忽略此设置。

老化开始时的时序安排

使用ttAgingScheduleNow内部程序来安排老化过程的时序。一旦调用内部程序老化过程就当即开始,除非已经有一个老化过程正在进行中,这种状况下,当进行中的老化完成时,新的老化才能开始。

当调用ttAgingScheduleNow时,老化过程将启动,而无论状态是不是ON或OFF。当调用ttAgingScheduleNow时要指定根表的名称。不然ttAgingScheduleNow将在数据存储中有老化定义的全部表上启动或从新启动老化,而不只仅是缓存集合的根表。

老化过程的启动只是做为调用ttAgingScheduleNow的结果。调用ttAgingScheduleNow不会改变老化的状态。当调用ttAgingScheduleNow时若是老化的状态是OFF,则老化过程将开始,但在过程完成后它不会持续。为了继续老化,必须再次调用ttAgingScheduleNow或将老化状态改成ON。

若是老化状态已经设置为ON,则ttAgingScheduleNow将根据调用ttAgingScheduleNow的时间来从新设置老化周期。

能够控制老化行为。首先经过使用带有SET AGING OFF子句的ALTER TABLE语句来非激活老化。而后在指望的时间使用ttAgingScheduleNow来启动老化。

调用程序时,可使用ttAgingScheduleNow并经过经过指定表名来为单一表启动或重启老化。若是不指定表名,则ttAgingScheduleNow将启动或重启有老化定义的数据存储中全部表的老化。

可使用ttTraceMon工具来监视老化。

配置变化窗口

可使用基于时间老化来完成缓存集合数据变化窗口。在带有变化窗口的缓存集合中,按照时序规则添加新数据和删除老数据,以使缓存只保留知足指定的时间间隔的数据。

能够经过使用增量AUTOREFRESH属性来为缓存集合数据配置一变化窗口,并指定基于时间老化性质。AUTOREFRESH操做将在Oracle中检查timestamp以决定是否将新数据刷新到缓存表中。Oracle和TimesTen的SYSDATE和时区必须一致。

不能为经过手工加载、显示加载、刷新或插入数据的其它类型的缓存集合配置变化窗口来将新数据更新到缓存集合表中。

例 3.7下面的语句使用变化窗口属性建立一个缓存集合。

CREATE READONLY CACHE GROUP cg1

AUTOREFRESH STATE ON INTERVAL 1 MINUTES

FROM t1(i NUMBER NOT NULL PRIMARY KEY,

ts TIMESTAMP NOT NULL,

c VARCHAR2(50))

AGING USE ts LIFETIME 3 HOURS CYCLE 10 MINUTES;

cg1缓存集合有1分钟的自动刷新间隔。每一分钟都会将Oracle表中的新数据更新到缓存集合中。

老化将每10分钟检查一次老数据。老化将删除大于3小时的老数据(ts < SYSDATE - 3 HOURS)。

为AUTOREFRESH间隔和LIFETIME间隔设置的参数将决定数据将在缓存中保存多长时间。小于完整生存期间隔的数据也可能被老化出缓存。例如,若是AUTOREFRESH间隔是3天,而且LIFETIME间隔为30天,当数据进入缓存时可能已经存在3天了。所以数据在27天后将从缓存中被删除。这种状况发生是由于老化是基于Oracletimestamp而不是基于TimesTentimestamp

使用数据类型和类型模式工做

若是使用Oracle TimesTen In-Memory Database的Cache Connect特性,必须使用Oracle类型模式(TypeMode=0),即便缓存集合是被7.0之前的版本所定义。

若是缓存集合是被7.0之前的版本所定义,使用带有-convertCGTypes选项的ttMigrate工具来映射数据类型到用于7.0或此后的版本的数据类型。

注意若是应用使用的是本地整数数据类型,并要继续使用它们,在调用ttMigrate以前,必须改变应用为指定的TT_INTEGER、TT_SMALLINT、TT_TINYINT和TT_BIGINT。

浮点数据类型

BINARY_FLOAT和BINARY_DOUBLE被传入到Oracle Database 10g Release 1。Cache Connect支持从Oracle9i到Oracle Database 10g的Oracle客户端和服务器端。

若是须要使用BINARY_FLOAT或BINARY_DOUBLE数据类型,TimesTen推荐以下配置:

• 使用Oracle Database 10g客户端和服务器

• 将TimesTen中的BINARY_FLOAT数据映射为Oracle中BINARY_FLOAT数据

• 将TimesTen中的BINARY_DOUBLE数据映射为Oracle中的BINARY_DOUBLE数据

能够在Oracle9i和Oracle Database 10g中使用FLOAT(n)。

若是在映射TT_BINARY_FLOAT数据类型为Oracle的FLOAT(n)时,须要保持内存或提升执行速度,TimesTen推荐Oracle客户端的版本要与服务器Oracle的版本相同或较低。尽管做为推荐,也会发生下列状况:

• 在从FLOAT(n) 转换到BINARY_FLOAT和BINARY_DOUBLE时,会有数据精度的丢擒失。

• 在缓存中当Inf和NaN被定义为BINARY_FLOAT和BINARY_DOUBLE数据类型时,Inf可能被转换溢出,NaN可能被转换为0。

关于Cache Connect to Oracle数据类型映射

当为缓存集合表的列选择数据类型时,要考虑Oracle列的数据类型,并为缓存集合表中的列选择等价的数据类型。

主键和外键列级别要高于非键列。对于缓存集合表中的键列容许的数据类型映射显示在表 3.6中。

表 3.6 键列中容许的数据类型映射

Oracle数据类型

TimesTen数据类型

NUMBER(p,s)

NUMBER(p,s)

注意:也可使用DECIMAL(p,s)或NUMERIC(p,s)。它们是NUMBER(p,s)的别名。

NUMBER(p,0)

INTEGER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

INTEGER

NUMBER(p,0)

NUMBER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

NUMBER

CHAR(m)

CHAR(m)

VARCHAR2(m)

VARCHAR2(m)

RAW(m)

VARBINARY(m)

TIMESTAMP(m)

TIMESTAMP(m)

DATE

DATE

NCHAR(m)

NCHAR(m)

NVARCHAR2(m)

NVARCHAR2(m)

表 3.7 显示关于缓存集合中非键列映射的数据类型。

表 3.7 关于非键列容许的数据类型映射

Oracle数据类型

TimesTen数据类型

NUMBER(p,s)

NUMBER(p,s)

REAL

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

NUMBER(p,0)

INTEGER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

INTEGER

NUMBER(p,0)

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

NUMBER

TT_TINYINT

TT_SMALLINT

TT_INTEGER

TT_BIGINT

NUMBER

REAL

FLOAT

BINARY_FLOAT

DOUBLE

BINARY_DOUBLE

CHAR(m)

CHAR(m)

VARCHAR2(m)

VARCHAR2(m)

RAW(m)

VARBINARY(m)

LONG

VARCHAR2(m)

注意:m能够是为此数据类型定义的范围内的任何有效值。

LONG RAW

VARBINARY(m)

注意:m能够是为此数据类型定义的范围内的任何有效值。

TIMESTAMP(m)

TIMESTAMP(m)

DATE

DATE

TIMESTAMP(0)

FLOAT(n)

注意:包括DOUBLE PRECISION和FLOAT,等于

FLOAT(126)。也包括REAL,等于FLOAT(63)。

FLOAT(n)

BINARY_DOUBLE

注意:FLOAT(126)能够声明为DOUBLE PRECISION。FLOAT(63)能够声明为REAL。

BINARY_FLOAT

BINARY_FLOAT

BINARY_DOUBLE

BINARY_DOUBLE

NCHAR(m)

NCHAR(m)

NVARCHAR2(m)

NVARCHAR2(m)