为缓存集合配置系统
这部分总结将TimesTen主机配置为Oracle Client并使用Cache Connect to Oracle特性来操作远程Oracle服务器的指定步骤。
1.在TimesTen主机上安装Oracle客户端或Oracle数据库。Oracle客户端或数据库必须在安装TimesTen之前装以防止使用Cache Connect特性时会出现问题。
2. 为特定的操作系统配置环境变更。
3. 安装TimesTen。
4. 如果打算使用基于Web的Cache Administrator,配置内植的web服务器。
5. 如果在TNSNAMES.ORA文件中定义Oracle Service Names,要使用系统级TNSNAMES.ORA文件。TimesTen的主守护程序、缓存代理、web服务器和复制代理将使用系统级TNSNAMES.ORA文件中提供的信息。不要使用不同的TNSNAMES.ORA文件来配置Oracle客户端。
注意:TimesTen不支持Oracle Name Server for Windows clients。
在UNIX平台上配置Cache Connect to Oracle
为TimesTen用户环境和启动TimesTen守护程序(根)的用户环境设置环境变量:
• 设置ORACLE_HOME环境变量为Oracle Client安装目录的路径。例如:
$ORACLE_HOME = /oracle/ora10g
• 对于32-位和64-位Oracle/TimesTen安装应该包括LD_LIBRARY_PATH或SHLIB_PATH环境变更:
$ORACLE_HOME/lib
$ORACLE_HOME/network/lib
install_dir/lib
例如:
LD_LIBRARY_PATH = $ORACLE_HOME/lib:$ORACLE_HOME/network/lib:
/timesten/myinstance/lib
注意:如果使用32-位TimesTen安装而配置64-位Oracle服务器,则库路径是$ORACLE_HOME/lib32。
• PATH环境变量应该包括:
$ORACLE_HOME/bin
install_dir/bin
例如:
PATH = $ORACLE_HOME/bin:/timesten/myinstance/bin
在Window系统中配置Cache Connect to Oracle
必须设置PATH系统环境变量包括:
Oracle_install_dir/bin
install_dir/lib
install_dir/bin
例如:
PATH = C:/Oracle/Ora10g/bin;C:/timesten/myinstance/lib;
C:/timesten/myinstance/bin;
Oracle数据库中安装任务
这部分将讨论操作Oracle DBA必须使用system帐号在Oracle数据库上执行。
创建Oracle用户并设置权限
必须指定一个Oracle用户和口令以访问Oracle表和创建缓存集合。所有Oracle用户帐号必须授予CREATE SESSION权限,以使用Cache Connect to Oracle。一些Cache Connect to Oracle操作要求另外的Oracle用户权限。
一些Cache Connect to Oracle操作要求一个使用另外Oracle权限的独立的用户。因为可能要求只授予另外缓存管理用户权限来选择用户,所以Cache Connect to Oracle允许创建一个独立的缓存管理用户帐号。
关于用于每个Cache Connect to Oracle操作的Oracle用户和缓存管理用户最小权限显示在表 4.1中。对一每个缓存管理用户的权限必须包括所有Oracle表可以被缓存到数据存储中,同时Oracle用户也需要特定的指定在由用户创建的缓存集合中的Oracle表的权限。参阅例 4.1。
表 4.1 对于缓存集合操作的Oracle权限要求
缓存集合操作 | 授予Cache Connect to Oracle用户的最小权限 | 授予缓存管理用户的最小权限 |
所有操作 | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | 一个也不需要 |
CREATE READONLY CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • UNLIMITED TABLESPACE (或在表空间上适当的空间引用 ) • CREATE TABLE① • CREATE ANY TRIGGER① |
CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • INSERT • UPDATE • DELETE | 一个也不需要 |
CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • INSERT② • UPDATE② • DELETE ② • QUERY REWRITE③ | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • INSERT • UPDATE • DELETE • UNLIMITED TABLESPACE (或在表空间上适当的空间引用 ) • CREATE TABLE① |
CREATE USERMANAGED CACHE GROUP(参阅并发行中的变量) | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | 一个也不需要 |
CREATE USERMANAGED CACHE GROUP .....加上 PROPAGATE | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • INSERT • UPDATE • DELETE | 一个也不需要 |
CREATE USERMANAGED CACHE GROUP .....加上 AUTOREFRESH INCREMENTAL | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • QUERY REWRITE ③ | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • UNLIMITED TABLESPACE (或在表空间上适当的空间引用 ) • CREATE TABLE① • CREATE ANY TRIGGER① |
LOAD CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | • 在Oracle数据库上CREATE SESSION • SELECT TABLE |
REFRESH CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | • 在Oracle数据库上CREATE SESSION • SELECT TABLE |
FLUSH CACHE GROUP | • 在Oracle数据库上CREATE SESSION • SELECT TABLE • INSERT TABLE • UPDATE TABLE | - |
使用Real Application Clusters 进行配置的所有操作 | • 在Oracle数据库上CREATE SESSION • SELECT TABLE | 在Oracle GV$SESSION上SELECT动态性能视图 |
①如果Oracle对象是手工安装的,不要求创建缓存集合
②不强从TimesTen执行
③只对于Oracle server version 9.2才要求
例4.1需要为两个用户Sam和John设立权限,使每个用户可以发送一条CREATE READONLY CACHE GROUP语句来各自创建只读缓存集合。Sam创建一个缓存Oracle表TTUSER.TABLEA的缓存集合,John创建另一个缓存OracleTTUSER.TABLEB的缓存集合。
为了提供Sam和John充足的Oracle权限来CREATE READONLY CACHE GROUP,需要创建两个Oracle用户帐号,并且其中一个缓存管理用户帐号将拥有扩展的权限。缓存管理用户的名称为User2:
• oracleUID = Sam
• oracleUID = John
• cacheUid = User2
在Oracle上创建帐号:
SQL> CREATE USER Sam IDENTIFIED BY Samspwd DEFAULT TABLESPACE users;
SQL> CREATE USER John IDENTIFIED BY Johnspwd DEFAULT TABLESPACE users;
SQL> CREATE USER User2 IDENTIFIED BY User2pwd DEFAULT TABLESPACE users;
然后为每个用户分配下列权限:
SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEA TO Sam;
SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEB TO John;
SQL> GRANT
> CREATE SESSION,
> SELECT ON TTUSER.TABLEA, TTUSER.TABLEB,
> UNLIMITED TABLESPACE,
> CREATE TABLE,
> CREATE ANY TRIGGER
> TO User2;
SQL>
为缓存管理用户创建一个独立的表空间
TimesTen强烈推荐为缓存管理用户创建一个独立的表空间。此表空间用作缓存管理用户的缺省表空间。此表空间包含有每个Oracle表的自动刷新触发器、变化日志表和其它对于每个缓存集合用户TimesTen需要的对象。如果不指定一个独立的表空间,这些对象将放在Oracle system表空间中。
当在Oracle上创建缓存管理用户时,要指定表空间。也可以创建用户之后使用Oracle ALTER USER语句的DEFAULT TABLESPACE子句来指定表空间。
例4.2例 4.1 显示怎样创建并授权给缓存管理用户User2。为了给User2指定一个名为cacheuser的独立表空间,在Oracle中输入下列语句:
SQL> ALTER USER User2 IDENTIFIED BY User2pwd
DEFAULT TABLESPACE cacheuser;
每个缓存的Oracle表的变化日志表驻留在缓存管理用户表空间中。对于Oracle表上每次更新,将为此Oracle表向变化日志表插入一行(一条变化记录)。变化日志记录的字节大小如下:
变化日志记录的大小 = Oracle表上主键的大小 + 250
变化日志表中的记录数将依赖于Oracle表的更新率和TimesTen上的自动刷新间隔。每隔20秒,TimesTen将删除已经应用到缓存相关Oracle表的数据存储的变化日志记录。
当缓存管理用户表空间写满时
当缓存管理用户表空间变写满时,自动刷新触发器将通过删除已存在的变化日志记录来为新变化日志记录产生空间。这将引起一些TimesTen数据存储上一些表的完全自动刷新。
如果表空间写满,检查如下内容:
• 是否正在创建一个缓存集合或正在复制一个数据存储?这些临时操作将停止变化日志表上的清除操作。
• TimesTen数据存储上的缓存代理是否正在运行?如果缓存代理没有运行,变化日志记录将堆积。
• 在数据存储中是否没有通过删除自动刷新缓存集合而抛弃的数据存储?在这种情况下,变化日志记录也将堆积。
为缓存表定义DSN
缓存Oracle数据的数据存储必须定义为系统DSN,不能作为User DSN,如果TimesTen缓存不定义为System DSN,则TimesTen Cache Administrator就不能进行工作,而且ttAdmin也不能启动TimesTen缓存代理。
DSN路径必须是一个绝对值。
当为了缓存Oracle表创建DSN时,DSN的属性必须如下设置:
•Logging必须激活为disk-based。
•LockLevel必须激活row-level locking。(Cache Connect to Oracle不支持database-level locking。)
•Isolation可以是任何isolation模式。
•OracleID必须设置为Oracle Service Name for Oracle 9i和以后的Oracle版本。
•PassThrough可以设置来控制程序和SQL语句是在本地的TimesTen缓存中执行或是传递到Oracle。
•DatabaseCharacterSet必须与Oracle数据库字符集相同。
•TypeMode必须设置为0(Oracle)。
下列属性可以指定为DSN属性或作为连接属性:
• Oracle User ID指定Oracle用户ID。此字符串通过设置UID连接属性来间接指定。相应的UNIX平台上的DSN属性是UID。在Window系统中,相应的DSN属性是User ID。
•OraclePWD为Oracle用户指定口令。
用来连接到Oracle的用户名和口令将从DSN定义的属性中或ODBC连接串中取出。在连接串中给出的值将覆盖指定DSN中的值。
例如,可以在ttIsql连接串中指定Oracle UID和OraclePWD:
ttIsql -connStr "DSN=cgDSN; UID=testuser; OraclePWD=mypsswrd"
如果通过ODBC应用发送更新并提交,必须在连接串中指定用户名和口令。例如:
SQLDriverConnect(hdbc, ..., "DSN=cgDSN; UID=testuser;
OraclePWD=mypsswrd", ...);
在UNIX平台上例如,为UNIX平台上的myOraCache定义就如下形式:
[myOraCache]
DataStore=/users/OracleCache/hotData
Authenticate=0
Logging=1
LockLevel=0
PermSize=40
TypeMode=0
DurableCommits=1
OracleID=system1
UID=testuser
OraclePWD=mypsswrd
DatabaseCharacterSet=WE8ISO1559P1
在Windowt系统中在ODBC TimesTen Setup dialog的Oracle Data Loading窗口中指定OracleID。
启动和停止缓存代理
一个TimesTen进程调用一缓存代理来执行异步缓存操作,如加载或刷新缓存集合。许多Cache Connect to Oracle操作可以直接通过TimesTen进行,而不需要缓存代理的协助。
如果下列之一或多个情形为真,则必须为每个包含缓存集合的数据存储启动一个独立的缓存代理:
• 缓存集合为READONLY。
• 缓存集合为USERMANAGED并且包含一条AUTOREFRESH子句。
• 应用加载或刷新缓存集合。
可以从命令行或一个程序来为一个DSN启动缓存代理。
也可从基于浏览器的Cache Administrator来启动缓存代理。
注意:如果安装TimesTen时激活了Access Control,必须拥有数据存储的ADMIN权限来启动或停止缓存代理。另外,TimesTen用户名必须与Oracle用户名相匹配(应用到内部和外部的用户名)。
从命令行控制缓存代理
使用ttAdmin工具来从命令行控制缓存代理。可以使用ttAdmin来:
• 从命令行设置缓存管理用户ID和口令
• 从命令行启动缓存代理
• 从命令行停止缓存代理
• 从命令行设置代理启动性质
从命令行设置缓存管理用户ID和口令
如果使用下列之一的缓存集合类型,则必须有一个拥有相应Oracle权限的缓存管理用户帐号:
• ASYNCHRONOUS WRITETHROUGH缓存集合
• READONLY缓存集合
• 使用AUTOREFRESH属性的USERMANAGED缓存集合
缓存管理用户ID必须遵守下列规则:
• 长度为1到30字节。
• 必须以字母开头。
• 只能包含ASCII字母、下划线(_)、美元符号($)和英镑符号(#)。
缓存管理口令必须遵守下列规则:
• 长度为1到30字节。
• 可以包含除了分号(;)外的任何ASCII字符。
在启动缓存代理之前设置缓存管理用户ID和口令。使用如下语法:
ttAdmin -cacheUidPwdSet -cacheUidcacheUid-cachePwdcachePwd DSN
注意:如果数据存储中有自动刷新或AWT缓存集合,则缓存管理用户ID和口令不能进行重新设置。在重新设置缓存管理用户ID和口令之前,必须删除那些缓存集合。
例 4.3ttAdmin -cacheUidPwdSet -cacheUid testuser -cachePwd mypass myOraCache
如果改变了缓存管理用户ID或口令,则必须重新启动缓存代理。
注意:如果在数据存储中没有缓存集合,则不要设置缓存管理用户ID和口令。如果没有缓存集合时设置了它们,将不会使用缓存管理用户ID和口令,并校验到Oracle数据库。
从命令行启动缓存代理
为了人命令行启动缓存代理,使用如下语法:
ttAdmin -cacheStartDSN
例 4.4ttAdmin -cacheStart myOraCache
如果试图为在DSN中使用相关路径标识的数据存储启动缓存代理,TimesTen将搜索TimesTen运行和失败的相关数据存储。例如,在Window系统中,如果在DSN中为数据存储指定路径为DataStore=./dsn1,并且试图使用下面命令启动缓存代理:
ttAdmin -cacheStart dsn1
缓存代理在install_dir/srv/dsn1中搜索数据存储。将不能在此位置找到数据存储,也不能启动缓存代理。对于UNIX,缓存代理将查找:
/var/TimesTen/ttversion/bits
从命令行停止缓存代理
为了停止代理,使用如下语法:
ttAdmin -cacheStopDSN
例 4.5ttAdmin -cacheStop myOraCache
注意:使用AUTOREFRESH特性时,在删除或改变缓存集合之后,不要立即停止缓存代理。应该至少等待2分钟。缓存代理需要这个时间来清除AUTOREFRESH使用的Oracle对象。
从命令行设置缓存代理启动性质
可以通过调用ttCachePolicySet程序来设置缓存代理启动性质。使用ttCachePolicyGet程序来返回当前的性质。
缺省的缓存代理启动性质是manual。如果要在TimesTen守护程序重新启动时将缓存代理自动重新启动,则设置缓存代理性质为always。一旦设置性质为always,缓存代理将立即启动。
例4.6设置缓存代理性质为always:
CALL ttCachePolicySet ('always');
从程序控制缓存代理
为了从程序中控制数据存储的缓存代理,首先连接到数据存储。使用ttCacheUidPwdSet、ttCacheStart、ttCacheStop或ttCachePolicySet程序来执行下列任务:
• 从程序设置缓存管理用户ID和口令
• 从程序启动缓存代理
• 从程序停止缓存代理
• 从程序设置缓存代理性质
注意:如果Access Control被激活,则需要ADMIN权限来为缓存代理和复制代理进行启动、停止和设置性质。也需要ADMIN权限来设置缓存管理用户ID和口令。
从程序设置缓存管理用户ID和口令
如果使用下列类型之一的缓存集合,必须有一个拥有相应Oracle权限的缓存管理用户帐号:
• ASYNCHRONOUS WRITETHROUGH缓存集合
• READONLY缓存集合
• 使用AUTOREFRESH属性的USERMANAGED缓存集合
缓存管理用户ID必须遵守下列规则:
• 长度为1到30字节。
• 必须以字母开头。
• 只能包含ASCII字母、下划线(_)、美元符号($)和英镑符号(#)。
缓存管理口令必须遵守下列规则:
• 长度为1到30字节。
• 可以包含除了分号(;)外的任何ASCII字符。
在启动缓存代理之前设置缓存管理用户ID和口令。使用ttCacheUidPwdSet程序。
例 4.7在此例中,通过连接句柄hdbc指定数据存储。缓存管理用户ID为testuser,并且缓存管理用户口令为mypass。
sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
sprintf( stmt, "CALL ttCacheStart()" );
rc = SQLAllocStmt( hdbc, &hstmt2 );
rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );
从程序启动缓存代理
使用ttCacheStart程序来启动缓存代理。
例 4.8在此例中,通过连接句柄hdbc指定数据存储。
sprintf( stmt, "CALL ttCacheStart()" );
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
注意:如果自动提交非激活,则必须在提交之前和之后调用ttCacheStart。
从程序停止缓存代理
使用ttCacheStop程序来停止缓存代理。
例 4.9sprintf( stmt, "CALL ttCacheStop()" );
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
ttCacheStop程序有一个选项参数stopTimeout,用来指定TimesTen守护程序要等多长时间才停止缓存代理。如果缓存代理在指定的时间内没有停止,则TimesTen守护程序将停止缓存代理。stopTimeout的缺省值是100秒。0值指定永远等待下去。
例 4.10为了停止缓存代理,并设置stopTimeout为160秒:
sprintf( stmt, "CALL ttCacheStop(160)" );
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
从程序设置缓存代理启动性质
可以通过调用ttCachePolicySet程序来设置缓存代理启动性质。使用ttCachePolicyGet程序来返回当前的性质。
缺省的缓存代理启动性质是manual。如果要在TimesTen守护程序重新启动时将缓存代理自动重新启动,则设置缓存代理性质为always。一旦设置性质为always,缓存代理将立即启动。
例 4.11设置由hdbc连接句柄指定数据存储的缓存代理启动性质为always:
sprintf( stmt, "CALL ttCachePolicySet ('always')");
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
检查缓存代理的状态
可以使用ttStatus工具或ttDataStoreStatus程序来检查正在运行的TimesTen缓存代理。
例 4.12为了使用ttStatus工具来确认位于c:/temp/cgds的数据存储的缓存代理正在运行,输入:
C:/>ttStatus
TimesTen status report as of Wed Apr 07 15:04:45 2004
Daemon pid 484 port 15000 instance MYCOMPUTER
No TimesTen server running
--------------------------------------------------------------
Data store c:/temp/cgds
There are 4 connections to the data store
Data store is in shared mode
Shared Memory KEY Global/DBI3cd02077.0.SHM.26 HANDLE 0x380
Subdaemon pid 964 context 0x5d82d0 connected (KEY
Global/DBI3cd02077.0.SHM.26)
Process pid 2040 context 0x97b200 connected (KEY
Global/DBI3cd02077.0.SHM.26)
Process pid 2040 context 0x1427c70 connected (KEY
Global/DBI3cd02077.0.SHM.26)
Process pid 2040 context 0x144bd70 connected (KEY
Global/DBI3cd02077.0.SHM.26)
TimesTen's cache agent is running for this data store
cache agent restart policy: manual
可以使用带有-query选项的ttAdmin工具来确认为数据存储设置的性质,包括缓存代理的重启性质。
例 4.13
C:/>ttAdmin -query cgDSN
RAM Residence Policy : inUse
Replication Agent Policy : manual
Replication Manually Started : False
cache agent Policy : manual
cache agent Manually Started : True
例 4.14如果已经创建了一个AWT缓存集合,并且数据存储已经启动复制代理,则ttStatus工具也报告Oracle和复制代理的状态。在此例中,复制和缓存代理正在运行。
C:/> ttStatus
TimesTen status report as of Wed May 4 13:44:30 2005
Daemon pid 25337 port 16000 instance -
No TimesTen server running
No TimesTen webserver running
-----------------------------------------------------------------
------- Data store /datastore/cache There are 15 connections to
the data store Data store is in shared mode Shared Memory KEY
0x260e30c2 ID 521502725
Cache agent pid 25545 context 0x82fd820 name timestenorad
connid 2 connected (KEY 0x260e30c2)
Cache agent pid 25545 context 0x832d798 name timestenorad
connid 4 connected (KEY 0x260e30c2)
Cache agent pid 25545 context 0x8335198 name timestenorad
connid 3 connected (KEY 0x260e30c2)
Cache agent pid 25545 context 0xaf27ad08 name timestenorad
connid 6 connected (KEY 0x260e30c2)
Process pid 25485 context 0x80bd8b0 name cache connid 8
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x8193110 name connid 7
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x81bddb0 name connid 9
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x81e53f8 name connid 12
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x82040d8 name connid 5
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x8229148 name connid 10
connected (KEY 0x260e30c2)
Replication pid 25559 context 0x824e1b8 name connid 11
connected (KEY 0x260e30c2)
Subdaemon pid 25350 context 0x8092960 name Worker connid
2044 connected (KEY 0x260e30c2)
Subdaemon pid 25350 context 0x8110140 name Flusher connid
2045 connected (KEY 0x260e30c2)
Subdaemon pid 25350 context 0x813a838 name Checkpoint
connid 2047 connected (KEY 0x260e30c2)
Subdaemon pid 25350 context 0x81608f8 name Monitor connid
2046 connected (KEY 0x260e30c2)
Replication policy : Manual
Replication agent is running.
Cache agent policy : Manual
TimesTen's Cache agent is running for this data store
为AWT缓存集合启动复制代理
如果使用异步写(AWT)缓存集合,必须启动复制代理。
CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP 语句将创建一个复制计划以激活数据存储与Oracle数据库之间的通信。复制计划完全由TimesTen管理,不需要用户介入。使用DROP CACHE GROUP语句删除AWT缓存集合时,复制计划也将被删除。
可能通过使用带有-repStart选项的ttAdmin工具从命令行启动复制代理。
例 4.15为AWTdsn数据存储启动复制代理。
ttAdmin -repStart AWTdsn
也可以通过使用ttRepStart程序从程序启动复制代理。
例 4.16一个缓存管理用户的ID为testuser,口令为mypass,可以使用:
•ttCacheUidPwdSet程序来设置缓存管理用户ID和口令
•ttCacheStart程序来启动缓存代理
•ttRepStart程序来为AWTdsn数据存储启动复制代理
sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");
rc = SQLAllocStmt( hdbc, &hstmt );
rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );
sprintf( stmt, "CALL ttCacheStart()" );
rc = SQLAllocStmt( hdbc, &hstmt2 );
rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );
sprintf( stmt, "CALL ttRepStart()" );
rc = SQLAllocStmt( hdbc, &hstmt3 );
rc = SQLExecDirect( hstmt3, (SQLCHAR *) stmt, SQL_NTS );
注意:在为AWT缓存集合发送一条CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP或DROP CACHE GROUP语句之前,要停止复制代理(如ttAdmin-repStopDSN)。
应用缓存集合定义到数据存储
如果有定义缓存集合的SQL文件,就可以在TimesTen数据存储上使用带有-f选项的ttIsql工具来执行此SQL。语法是::
ttIsql -ffile.sql DSN
例 4.17如果缓存集合在名为CG1.sql的文件中定义,可以在名为cgDSN的DSN上执行此文件,输入:
C:/> ttIsql -f CG1.sql cgDSN
也可以从ttIsql命令行执行包含缓存集合定义的SQL文件。例如:
Command> run CG1.sql
设置passthrough级别
应用通过TimesTen连接可以发送SQL语句到TimesTen或Oracle。
SQL是否被直接传送到TimesTen或Oracle将依赖于SQL语句的组成和PassThrough连接属性的设置。可以设置PassThrough属性来定义SQL语句的类型:是由本地的TimesTen处理,还是重定向到Oracle。
例如,可以设置PassThrough=0(缺省值)来指定所有SQL都在TimesTen中执行或PassThrough=3来指定所有SQL被传送到Oracle去执行。
如图 4.1显示,可以设置PassThrough=1来为一个不在TimesTen中的目标表或在TimesTen中产生的一条语法错误传送SQL。例如,一条到缓存表(Table A)的UPDATE 在TimesTen缓存中被处理,同时一条到在TimesTen中找不到的表(Table G)的UPDATE被传送到Oracle。同样地,TimesTen的设置程序如ttCacheStart或ttCkpt,由TimesTen处理,同时不支持的过程将传送到Oracle。
图4.1 PassThrough=1
对于PassThrough=1的设置,没有DDL语句会传送到Oracle。TimesTen中不存在的过程将被传送到Oracle:如果对于缓存集合表DML语句包含错误语法,就不会发送到Oracle。但是,所有包含错误语法的SELECT语句将被发送到Oracle。
对于所有的passthrough级别,如果事务有任何DDL或DML语句传送到Oracle,则提交和回滚将在Oracle和TimesTen中都要执行。否则,将只在TimesTen中执行。
READONLY缓存集合禁止在缓存集合中使用DML语句的更新。如果计划使用READONLY缓存集合,可以设置PassThrough=2来直接将缓存集合中所有表的DML语句定向到Oracle。否则,此设置将于PassThrough=1时一样,因此所有DDL语句、兼容的非DML语句及过程将直接到TimesTen。相同的passthrough情形也应用到USERMANAGED缓存集合中的READONLY表。例如,考虑如图4.1所示的缓存集合示例。如果在Table A上设置了READONLY属性,并且PassThrough= 2,一条到Table A的UPDATE将被传送到Oracle。
在AWT和SWT缓存集合的表DML操作不推荐使用passthrough特性。在被定义为异步的AWT集合中通过缓存进行的更新,passthrough将同步实施,可能将产生非预期结果。如果运用passthrough特性,SWT缓存集合中的更新可能导致自死锁。
Passthrough和参数绑定
确保应用为传送语句提供正确的SQL数据类型。ODBC驱动器将转换C和SQL类型,并向TimesTen传送转换的数据和SQL类型码。TimesTen传递此信息到Oracle。
TimesTen处理passthrough语句的参数与在TimesTen中它自己执行语句中的参数不同。TimesTen查询优化将为TimesTen语句的参数分配数据类型。应用将获得分配的数据类型来使用SQLDescribeParamODBC函数。与此相比,passthrough语句的参数将不会为它们分配数据类型。TimesTen将报告passthrough语句的参数的数据类型为VARCHAR2(4000)。此数据类型只是一个占位符。它不意谓着TimesTen期望作为VARCHAR2数据来接收此参数值。作为替代,当应用调用SQLBindParameterODBC函数时,必须通知TimesTen关于passthrough语句参数的数据类型。SQLBindParameter的fSqlType参数指定参数的SQL数据类型。如果使用,cbColDef和ibScale参数指定精度和比例。
例如,为了绑定一个SQL数据类型INTEGER的参数为NUMBER(3)参数,使用下列参数调用SQLBindParameterODBC函数:
fCType=SQL_C_SLONG
fSqlType=SQL_DECIMAL
cbColDef=3
ibScale=0
二选其一,也可以使用下列参数:
fCType=SQL_C_SLONG
fSqlType=SQL_INTEGER
cbColDef=0
ibScale=0
对于SQL_INTEGER,cbColDef和ibScale参数将被忽略。
改变passthrough级别
可以在ttIsql会话中使用passthrough命令来覆盖DSN中PassThrough的设置。也可以为指定的事务通过调用ttOptSetFlag程序并指定‘passthrough’作为optflag参数和新的passthrough设置作为optval参数来重新设置passthrough。新的passthrough设置将立即产生影响。在事务的最后,passthrough将被重置为原来指定在PassThrough属性中的值。
注意:PassThrough的行为如同任何其它的优化标志。当执行语句时准备的语句是使用的级别时,将建立PassThrough级别。如果在准许语句和执行它之间改变了PassThrough级别,则在执行中将使用原来的PassThrough级别。
监视缓存集合
以下部分将讨论怎样得到缓存集合的配置信息和怎样监视缓存集合的状态。
使用ttIsql cachegroup命令
可以通过使用ttIsqlcachegroup命令来获得关于数据存储中当前使用中的缓存集合的信息,如下面例4.18所示。
例 4.18
Command> cachegroup;
Cache Group TESTUSER.CUSTOMERORDERS:
AutoRefresh Mode: Incremental
AutoRefresh State: On
AutoRefresh Interval: 5 Minutes
Root Table: TESTUSER.CUSTOMER
Where Clause: (none)
Type: Read Only
Child Table: TESTUSER.ORDERTAB
Where Clause: (none)
Type: Read Only
Cache Group TESTUSER.TABCACHE:
Root Table: TESTUSER.TAB3
Where Clause: (none)
Type: Propagate
2 cache groups found.
监视自动刷新缓存集合
TimesTen提供下列工具来监视自动刷新缓存集合:
•ttCacheAutorefreshStatsGet内部程序
• 支持日志中的信息
• 一个可以在Oracle数据库中执行的SQL脚本来显示关于变化日志表的信息
•ttTraceMon工具的AUTOREFRESH组成
• SNMP陷阱
为READONLY、AUTOREFRESH和AWT缓存集合管理Oracle对象
READONLY缓存集合和一些USERMANAGED缓存集合使用AUTOREFRESH特性来自动将Oracle更新刷新到TimesTen缓存中。
可以为缓存集合建立完全或增量自动刷新模式。当配置为增量自动刷新时,TimesTen将为缓存集合中的每个Oracle基表要求创建一个触发器、日志表和其它对象。每次在Oracle基表上的插入、更新和删除操作将启动触器。触发器将在日志表中记录更新记录的主键。TimesTen缓存代理将定期搜索日志表中的更新键和关联的被更新的Oracle基表以得到最近更新的快照。
使用AUTOREFRESH INCREMENTAL属性创建缓存集合时,自动刷新的要求的Oracle对象将被自动安装。二选其一,可以手工安装Oracle对象,以允许用户使用较小的Oracle权限来创建要使用触发器的缓存集合。
在安装Oracle对象之前,必须:
• 有一个授予了额外的缓存管理用户权限的缓存管理用户帐号。
• 使用ttCacheUidPwdSet设置缓存管理用户ID和口令。
• 启动缓存代理。
对于每个缓存管理用户,TimesTen将创建下列各表,version是一个内部TimesTen版本号:
• TT_version_USER_COUNT
• TT_version_AGENT_STATUS
• TT_version_SYNC_OBJS
对于缓存集合中的每个表,TimesTen将创建下列对象,number是原Oracle表的对象ID,version是一个内部TimesTen版本号。
对象 | 描述 |
TT_version_number_L | 为记录到Oracle表的变化变化日志表。 |
TT_version_number_T | 在变化日志表记录变化的触发器。当在缓存表中有插入、删除和更新时被触发。 |
AWT缓存集合请求一个额外的Oracle对象。将在Oracle上创建一个名为TT_version_REPPPEERS的表用来跟踪状态和最近应用到Oracle的语句。此表将由CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP语句自动创建。二选其一,可以创建AWT缓存集合之前手工创建此Oracle表。
如果AWT缓存集合是一个活动的复制计划备用对的一部分,则当创建活动的备用对时,一个名为TT_version_REPACTIVESTANDBY将在Oracle上被自动创建。
TimesTen将下列表的SELECT、INSERT、UPDATE和DELETE的权限授予给user PUBLIC:
• TT_version_number_L
• TT_version_USER_COUNT
• TT_version_REPPEERS (为AWT缓存集合创建)
• TT_version_REPACTIVESTANDBY (为活动的备用复制计划中的AWT缓存集合创建)
自动安装Oracle对象
为了直接使TimesTen自动安装Oracle对象,确保缓存管理用户拥有所有要求的自动创建Oracle对象的权限。当以PAUSED或ON状态创建缓存集合或缓存集合状态被改为PAUSED或ON时,将自动创建Oracle对象。
例 4.19 显示怎样直接使TimesTen为READONLY缓存集合自动安装Oracle对象。
1. 使用ttIsql来连接到cgDSN数据存储。
2. 调用ttCacheUidPwdSet程序来为数据存储设置缓存管理用户ID(testuser)和口令。
3. 调用ttCacheStart程序来启动缓存代理。
4. 使用CREATE READONLY CACHE GROUP来创建一个READONLY缓存集合,此集合有AUTOREFRESH INCREMENTAL值,并且STATE被设置为缺省值PAUSED。
例 4.19
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheStart();
Command> CREATE READONLY CACHE GROUP readcache
FROM
user1.readtab
(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));
例 4.20 显示怎样直接使TimesTen为AWT缓存集合自动安装Oracle对象。
例 4.20
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheStart();
Command> CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache
FROM user1.writetab (a NUMBER NOT NULL PRIMARY KEY,b VARCHAR2(31));
手工安装Oracle对象
如果不需要授予用户完全自动安装Oracle对象的CREATE权限设置,可以手工安装Oracle对象,并允许用户使用较少的权限来创建AWT缓存集合和使用AUTOREFRESH INCREMENTAL属性的缓存集合。
对象的安装必须授予与选择自动安装选项的用户相同的Oracle权限。
获得SQL码需要通过下方式之一从TimesTen创建Oracle对象:
• 从ttIsql提示符,输入一条带有INSTALL标志的cachesqlget命令。
• 从一个程序中,调用ttCacheSqlGet内部程序并指定参数install_flag为‘1’。
注意:当获得SQL码来安装Oracle对象时,也应该产生一个来获得SQL码的脚本并保存它以在以后用来删除对象。
在已经获得SQL码以后,就可以通过在Oracle主机上启动SQL*Plus来手工创建Oracle对象,登录如下:
sqlpluscacheUid/cachePwd@machine_name
在SQL>提示符,输入SQL码来创建对象。
例4.21使用ttIsql来连接到数据存储。然后调用ttCacheStart程序来为数据存储启动缓存代理。缓存管理用户ID是testuser,口令为mypsswrd。下一步,使用CREATE CACHE GROUP来创建一个READONLY缓存集合,AUTOREFRESH STATE设置为OFF,并运行cachesqlget命令来获取必须的SQL来安装Oracle对象:
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser', 'mypsswrd');
Command> call ttCacheStart();
Command> CREATE READONLY CACHE GROUP readcache
AUTOREFRESH
MODE INCREMENTAL
INTERVAL 30 SECONDS
STATE OFF
FROM user1.readtab
(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));
Command> cachesqlget readcache install;
从cachesqlget的输出相似如下:
CREATE TABLE system.tt_version_user_count(tableName VARCHAR2(65),
userCount
.... more code .....
END;
.
RUN;
可以从TimesTen剪贴和粘贴此SQL到Oracle上的SQL*Plus提示符:
SQL> CREATE TABLE system.tt_version_user_count(tableName
VARCHAR2(65), userCount
.... more code .....
END;
.
RUN;
二选其一,可以请求ttIsql将cachesqlget输出到一个在命令行中提供的输出文件名称的一个文件将其保存。然后可以拷贝此文件到Oracle系统并执行此文件来安装Oracle对象。
注意:如果手工安装Oracle对象,必须要手工删除它们。
手工为AWT缓存集合安装Oracle对象
当手工为AWT缓存集合安装Oracle对象时,必须在为Oracle实例创建AWT缓存集合之前安装。对于每个Oracle实例和缓存管理用户ID和口令,对象只需要安装一次。
执行下列任务来为一个AWT缓存集合安装Oracle对象:
1. 在ttIsql会话中使用ttCacheUidGet程序来检查是否已经设置缓存管理用户ID和口令。在此例中,DSN为cgDSN。NULL结果表示还没有为cgDSN设置缓存管理用户ID和口令。
> ttIsql cgDSN
Command> call ttCacheUidGet();
<>
1 row found.
2. 通过使用ttCacheUidPwdSet(uid,pwd)来设置缓存管理用户ID和口令。下面的例子在ttIsql会话中设置缓存管理用户ID为testuser,口令为mypsswrd,然后验证它已经被设置。
Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheUidGet();
< testuser >
3. 通过使用ASYNCHRONOUS_WRITETHROUGH和INSTALL标志的ttIsqlcachesqlget命令来获取SQL以安装对象。
Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH INSTALL;
输出相似如下:
CREATE TABLE testuser.TT_03_RepPeers(
replication_name CHAR(31) NOT NULL,
replication_owner CHAR(31) NOT NULL,
tt_store_id NUMBER(19,0) NOT NULL,
subscriber_id NUMBER(19,0) NOT NULL,
commit_timestamp NUMBER(19,0),
commit_seqnum NUMBER(19,0),
timerecv NUMBER(10,0),
protocol NUMBER(10,0),
PRIMARY KEY(tt_store_id));
GRANT INSERT, UPDATE, DELETE, SELECT
ON testuser.TT_03_RepPeers TO PUBLIC;
CREATE TABLE testuser.TT_03_RepActiveStandby(
tt_store_pair INTEGER NOT NULL,
tt_store_id1 NUMBER(19,0) NOT NULL,
tt_store_id2 NUMBER(19,0) NOT NULL,
ts1 NUMBER(19,0),
ts2 NUMBER(19,0),
role1 CHAR(1),
role2 CHAR(1),
state NUMBER(10,0),
rep_checksum NUMBER(19,0),
PRIMARY KEY(tt_store_pair));
CREATE INDEX testuser.TT_03_RepActiveStandby_ix
ON testuser.TT_03_RepActiveStandby
( tt_store_id1, tt_store_id2 );
GRANT INSERT, UPDATE, DELETE, SELECT
ON testuser.TT_03_RepActiveStandby TO PUBLIC;
4. 剪切并粘贴SQL码到SQL*Plus会话以创建TT_version_REPPEERS。二选其一,可以从一个PassThrough属性被设置为3进行连接的TimesTen中的ODBC或JDBC程序中执行此代码。
如果AWT缓存集合是活动的备用对中的副本,还要创建TT_version_REPACTIVESTANDBY和TT_version_REPACTIVESTANDBY_IX。
Oracle对象的配置安装
为了确定安装在Oracle中的对象,登录Oracle帐号并从Oracle SQL *Plus命令提示符执行下列查询:
SQL> select owner, object_name, object_type from all_objects where
object_name like 'TT/___/_%' escape '/';
输出应该包含对象,相似如下:
OWNER OBJECT_NAME OBJECT_TYPE
------------- ------------------------------ ------------------
TESTUSER TT_03_34520_L TABLE
TESTUSER TT_03_34520_T TRIGGER
TESTUSER TT_03_USER_COUNT TABLE
TESTUSER TT_03_REPPEERS TABLE
删除Oracle对象
如果Oracle对象由Cache Connect to Oracle自动安装,则当设置AUTOREFRESH为OFF或使用DROP CACHE GROUP来删除缓存集合时,将自动删除。
如果手工安装Oracle对象,可以通过在Oracle系统中执行代码来卸载它们来删除对象。为了从TimesTen获得卸载代码,使用下列方式之一:
• 从ttIsql提示符,输入一条cachesqlget命令,指定uninstall。
• 从一个程序,调用ttCacheSqlGet程序并设置install_flag为0。
注意:如果在删除或改变自动刷新缓存集合之后立即关闭缓存代理,则它可能不会卸载Oracle对象。当重启缓存代理时,它将卸载删除或改变自动刷新缓存集合时留下的Oracle对象。
为AWT缓存集合手工删除Oracle对象
在从所有使用一个Oracle实例的数据存储中删除所有的AWT缓存集合之后,要为AWT缓存集合删除Oracle对象。
1. 从ttIsql会话,执行cachesqlget命令来获取SQL来删除对象。在此例中,DSN为cgDSN,并且用户是testuser。
> ttIsql cgDSN
Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH UNINSTALL;
输出相似如下:
DROP TABLE testuser.TT_03_RepPeers;
DROP TABLE testuser.TT_03_RepActiveStandby;
2. 剪切并粘贴此SQL到SQL*Plus会话来删除对象。二选其一,可以从使用PassThrough属性被设置为3的TimesTen连接中的ODBC或JDBC程序中执行此代码。