TimesTen内存数据库
第一章 Cache Connect to Oracle概念
TimesTen数据交换技术提供在Oracle数据库和TimesTen数据管理器之间进行连接和双向数据传送。数据交换技术也使得能够方便的捕获和处理进入到TimesTen数据管理器的大流量事件流,并且能进行并发传送数据到Oracle数据库。
TimesTen允许通过创建cache group来高速缓存Oracle数据,以在TimesTen中映射一个或多个Oracle表。
允许高速缓存Oracle数据的TimesTen联合特征就作为Cache Connect to Oracle。
关于高速缓存集合
一个cache group就是描述被高速缓存到TimesTen数据存储中的Oracle数据。高速缓存集合可以创建来高速缓存一个单表的所有或部分数据,或一个相关的Oracle数据表集。
高速缓存集合可以使用CREATE CACHE GROUP SQL语句或基于浏览器的Cache Administrator(Chapter 6, “CacheAdministrator.”)来创建。
图 1.1 显示名为target_customers高速缓存集合缓存Oracle表table customer。高速缓存集合中的数据是存储在Oracle数据库中所有用户的大数据集的一个子集。
图 1.1 高速缓存一个表
如果定义一个root table和多个child tables,则可以在同一个高速缓存集合中缓存多个Oracle表。在一个高速缓存集合中只能有一个root table。
在拥有多个表的高速缓存集合中,每个子表必须通过一个外键约束连接到高速缓存集合中的根表或另一个子表。尽管TimesTen中缓存的表必须使用外键连接约束,但这些表在Oracle实例中不一定必须有连接。缓存集合中的根表不能通过外键约束来引用缓存集合中的任何其它表。所有缓存集合中的其它表都是子表
从Oracle加载到TimesTen缓存集合中的基本单位是cache instance,用来描述通过外键与根表特定行相关联的行集。缓存集合中每个表中粗体显示的是由根表中主键为122标识的缓存实例。此cache instance key确定根表中的行和引用此行的子表中所有的行。
图 1.2显示缓存集合target_customers中的表。根表是customer,orders和order_item是子表。
图 1.2 高速缓存多个表
在TimesTen缓存和Oracle之间交换数据
如图 1.3所示,flush或propagate表示从TimesTen缓存拷贝表数据到Oracle,load或refresh表示从Oracle拷贝数据到TimesTen缓存。
图 1.3 在TimesTen和Oracle之间交换数据
至于怎样将缓存集合中的数据传送到Oracle和从Oracle刷新数据,将依据所选择的缓存集合的类型。
缓存集合类型
缓存集合的基本类型为:
• READONLY缓存集合。
READONLY缓存集合通过AUTOREFRESH机制来将Oracle表中的更新进行强制缓存以应用到TimesTen。
• SYNCHRONOUS WRITETHROUGH (SWT) 缓存集合。
SYNCHRONOUS WRITETHROUGH (SWT)缓存集合将强制把集合中的缓存数据更新至TimesTen,并且发送到Oracle。SWT缓存集合的更新将被进行同步提交(Oracle)。
• ASYNCHRONOUS WRITETHROUGH (AWT)缓存集合。
ASYNCHROUNOUS WRITETHROUGH (AWT)缓存集合将强制把集合中的缓存数据更新至TimesTen,并且发送到Oracle。AWT缓存集合的更新将被进行异步提交(Oracle)。
• USERMANAGED缓存集合。
USERMANAGED缓存集合可以进行自定义。例如,USERMANAGED缓存集合中的表可以拥有READONLY或PROPAGATE属性。
第二章 快速开始
这章将讨论怎样使用SQL语句来创建并管理简单的缓存集合。也可使用基于浏览器的Cache Administrator来创建缓存集合。
安装TimesTen和Oracle
在能够创建缓存集合之前,必须安装TimesTen和Oracle环境。完成以下任务:
1. 在TimesTen主机上安装Oracle Client。
2. 创建必需的Oracle帐号。
3. 创建一个TimesTen帐号。
4. 创建TimesTen DSN。
在TimesTen主机上安装Oracle Client
Cache Connect to Oracle特性使用Oracle共享库来与Oracle数据库进行通信。可以通过在安装了TimesTen的机器上安装Oracle Client来安装这些库文件。安装Oracle 9i Client或Oracle Database 10g。Oracle客户端的版本不必与Oracle服务器端的版本相同。Cache Connect支持下面的Oracle客户端和服务器端的版本:
• Oracle 10g Release 2 (Oracle 10.2.0.1.0 或之后)
• Oracle 10g Release 1 (Oracle 10.1.0.5.0或之后)
• Oracle 9i Release 2 (Oracle 9.2.0.8.0或之后)
安装Oracle Client时,选择Application User Installation Type。不必专门配置一个服务目录来用于Cache Connect to Oracle,所以可以跳过安装过程的这一步。
安装Oracle Client以后,安装TimesTen。
注意:如果在安装Oracle Client之前安装了TimesTen,必须重新启动操作系统(Windows)或TimesTen(UNIX)。
创建必需的Oracle帐号
在能够使用Cache Connect to Oracle之前,必须从数据库管理员处获得一个Oracle帐号。如果操作者实际拥有数据库管理权限,则在Oracle服务器上打开命令窗口并启动SQL*Plus,以系统管理员身份登录:
sqlplus system/password@Oracle_Service_Name
例如,为了在由连接串、system1确定的Oracle数据库上给testuser创建一个新Oracle帐号,操作如下:
sqlplus system/manager@system1
SQL> CREATE USER testuser IDENTIFIED BY 11;
SQL> GRANT connect, resource, create any trigger TO cddbo;
SQL> COMMIT;
SQL> EXIT
为了与本章余下的部分讨论的一些示例缓存集合操作保持一致,Oracle用户为cddbo,口令为11,并且是system1中的一个Oracle帐号。
在TimesTen上创建一个帐号
作为实例管理者,使用ttIsql工具来连接到数据存储TT_tt70_32.。数据存储实例由TimesTen在安装时定义,用来使实例管理者能够执行数据存储连接管理任务。
然后使用CREATE USER和GRANT语句来创建一个名为cddbo的用户,拥有ADMIN和DDL权限:
ttIsql TT_tt70_32.
Command> CREATE USER pgmrnew IDENTIFIED BY 'pgmrnew';
Command> GRANT ADMIN, DDL TO pgmrnew;
注意:此帐号必须与Oracle数据库帐号和口令相同。
创建TimesTen DSN
在Window系统中,创建一简单的TimesTen系统数据存储(System DSN),名称为cddboDSN。
关于cddboDSN,设置如下:
• Data Store Path and Name:c:/temp/ cddbods
• Permanent Data Sz (MB):16
• Temporary Data Sz (MB):16
• User ID:pgmrnew(此ID也用作Oracle User ID)
• Oracle ID:orcl
• Oracle Password:pgmrnew
• DatabaseCharacterSet:ZHS16GBK。此数据库字符集必须与Oracle数据库字符集相同。为了得到Oracle数据库字符集信息,在Oracle数据库上输入下列查询:
SELECT value FROM nls_database_parameters
WHERE parameter='NLS_CHARACTERSET';
对于其余设置,使用缺省值。
创建READONLY缓存集合
在已经安装TimesTen和Oracle并进行配置以后,就可以创建缓存集合。
这部分将讨论怎样创建一个简单READONLY缓存集合,以缓存Oracle数据库中单一表中的内容。尽管一个缓存集合可以由多个表组成,这里只缓存一个Oracle表以保持示例的简单。
图 2.1 显示一个缓存一单个Oracle表的READONLY缓存集合。
图2.1 简单READONLY缓存集合
第1步:创建一Oracle表
图 2.2 创建一Oracle表
连接到新帐号并创建一数据表:
sqlplus testuser/mypsswrd@system1
SQL> CREATE TABLE readtab (a NUMBER NOT NULL PRIMARY KEY,
b VARCHAR2(31));
然后插入一些记录并进行提交:
SQL> INSERT INTO readtab VALUES (1, 'hello');
1 row created.
SQL> INSERT INTO readtab VALUES (2, 'world');
1 row created.
SQL> COMMIT;
Commit completed.
第2步:创建缓存集合
图 2.3 创建READONLY缓存集合
使用ttIsql工具来连接cddboDSN数据存储。在命令提示符下,使用ttCacheUidPwdSet程序来传递缓存管理用户ID和口令作为参数。然后调用ttCacheStart程序来为数据存储启动缓存代理。在这个示例中,缓存管理用户ID是cddbo,并且口令为11:
> ttIsql cddboDSN
Command> call ttCacheUidPwdSet('pgmrnew','pgmrnew');
Command> call ttCacheStart;
接下来,使用CREATE CACHE GROUP语句来创建名为readcache的READONLY缓存集合,用来在TimesTen中缓存Oracle表tsr20_user的内容:
Command> CREATE READONLY CACHE GROUP readcache
> AUTOREFRESH INTERVAL 5 SECONDS
> FROM tsr20_user
>(code char(5) NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL);
第3步:加载缓存集合
加载Oracle表中的内容到缓存集合表中。
Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
185 cache instances affected.
检查tsr20_user表的内容:
Command> SELECT * FROM tsr20_user;
< -000, test >
……………………
< 05999, 系统管理员05999 >
185 rows found
使用ttIsql cachegroups命令来检查READCACHE缓存集合的定义:
Command> cachegroups;
Cache Group TESTUSER.READCACHE:
Cache Group Type: Read Only
Autorefresh: Yes
Autorefresh Mode: Incremental
Autorefresh State: On
Autorefresh Interval: 5 Seconds
Root Table: PGMRNEW.TSR20_USER
Table Type: Read Only
1 cache group found.
第4步:更新Oracle表
图 2.4 使用Oracle更新自动刷新TimesTen
使用SQL*Plus,插入多行到READTAB并提交事务:
SQL> INSERT INTO readtab VALUES (3, 'Hello');
1 row created.
SQL> INSERT INTO readtab VALUES (4, 'Again');
1 row created.
SQL> COMMIT;
Commit completed.
5秒之后,TimesTen将从Oracle自动刷新缓存数据。在ttIsql中检查READTAB表的内容:
Command> SELECT * FROM readtab;
< 1, hello >
< 2, world >
< 3, Hello >
< 4, Again >
4 rows found
第5步:删除缓存集合
在TimesTen窗口中,使用DROP CACHE GROUP语句从TimesTen数据存储中删除缓存集合:
Command> DROP CACHE GROUP readcache;
第6步:停止缓存集合
调用ttCacheStop程序停止数据存储的缓存代理:
Command> call ttCacheStop;
激活SQL passthrough特性
这部分将讨论怎样在DSN中设置PassThrough属性来命令TimesTen通过SQL定向到Oracle。
图 2.5 显示从一个应用将SQL传递到Oracle表。缓存表通过自动刷新机制从Oracle接收更新。
图 2.5 从Cache Group to Oracle传递SQL
第1步:创建新的TimesTen DSN
在Window系统中,创建一新的TimesTen系统数据源(System DSN),名称为cddboPT,使用与指定给cddboDSN的相同的属性。另外,设置PassThrough属性值为‘2’,以直接传递不在缓存集合中的Oracle表的查询和程序调用到Oracle。
对于cddboPT,设置如下:
• Data Store Path and Name: c:/temp/cgPT2d
• Permanent Data Sz (MB): 16
• Temporary Data Sz (MB): 16
• User ID: pgmrnew (此ID也用作Oracle User ID)
• Oracle ID: orcl
• Oracle Password: pgmrnew
• PassThrough: 2
• DatabaseCharacterSet: ZHS16GBK。此数据库字符集必须与Oracle数据库字符集相同。为了得到Oracle数据库字符集信息,在Oracle数据库上输入下列查询:
SELECT value FROM nls_database_parameters
WHERE parameter='NLS_CHARACTERSET';
对于其余设置,使用缺省值。
第2步:创建READONLY缓存集合
图 2.6 创建READONLY缓相聚集合
在TimesTen窗口中,连接到DSN cddboPT,设置缓存管理用户ID和口令,启动缓存代理,并创建READONLY缓存集合:
ttIsql cgPT2
Command> call ttCacheUidPwdSet('pgmrnew','pgmrnew');
Command> call ttCacheStart;
Command> CREATE READONLY CACHE GROUP readcache
> AUTOREFRESH INTERVAL 5 SECONDS
> FROM tsr20_user
> (code char(5) NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL);
第3步:加载缓存集合
加载Oracle表的内容到缓存集合表中。
Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
4 cache instances affected.
第4步:更新缓存集合表
图 2.7 更新TimesTen缓存集合表
使用ttIsql,插入一些行到tsr20_user:
Command> INSERT INTO tsr20_user VALUES ('0001','Just','00000', 'dd','0000','1',NULL);
1 row inserted.
Command> INSERT INTO tsr20_user VALUES ('0002',' Passing ','00000', 'dd','0000','1',NULL);
1 row inserted.
Command> INSERT INTO tsr20_user VALUES ('0002',' Through ','00000', 'dd','0000','1',NULL);
1 row inserted.
使用SQL*Plus检查 check the contents of the readtab table on Oracle:
SQL> SELECT * FROM tsr20_user;
CODE NAME
---------- -------------------------------
-000 test
……………………
05999 系统管理员05999
187 rows selected.
然后使用ttIsql检查TimesTen中表tsr20_user的内容:
Command> SELECT * FROM tsr20_user;
< -000, test >
……………………
< 05999, 系统管理员05999 >
187 rows found
第5步:删除缓存集合
使用ttIsql,输入DROP CACHE GROUP语句来从TimesTen数据存储中删除缓存集合:
Command> DROP CACHE GROUP readcache;
第6步:停止缓存代理
调用ttCacheStop程序来停止数据存储的缓存代理:
Command> call ttCacheStop;
创建缓存集合任务列表
表 2.1 创建缓存集合任务列表
任务序号 |
任 务 |
1 |
确保已经安装Cache Connect to Oracle。使用ttIsql来验证: connect “uid=myuid;pwd=mypwd;OraclePWD=mypwd;passthrough=3”; SELECT COUNT(*) FROM DUAL; exit 此查询应该返回1。如果不是,则检查以下内容: • 设置以下环境变更:ORACLE_HOME、LD_LIBRARY_PATH、SHLIB_PATH • 缓存管理用户ID和口令,以及Oracle ID • Oracle服务器的状态 |
2 |
对所有要创建的缓存集合设计缓存集合计划。可能使用Cache Administrator。 |
3 |
确保有足够的资源来加载所有的缓存集合。 设置First Connection属性: • PermSize – 可以首先创建缓存集合,然后使用ttSize工具来估算PermSize属性的值。必须估算要使用ttSize工具进行缓存的行数。 • TempSize – 没有必要的意义。 • DatabaseCharacterSet – 确保它与Oracle数据库字符集相匹配。 文件系统大小推荐: • 数据存储目录应足够大以处理两个检查点文件。每个检查点文件的最大值为20 MB + PermSize。 • 日志目录应足够大以处理积累在检查点之间的日志文件。注意,如果在自动刷新间隔期间Oracle表中有大量的更新,自动刷新事务可能相当大。 一个对于日志目录大小的处理规则是使它等于数据存储的大小加上3倍的LogFileSize的3倍。 • 临时目录应放在快速文件系统中,以提高执行大事务的速度。可以通过设置TMPDIR环境变量(UNIX)或TEMP环境变更(Window)来指定临时目录用于自动刷新操作。在设置环境变量之后,重新启动TimesTen Daemon(UNIX)或机器(Window)。一个很大自动刷新事务在临时目录中要求很大空间。 |
4 |
如果缓存集合是自动刷新或异步写方式,要设置缓存管理用户ID和口令。缓存管理用户ID必须是一个Oracle用户,并且必须有相应的权限。 |
5 |
启动缓存代理。如果计划使用非日志模式(参阅第7步),则跳过此步。 |
6 |
创建并提交所有的缓存集合。 |
7 |
(选项)使用非日志模式加载缓存集合。 为了更快执行和降低资源使用,可以在非日志模式中加载缓存集合。非日志模式的缺点是: • 所有到TimesTen数据存储已存在的连接必须停止。 • 加载操作不能进行复制。 执行下列任务来使用非日志模式加载缓存集合: a. 如果正在运行的话,停止缓存代理、复制代理以及TimesTen服务。 b. 断开所有连接到TimesTen数据存储的应用。 c. 使用First Connection attributes Logging=0、DurableCommits=0、LockLevel=1属性连接到数据存储。. d. 为每个集合发送下列SQL语句:LOAD CACHE GROUP cache_group_name COMMIT EVERY 0 ROWS。 e. 在加载每个缓存集合之后,提交事务并发送一个检查点。 f. 使用日志重新将应用连接到TimesTen数据存储。 g. 启动缓存代理。 |
8 |
如果需要复制,则在缓存集合表上创建TimesTen复制计划。 |
9 |
如果要复制缓存集合表或缓存集合是异步写(AWT)方式,则启动复制代理。 注意:当复制代理正在运行时,不能创建或删除AWT缓存集合。 |
10 |
加载缓存集合并提交(如果不执行第7步)。使用LOAD CACHE GROUP cache_group_name COMMIT EVERY n ROWS。对于n的推荐值为256。 |
第三章 定义缓存集合
这章将讨论不同的缓存集合类型以及怎样进行定义。
创建缓存集合定义
可以使用CREATE CACHE GROUP语句来创建一个缓存集合定义,包括为每个将被缓存的Oracle表分别定义缓存表。
表 3.1 显示一个简单缓存集合定义的组成。缓存集合定义的每个部分将在下面部分讨论。
表 3.1 缓存集合定义的组成
组 成 |
CREATE type CACHE GROUP |
owner.name |
Cache group and table attributes |
FROM table 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缓存集合
使用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.table 和 user.table.column。
• LOAD CACHE GROUP和REFRESH CACHE GROUP语句不能包含WHERE子句。
• 不能指定Least recently used (LRU)老化。
示例:创建READONLY缓存集合
此例创建一个包含customer和ordertab表的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缓存集合
使用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缓存集合
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缓存表中的VARCHAR2、NVARCHAR2、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_customers。customer表中的更新通过“双向”彼此传送来更新TimesTen或Oracle。图 3.4 显示update_anywh