??xml version="1.0" encoding="utf-8" standalone="yes"?>91大神亚洲影视在线,亚洲精品理论电影在线观看,国产亚洲精品拍拍拍拍拍http://www.tkk7.com/yrJavaWorld/zh-cnMon, 12 May 2025 11:12:28 GMTMon, 12 May 2025 11:12:28 GMT60resolution to "Can't rollforward due to large bufferpool size "http://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104024.htmlMyJavaWorldMyJavaWorldThu, 15 Mar 2007 07:21:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104024.htmlhttp://www.tkk7.com/yrJavaWorld/comments/104024.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104024.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/104024.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/104024.htmlQuestion:
The restore command works fine, but while attempting the rolforward of the sql logs, it complains about database falling short on bufferpool,and then terminates the rollforward process. One close look at the db2diag.log file, I noticed that db2 tried to start the database with the hidden bufferpool. But, apparently, that hidden bufferpool was pretty small to rollforward the logs and bring it online.

I cannot reduce the bufferpool size as the database cannot be connected to.I cannot connect to the database as it is in rollforward pending state. I cannot rollforward the database, as it's not happy with the size of the *hidden* bufferpool and terminates.

Answer:

db2set DB2_OVERRIDE_BPF=50000

This will bring up all configured bufferpools using 50000 pages each. You
can choose a smaller/larger value that is suitable for your number of
bufferpools and available system memory. You can also configure each
bufferpool individually if you want

? 正数のペヹ{?
     OR
 <entry>[;<entry>...] (<entry>=<バッファヹ{プー?ID>,<ページ数> )

There is sitiuation that above solution does not work.

				When you try to create a bufferpool or alter a bufferpool to a
very large size and there is not enough memory in the system
, DB2 may occupies all pagespace and overrall performance of
the system become slow and may get hang at last because no
pagespace is available. Then after you connect the database
next time, DB2 will do crash recovery and still try to
allocate memory for this big bufferpool and occupy all
pagespace again. when you specify DB2_OVERRIDE_BPF parameter
to override bufferpool size, it doesn't take effect in this
situation. This is becasue DB2_OVERRIDE_BPF only applies for
bufferpools that already exist at startup, and not to
bufferpools that are created during crash recovery or roll
forward. We will fix this problem and check DB2_OVERRIDE_BPF
registry when creating bufferpools during crash recovery or
roll forward. This problem only occurs in a 64 bit instance.

		

Local fix

				You can use db2iupdt -w 32 <INSTNAME> to update the instance to
a 32 bit instance, then you can connect to the database
succefully. After that, use db2iupdt -w 64 <INSTNAME> to update
the instance to 64 bit again. Please take a backup at this
point, so we don't have to roll forward through bufferpool
creation that fails if we need restore and roll forward
database.

		

Problem summary

				Users Affected:
All users using 64 bit instance
Problem Description:
When you try to create a bufferpool or alter a bufferpool to a
very large size and there is not enough memory in the system
, DB2 may occupies all pagespace and overrall performance
of the system become slow and may get hang at last
because no pagespace is available. Then after you connect the
database at next time, DB2 will do crash recovery and still try
to allocate
memory for this big bufferpool and occupy all pagespace again.
In this situation, when you specify DB2_OVERRIDE_BPF parameter
to override bufferpool size, it doesn't take effect in this
situation. This
is becasue DB2_OVERRIDE_BPF only applies for bufferpools that
already exist at startup, and not to bufferpools that are
created during crash recovery or roll forward. We will fix
this problem and check
DB2_OVERRIDE_BPF registry when creating bufferpools during crash
recovery or roll forward. This problem only occurs in 64 bit
instance.
Problem Summary:
This problem is caused by a misoperation, when you create or alt
er a bufferpool, the size is too large to allocated from OS and
cause overrall performance of the system is very slow and seems
hang. Another problem is that DB2_OVERRIDE_BPF registry only app
lies to bufferpools that already exists, and not bufferpools wil
l be created in crash recovery or roll forward. So DB2 will try
to create this big bufferpool again when doing crash recovery or
 roll forward. We will fix this problem and check DB2_OVERRIDE_B
PF registry in our crash recovery and roll forward code.

		

Problem conclusion

				
				
		

Temporary fix

				You can use db2iupdt -w 32 <INSTNAME> to update the instance to
a 32 bit instance, then you can connect to the database
succefully. After that, use db2iupdt -w 64 <INSTNAME> to update
the instance to 64 bit again. Please take a backup at this
point, so we don't have to roll forward through bufferpool
creation that fails if we need restore and roll
forward database.Please also notice that be careful when creati
ng bufferpool, don't specify a too large value.

		




MyJavaWorld 2007-03-15 15:21 发表评论
]]>
about DB2 Administration (refer from others)http://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104021.htmlMyJavaWorldMyJavaWorldThu, 15 Mar 2007 07:00:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104021.htmlhttp://www.tkk7.com/yrJavaWorld/comments/104021.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2007/03/15/104021.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/104021.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/104021.html Change db2 password in db2 level

DB2 depends on operation system level authorization to control DB2 system access.

In some case, our db2 account only allows to connect to instance or database, but not log on the system. In other words, we are not able to use the account to get a shell on unix or logon locally on windows.

As usual, when we need to change db2 password, we take action on the system level because it's more frank. But in the case above that we can't get logon, we have to do it on db2 level. There are 2 ways.

  • Use the GUI tool DB2 Configuration Assistance
  • Use the command line tools DB2 CLP or CE

Using DB2 Configuration Assistance

Right click on a database name, then choose "Change password".

CA tool interface

Note: When more than one databases live in same system, we might share the same account in multi-database. Changing password for one of them will affect all databases in this system. In other words, we don't need to do the change on each database, we could choose any we have privileges on the system.

Limitation: We are not able to change our password in the case of that we are only allowed to attach to the node but not connect to any database, or we don't get the catalog information for any database in the node.

For this limitation, it works out with the 2nd way. 

Using DB2 CLP and CE

We could use CLP and CE to change password for databases and nodes that we connected or attached to.

  • Change by connecting to database
C:\> db2 connect to SAMPLE user TEST using OLDPWD new NEWPWD confirm NEWPWD
C:\> db2 connect to SAMPLE user TEST using OLDPWD change password
  • Change by attaching to node, this way works out for the limitation in Configuration Assistance
C:\> db2 attach to NODE user TEST using OLDPWD new NEWPWD confirm NEWPWD
C:\> db2 attach to NODE user TEST using OLDPWD change password


alter table xxx VOLATILE

valatile

  • a. 反复无常?挥发性的

VOLATILE CARDINALITY or NOT VOLATILE CARDINALITY
Indicates to the optimizer whether or not the cardinality of table table-name can
vary significantly at run time. Volatility applies to the number of rows in the
table, not to the table itself. CARDINALITY is an optional keyword. The default
is NOT VOLATILE.

VOLATILE
Specifies that the cardinality of table table-name can vary significantly at
run time, from empty to large. To access the table, the optimizer will use
an index scan (rather than a table scan, regardless of the statistics) if that
index is index-only (all referenced columns are in the index), or that index
is able to apply a predicate in the index scan. The list prefetch access method
will not be used to access the table. If the table is a typed table, this option
is only supported on the root table of the typed table hierarchy (SQLSTATE 428DR).

NOT VOLATILE
Specifies that the cardinality of table-name is not volatile.
Access plans to this table will continue to be based on existing statistics and
on the current optimization level.

NOTE: The keyword could be specified within ALTER TABLE, but not CREATE TABLE.

 

Difference between Local and System Database Directory

DB2 automatically catalogs databases when they are created. It catalogs an entry
for the database in the local database directory and another entry in the system
database directory. If the database is created from a remote client (or a client which
is executing from a different instance on the same machine), an entry is also made
in the system database directory at the client instance.

Databases on the same node as the database manager instance are cataloged as
indirect entries. Databases on other nodes are cataloged as remote entries.

List DBs in Local Database Directory

$ db2 list db directory on /path_to_where_db_created 

List DBs in System Database Directory

$ db2 list db directory

 

Illustration of standard tables

Standard Tables Overview

Query the status for one specified tablespace?

As we know, we could issue following command to query status for all of tablespaces in current connected DB.

$ db2 list tablespaces show detail > /tmp/ts.list

Then find the status for the tablespaces we concerned.

Is there's a way to query the status for one specified tablespace?

My answer is No. 

  1. First, I don't find the related column defination in the table or view:
    • sysibm.systablespaces
    • syscat.tablespaces
  2. Second, I don't think DB2 stores the status flag within syscata tables. The reason is that once a tablespace comes into a special status, it will not be allowed changing any longer(this may also happen on a system catalog tablespace.) that will lead to a conflict on changing the tablespace status flag if stores it within system catalog tables.

Illustration of the DMS table-space address map

address map for DMS TS

DB2 directories and files

  • http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/c0005420.htm

Illustration of DB2 architechure and process

overview for tuning

Reference

  • http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/c0005418.htm 

Tablespaces are put into backup pending after a load

DB2 sets tablespace as Backup Pending state after loading data into a table in linear logging database(that is, logretain or userexit is on), whatever the load is successful or failed. the reason is that the load process will not write log file. from the begin time of loading to the end time of loading, there will be a blank segment in log file, and the rollforward recovery can Not jump over the blank segment to apply the later log file.

so database needs a backup after loading to make sure db2 have recovery capicibility.

it's able to use [COPY YES|NO]  or [NONRECOVERABLE] to prevent tablespace go into Backup Pending state. COPY YES will do the backup automatically after loading, and COPY NO and NONRECOVERABLE will give up this backup that means db2 will be not able to recover the database once an serious error occured.


l箋阅读 "Tablespaces are put into backup pending after a load" 的剩余内?/p>

Come pending when droping Procedures

Problem Description 

There's no any response for creating or droping any procedures in DB2. Seems it's pending there, without any error returned. This time UPDATE statement on tables could be issued successfully.

Check Process

Check OS disk available

$ df -kl 

Check database configure

db2 => get db cfg |more 

Check system catalog tablespace 

db2 => list tablespaces show detail |more
syscatspace 0x0000 

Cause 

It caused by issuing CREATE or DROP statement without COMMIT or ROLLBACK statement in CLP which is in non-Autocommit mode.

Solution 

After you issue a COMMIT or a ROLLBACK in the CLP or close it, the pending is gone.

We must be very careful when we use client in non-Autocommit mode just like CLPs in this case.

To check the Autocommit mode in CLP issues. Refer to:

set COMMIT mode in db2 clp

db2 => list command options

-c 自动落实 OFF

More 

From this point, we could get more. Most of strange things like this(pending there and no error return) are caused by locking.

In this case, it was only the opertation on procedures being pended, so track on this thread to suppose the syscat tables related with procedures are locked then find the what probably causes it.
 

db2 can not create index on local view

There's an object called index view since MS SQL Server 2000, it's an index which is created on an view which is based on a local table. it is attent to imporve the select performence on the view when this view is based on multi-table and has complex logic.

I try to find a simular thing in DB2, but there's no the simular solution in DB2 v8.2 for now. Instead, I found another thing instested.

DB2 allows creating index on the tables or views in remote data source, such as a database on another host or an XML data source. To be exactly, that's Not true Index, it's Index Specification. It requests that the tables in remote data source have created index in its own system. And it only repeat the index description in local system.

										Local DB2 Env                                            Remote DB2 Env
										

Index Specification    ->    Nickname   - - ->   True Index    ->    Table

See following example in DB2 info center.

  • CREATE INDEX statement
    http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0000919.htm?resultof=%22%63%72%65%61%74%65%22%20%22%63%72%65%61%74%22%20%22%69%6e%64%65%78%22%20%22%73%74%61%74%65%6d%65%6e%74%22%20

Example 3:  The nickname EMPLOYEE references a data source table called CURRENT_EMP. After this nickname was created, an index was defined on CURRENT_EMP. The columns chosen for the index key were WORKDEBT and JOB. Create an index specificationindex. Through this specification, the optimizer will know that the index exists and what its key is. With this information, the optimizer can improve its strategy to access the table. that describes this

   CREATE UNIQUE INDEX JOB_BY_DEPT
ON EMPLOYEE (WORKDEPT, JOB)
SPECIFICATION ONLY

Note: the Nickname is only allowed to be created on tables in local database and on much kind of objects at remote data source. It's not allowed to be created on views in local database.

set COMMIT mode in db2 clp

As default, DB2 CLP will do commit after you issue each DB2 statements or SQL automatically.

If you want to change it instead of issuing COMMIT or ROLLBACK manually, do following.

SQLLIB\BIN> db2
db2 => list command options
    -c   ON
db2 => update command options using c off
db2 => list command options
    -c   OFF

This change will only exists during this session. The setting will lose when you close this CLP and open CLP next time.

following cmd will get the same result with above.

SQLLIB\BIN> db2 list command options
    -c    ON
SQLLIB\BIN> db2 +c
db2 =>
db2 => list command options
    -c    OFF
db2 => quit
SQLLIB\BIN> db2 list command options
    -c    ON

There's also the way to keep the settings forever, do following.

SQLLIB\BIN\> db2 list command options
    -c   ON
SQLLIB\BIN\> db2set db2options=+c
SQLLIB\BIN\> db2 list command options
    -c   OFF

This change will take effection immediately even for others having been opened CLP windows. And will keep along.

Use following cmd set it back to ON. 

SQLLIB\BIN> db2set db2opptions=-c

Reference

表与索引的重命名 RENAME

在DB2 中重命名表或者烦?/p>

db2=> RENAME TABLE EMP TO EMPLOYEE
db2=> RENAME TABLE ABC.EMP TO EMPLOYEE
db2=> RENAME INDEX NEW-IND TO IND
db2=> RENAME INDEX ABC.NEW-IND TO IND


MyJavaWorld 2007-03-15 15:00 发表评论
]]>
三个UNIX文g旉ctime、mtime、atimehttp://www.tkk7.com/yrJavaWorld/archive/2007/03/13/103602.htmlMyJavaWorldMyJavaWorldTue, 13 Mar 2007 09:51:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2007/03/13/103602.htmlhttp://www.tkk7.com/yrJavaWorld/comments/103602.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2007/03/13/103602.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/103602.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/103602.html       我曾l根据文件的状态在指定旉内是否改变写q一个WatchDog来对服务q行监控Q其间曾被这三个旉搞؜淆,所以觉得很有必要和大家分n我对q三个术语的理解?br />      ctimeQchange timeQ改变时_是指文g状态最后一ơ被改变的时_
      mtimeQmodification timeQ修Ҏ(gu)_是指文g内容最后一ơ被改变的时_
      atimeQaccess timeQ访问时_是指文g最后一ơ被d的时间?br />      前两者的区别在于文件状态的改变既包括文件烦引节点的改变Q也包括文g内容的改变。也是说如果你改变了文件内容,则同时更Cctime和mtimeQ但是如果你只改变了文g索引节点则只是改变了ctime。atime只有在文件被d的时侯才会改变。它的改变与文g状态以及文件内容的改变没有直接的联pR?br />     例如Qecho “Hello World?>> myfile 则同时改变了ctime和mtimeQatime不变Q?br />     chmod u+x myfile 则只改变了ctime,mtime和atime不变?br />     cat myfileQ则只改变了atimeQctime和mtime不变
     ps:以上操作均在redhat linux下验证通过

MyJavaWorld 2007-03-13 17:51 发表评论
]]>
DB2/SQL命o大全http://www.tkk7.com/yrJavaWorld/archive/2006/12/28/90530.htmlMyJavaWorldMyJavaWorldThu, 28 Dec 2006 08:57:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2006/12/28/90530.htmlhttp://www.tkk7.com/yrJavaWorld/comments/90530.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2006/12/28/90530.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/90530.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/90530.html
 
 
查看文章
 
DB2/SQL命o大全
2006-12-25 13:21

q接数据库:

  connect to [数据库名] user [操作用户名] using [密码] 

创徏~冲?8K)Q?/p>

  create bufferpool ibmdefault8k IMMEDIATE  SIZE 5000 PAGESIZE 8 K ;
创徏~冲?16K)(OA_DIVERTASKRECORD)Q?br />  create bufferpool ibmdefault16k IMMEDIATE  SIZE 5000 PAGESIZE 16 K ;
创徏~冲?32K)(OA_TASK)Q?br />  create bufferpool ibmdefault32k IMMEDIATE  SIZE 5000 PAGESIZE 32 K ;

创徏表空_

  CREATE TABLESPACE exoatbs IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 8K MANAGED BY SYSTEM USING ('/home/exoa2/exoacontainer') EXTENTSIZE 32 PREFETCHSIZE 16  BUFFERPOOL IBMDEFAULT8K  OVERHEAD 24.10 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

  CREATE TABLESPACE exoatbs16k  IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 16K MANAGED BY SYSTEM USING ('/home/exoa2/exoacontainer16k'   ) EXTENTSIZE 32  PREFETCHSIZE 16  BUFFERPOOL IBMDEFAULT16K  OVERHEAD 24.1 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

  CREATE TABLESPACE exoatbs32k  IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 32K MANAGED BY SYSTEM USING ('/home/exoa2/exoacontainer32k'   ) EXTENTSIZE 32  PREFETCHSIZE 16  BUFFERPOOL IBMDEFAULT32K  OVERHEAD 24.1 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

GRANT USE OF TABLESPACE exoatbs TO PUBLIC;
GRANT USE OF TABLESPACE exoatbs16k TO PUBLIC;
GRANT USE OF TABLESPACE exoatbs32k TO PUBLIC;

创徏pȝ表空_

  CREATE TEMPORARY TABLESPACE exoasystmp IN DATABASE PARTITION GROUP IBMTEMPGROUP PAGESIZE 8K  MANAGED BY SYSTEM USING ('/home/exoa2/exoasystmp'   ) EXTENTSIZE 32 PREFETCHSIZE 16 BUFFERPOOL IBMDEFAULT8K  OVERHEAD 24.10 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

  CREATE TEMPORARY TABLESPACE exoasystmp16k IN DATABASE PARTITION GROUP IBMTEMPGROUP PAGESIZE 16K MANAGED BY SYSTEM USING ('/home/exoa2/exoasystmp16k'  ) EXTENTSIZE 32 PREFETCHSIZE 16 BUFFERPOOL IBMDEFAULT16K OVERHEAD 24.10 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

  CREATE TEMPORARY TABLESPACE exoasystmp32k IN DATABASE PARTITION GROUP IBMTEMPGROUP PAGESIZE 32K MANAGED BY SYSTEM USING ('/home/exoa2/exoasystmp32k') EXTENTSIZE 32 PREFETCHSIZE 16 BUFFERPOOL IBMDEFAULT32K OVERHEAD 24.10 TRANSFERRATE 0.90  DROPPED TABLE RECOVERY OFF;

1. 启动实例(db2inst1):

db2start

2. 停止实例(db2inst1):

db2stop

3. 列出所有实?db2inst1)

db2ilist

5.列出当前实例:

db2 get instance

4. 察看CZ配置文g:

db2 get dbm cfg|more

5. 更新数据库管理器参数信息:

db2 update dbm cfg using para_name para_value

6. 创徏数据?

db2 create db test

7. 察看数据库配|参C?/p>

db2 get db cfg for test|more

8. 更新数据库参数配|信?/p>

db2 update db cfg for test using para_name para_value

10.删除数据?

db2 drop db test

11.q接数据?/p>

db2 connect to test

12.列出所有表I间的详l信息?/p>

db2 list tablespaces show detail

13.查询数据:

db2 select * from tb1

14.删除数据:

db2 delete from tb1 where id=1

15.创徏索引:

db2 create index idx1 on tb1(id);

16.创徏视图:

db2 create view view1 as select id from tb1

17.查询视图:

db2 select * from view1

18.节点~目

db2 catalog tcp node node_name remote server_ip server server_port

19.察看端口?/p>

db2 get dbm cfg|grep SVCENAME

20.试节点的附?/p>

db2 attach to node_name

21.察看本地节点

db2 list node direcotry

22.节点反编?/p>

db2 uncatalog node node_name

23.数据库编?/p>

db2 catalog db db_name as db_alias at node node_name

24.察看数据库的~目

db2 list db directory

25.q接数据?/p>

db2 connect to db_alias user user_name using user_password

26.数据库反~目

db2 uncatalog db db_alias

27.导出数据

db2 export to myfile of ixf messages msg select * from tb1

28.导入数据

db2 import from myfile of ixf messages msg replace into tb1

29.导出数据库的所有表数据

db2move test export

30.生成数据库的定义

db2look -d db_alias -a -e -m -l -x -f -o db2look.sql

31.创徏数据?/p>

db2 create db test1

32.生成定义

db2 -tvf db2look.sql

33.导入数据库所有的数据

db2move db_alias import

34.重组?/p>

db2 reorgchk

35.重组表tb1

db2 reorg table tb1

36.更新l计信息

db2 runstats on table tb1

37.备䆾数据库test

db2 backup db test

38.恢复数据库test

db2 restore db test

399\.列出容器的信?/p>

db2 list tablespace containers for tbs_id show detail

40.创徏?

db2 ceate table tb1(id integer not null,name char(10))

41.列出所有表

db2 list tables

42.插入数据:

db2 insert into tb1 values(1,’sam?;

db2 insert into tb2 values(2,’smitty?;

. 建立数据库DB2_GCB 

CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB 

USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32 

2. q接数据库?/p>

connect to sample1 user db2admin using 8301206 

3. 建立别名 

create alias db2admin.tables for sysstat.tables; 

CREATE ALIAS DB2ADMIN.VIEWS FOR SYSCAT.VIEWS 

create alias db2admin.columns for syscat.columns; 

create alias guest.columns for syscat.columns; 

4. 建立表?/p>

create table zjt_tables as 

(select * from tables) definition only; 

create table zjt_views as 

(select * from views) definition only; 

5. 插入记录 

insert into zjt_tables select * from tables; 

insert into zjt_views select * from views; 

6. 建立视图 

create view V_zjt_tables as select tabschema,tabname from zjt_tables; 

7. 建立触发器?/p>

CREATE TRIGGER zjt_tables_del 

AFTER DELETE ON zjt_tables 

REFERENCING OLD AS O 

FOR EACH ROW MODE DB2SQL 

Insert into zjt_tables1 values(substr(o.tabschema,1,8),substr(o.tabname,1,10)) 

8. 建立唯一性烦引?/p>

CREATE UNIQUE INDEX I_ztables_tabname 

[size=3]ON zjt_tables(tabname); 

9. 查看表?/p>

select tabname from tables 

where tabname='ZJT_TABLES'; 

10. 查看列?/p>

select SUBSTR(COLNAME,1,20) as 列名,TYPENAME as cd,LENGTH as 长度 

from columns 

where tabname='ZJT_TABLES'; 

11. 查看表结构?/p>

db2 describe table user1.department 

db2 describe select * from user.tables 

12. 查看表的索引 

db2 describe indexes for table user1.department 

13. 查看视图 

select viewname from views 

where viewname='V_ZJT_TABLES'; 

14. 查看索引 

select indname from indexes 

where indname='I_ZTABLES_TABNAME'; 

15. 查看存贮q程 

SELECT SUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15) 

FROM SYSCAT.PROCEDURES; 

16. cd转换(cast) 

ip datatype:varchar 

select cast(ip as integer)+50 from log_comm_failed 

17. 重新q接 

connect reset 

18. 中断数据库连接?/p>

disconnect db2_gcb 

19. view application 

LIST APPLICATION; 

20. kill application 

FORCE APPLICATION(0); 

db2 force applications all (所有应用程序从数据库断开) 

21. lock table

lock table test in exclusive mode 

22. ׃n 

lock table test in share mode 

23. 昄当前用户所有表 

list tables 

24. 列出所有的pȝ表?/p>

list tables for system 

25. 昄当前zd数据库?/p>

list active databases 

26. 查看命o选项 

list command options 

27. pȝ数据库目录?/p>

LIST DATABASE DIRECTORY 

28. 表空闾b?/p>

list tablespaces 

29. 表空间容器?/p>

LIST TABLESPACE CONTAINERS FOR 

Example: LIST TABLESPACE CONTAINERS FOR 1 

30. 昄用户数据库的存取权限 

GET AUTHORIZATIONS 

31. 启动实例 

DB2START 

32. 停止实例 

db2stop 

33. 表或视图Ҏ(gu) 

grant select,delete,insert,update on tables to user 

grant all on tables to user WITH GRANT OPTION 

34. E序包特权?/p>

GRANT EXECUTE 

ON PACKAGE PACKAGE-name 

TO PUBLIC 

35. 模式Ҏ(gu) 

GRANT CREATEIN ON SCHEMA SCHEMA-name TO USER 

36. 数据库特权?/p>

grant connect,createtab,dbadm on database to user 

37. 索引Ҏ(gu) 

grant control on index index-name to user 

38. 信息帮助 (? XXXnnnnn ) 

?? SQL30081 

39. SQL 帮助(说明 SQL 语句的语? 

help statement 

例如Qhelp SELECT 

40. SQLSTATE 帮助(说明 SQL 的状态和cd代码) 

? sqlstate 或? class-code 

41. 更改?理服务?相关的口令?/p>

db2admin setid username password 

42. 创徏 SAMPLE 数据库?/p>

db2sampl 

db2sampl F:(指定安装? 

43. 使用操作pȝ命o 

! dir 

44. 转换数据cd (cast) 

SELECT EMPNO, CAST(RESUME AS VARCHAR(370)) 

FROM EMP_RESUME 

WHERE RESUME_FORMAT = 'ascii' 

45. UDF

要运行 DB2 Java 存储q程或 UDFQ还需要更新服务器上的 DB2 数据库管理程序配|,以包括在该机器上安装 JDK 的\径?/p>

db2 update dbm cfg using JDK11_PATH d:sqllibjavajdk 

TERMINATE 

update dbm cfg using SPM_NAME sample 

46. 查 DB2 数据库管理程序配|?/p>

db2 get dbm cfg 

47. 索具有特权的所有授权名 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE ' FROM SYSCAT.TABAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX ' FROM SYSCAT.INDEXAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN ' FROM SYSCAT.COLAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA ' FROM SYSCAT.SCHEMAAUTH 

UNION 

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER ' FROM SYSCAT.PASSTHRUAUTH 

ORDER BY GRANTEE, GRANTEETYPE, 3 

create table yhdab 

(id varchar(10), 

password varchar(10), 

ywlx varchar(10), 

kh varchar(10)); 

create table ywlbb 

(ywlbbh varchar(8), 

ywmc varchar(60)) 

48. 修改表结构?/p>

alter table yhdab ALTER kh SET DATA TYPE varchar(13); 

alter table yhdab ALTER ID SET DATA TYPE varchar(13); 

alter table lst_bsi alter bsi_money set data type int; 

insert into yhdab values 

('20000300001','123456','user01','20000300001'), 

('20000300002','123456','user02','20000300002'); 

49. 业务cd说明 

insert into ywlbb values 

('user01','业务甌'), 

('user02','业务撤消'), 

('user03','费用查询'), 

('user04','费用自缴'), 

('user05','费用预存'), 

('user06','密码修改'), 

('user07','发票打印'), 

('gl01','改用户基本信?), 

('gl02','更改支付信息'), 

('gl03','日统计功?), 

('gl04','冲帐功能'), 

('gl05','对帐功能'), 

('gl06','计费功能'), 

('gl07','l合l计') 

备䆾数据库:
CONNECT TO EXOA;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET;
BACKUP DATABASE EXOA TO "/home/exoa2/db2bak/" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
CONNECT TO EXOA;
UNQUIESCE DATABASE;
CONNECT RESET;

以下是小弟在使用db2move中的一些经验,希望对大家有所帮助。?/p>

 db2   connect   to  YOURDB   
q接数据库?/p>

 db2look -d  YOURDB  -a -e -x -o creatab.sql 
导出建库表的SQL 

 db2move   YOURDB  export 
用db2move数据备份出来?/p>

 vi   creatab.sql 
如要导入的数据库名与原数据库不同Q要修改creatab.sql中CONNECT ?br />如相同则不用更改 

 db2move  NEWDB  load 
数据导入新库中 

在导入中可能因ؓU种原因发生中断Q会使数据库暂挂 
db2    list tablespaces   show   detail 
如: 
      详细说明Q?br />     装入暂挂 
 总页敊W                        ? 1652 
 可用|                        = 1652 
 已用|                         = 1652 
 I闲|                         = 不适用 
 高水位标讎ͼ)                 = 不适用 
 大(字节Q                  ? 4096 
 盘区大小Q页Q                  ? 32 
 预读取大()                 = 32 
 容器敊W                         ? 1 
 状态更改表I间标识                    = 2 
 状态更改对象标识                     ? 59 

 db2 select tabname,tableid from syscat.tables where tableid=59 
查看是哪张表挂v 

表名知道后到db2move.lst(在db2move  YOURDB  export的目录中)中找到相应的.ixf文g 
 db2 load from tab11.ixf of ixf terminate into db2admin.xxxxxxxxx 
tab11.ixf对应的是xxxxxxxxx表?/p>

数据库会恢复正常Q可再用db2 list tablespaces show detail查看

30.不能通过GRANT授权的权限有哪种?

SYSAM

SYSCTRL

SYSMAINT

要更该述权限必须修改数据库管理器配置参数

31.表的cd有哪?

怹?)

临时?说明?

临时?z?

32.如何知道一个用h多少?

SELECT*FROMSYSIBM.SYSTABLESWHERECREATOR='USER'

33.如何知道用户下的函数?

select*fromIWH.USERFUNCTION

select*fromsysibm.SYSFUNCTIONS

34.如何知道用户下的VIEW?

select*fromsysibm.sysviewsWHERECREATOR='USER'

35.如何知道当前DB2的版?

select*fromsysibm.sysvERSIONS

36.如何知道用户下的TRIGGER?

select*fromsysibm.SYSTRIGGERSWHERESCHEMA='USER'

37.如何知道TABLESPACE的状?

select*fromsysibm.SYSTABLESPACES

38.如何知道SEQUENCE的状?

select*fromsysibm.SYSSEQUENCES

39.如何知道SCHEMA的状?

select*fromsysibm.SYSSCHEMATA

40.如何知道INDEX的状?

select*fromsysibm.SYSINDEXES

41.如何知道表的字段的状?

select*fromsysibm.SYSCOLUMNSWHERETBNAME='AAAA'

42.如何知道DB2的数据类?

select*fromsysibm.SYSDATATYPES

43.如何知道BUFFERPOOLS状况?

select*fromsysibm.SYSBUFFERPOOLS

44.DB2表的字段的修攚w?

只能修改VARCHAR2cd的ƈ且只能增加不能减?

45.如何查看表的l构?

DESCRIBLETABLETABLE_NAME

OR

DESCRIBLESELECT*FROMSCHEMA.TABLE_NAME

 
 

     
 


MyJavaWorld 2006-12-28 16:57 发表评论
]]>
DB2 UDB中用户出口程序是如何工作?/title><link>http://www.tkk7.com/yrJavaWorld/archive/2006/12/08/86425.html</link><dc:creator>MyJavaWorld</dc:creator><author>MyJavaWorld</author><pubDate>Fri, 08 Dec 2006 10:12:00 GMT</pubDate><guid>http://www.tkk7.com/yrJavaWorld/archive/2006/12/08/86425.html</guid><wfw:comment>http://www.tkk7.com/yrJavaWorld/comments/86425.html</wfw:comment><comments>http://www.tkk7.com/yrJavaWorld/archive/2006/12/08/86425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrJavaWorld/comments/commentRss/86425.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrJavaWorld/services/trackbacks/86425.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together; mso-outline-level: 1"> <b>DB2 UDB中用户出口程序是如何工作的?</b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">采用用户出口E序与DB2 UDB共同工作背后的基本思想是提供一U归档和索数据库日志文g的方法以实现日志冗余处理q从易失性介质上转储出来。重要的Q值得注意的是Q根据你的特D需求,在用户出口程序当中,除了能实现归和索日志之外,你还可以实现其他的操作?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">如果一个数据库需要采用归档日志文件来q行恢复Q在DB2 UDB中实行用户出口程序策略将不能恢复100%的事务。用户出口程序只是一U通过拯已经存在的日志文件到一个安全的地方来ؓ其提供更多保护的Ҏ(gu)。它是数据完整性策略中的一部分Q而且是重要的一部分?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">~译了用户出口程序之后,可执行程序db2uext2被放|在数据库管理器可以扑ֈ的目录当中。在UNIX<font face="Times New Roman">©</font>中,q个目录?instance home="" />/sqllib/admQ在Windows<font face="Times New Roman">©</font>中,?drive letter="" />Program FilesIBMSQLLIBBIN?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">除非数据库管理器知道用户出口E序是可用的Q不然它不会调用db2uext2。让数据库管理器知道db2uext2可以被调用的唯一Ҏ(gu)是将数据库配|参数userexit讄为on。一旦这个参数被讑֮好而且DB2实例被重复利用了Q数据库理器将每五分钟调用一ơ用户出口程序来查那些可以被归档到程序相关的归档目录的日志文件?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">如果数据库的恢复是必要的Q在前滚操作期间Q数据库理器将调用db2uext2把归日志文件拷贝回zd的日志目录当中。然后,日志文g被再ơ运用到重徏的数据库中?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">让我们看看被数据库管理器生成的到用户出口E序的调用的格式。注意,q一信息也可以在用户出口CZE序的注释部分找到?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">db2uext2 -OS<os /> -RL<release /></p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">-RQ<request /> -DB<dbname /> -NN<nodenumber /></p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">-LP<logpath /> -LN<logname /> [-AP]</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">其中Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">os=操作pȝ</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">release=DB2发行版本</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">request= 'ARCHIVE' ?'RETRIEVE'</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">dbname=数据库名</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">nodenumber=节点?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">logpath=日志文g目录</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">logname=日志文g?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">logsize=日志文g大小Q可选)</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">startingpage=?kؓ单位的v始偏U量Q可选)</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">adsmpasswd=ADSM密码Q可选)</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> <b>注意</b>Q只有当logpath讑֤时才使用logsize和startingpage?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">归或者从盘?gu)索日志文仉从以下命名规则:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">归Q归\径+数据库名Q节点号Q日志文件名</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">索:索\径+数据库名Q节点号Q日志文件名</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">比如Q如果归的路径为”c:mylogs?</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">索\径是“c:mylogs”,</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">数据库名是“SAMPLE”,</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">节点h NODE0000Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">文g名是 S0000001.LOGQ?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">日志文g是Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">归档?- c:mylogsSAMPLENODE0000S0000001.LOG</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">索自 - c:mylogsSAMPLENODE0000S0000001.LOG</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">以下描述了用户出口程序中的逻辑是如何运转的Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">1)  安装信号处理E序?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">2)  验证传递的参数个数?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">3)  验证操作h?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">4)  开始审计跟t(如果有此hQ?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">5)  Ҏ(gu)操作需求的不同获取以下路径中的一个:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1" align="left">a)  如果操作需求ؓ归档一个文Ӟ日志文件从日志路径拯到归档\径中?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">iQ?如果没有扑ֈ日志文gQ执行第6炏V?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1" align="left">b)  如果操作需求是索一个文Ӟ日志文件从索\径拷贝到日志路径中?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">iQ?如果没有扑ֈ日志文gQ执行第6炏V?br /><br />6) 错误记入日志(如果要求或者有需要的话)?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">7)  l束审计跟踪Q如果有hQ?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">8)  以适当的返回码退出?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">手工调用用户出口E序来归日志文件是可以的,但最好还是用ARCHIVE LOG命o以便在定义以上参数时不会因ؓ你的原因D错误。在q篇文章的末,可以扑ֈ关于ARCHIVE LOG命o的链接?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>日志文g术语</b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">DB2 中用户出口程序的基本功能是将日志文g拯到活动日志目录或反之。这里,值得指出一些术语来阐明zd的日志目录被|于何处以及数据库日志文件的状态如何?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>zd日志目录Q?/b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">该目录被|于你的数据库目录中。在Windows中,如果在C:中创Z一个叫做SAMPLE的单一数据库且实例名ؓdb2inst1Q则会出现以下的目录结构:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">C:DB2INST1NODE0000SQL000001SQLOGDIR</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-outline-level: 1">SQL00001是SAMPLE数据库的数据库目录,SQLOGDIR 是活动日志目录?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">以下的图1昄了Windows操作pȝ上的zd日志目录Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center"> <shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" /> <stroke joinstyle="miter" /> <formulas /> <f eqn="if lineDrawn pixelLineWidth 0" /> <f eqn="sum @0 1 0" /> <f eqn="sum 0 0 @1" /> <f eqn="prod @2 1 2" /> <f eqn="prod @3 21600 pixelWidth" /> <f eqn="prod @3 21600 pixelHeight" /> <f eqn="sum @0 0 1" /> <f eqn="prod @6 1 2" /> <f eqn="prod @7 21600 pixelWidth" /> <f eqn="sum @8 21600 0" /> <f eqn="prod @7 21600 pixelHeight" /> <f eqn="sum @10 21600 0" />PATH o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /><lock v:ext="edit" aspectratio="t" />SHAPE id=_x0000_i1025 style="WIDTH: 299.25pt; HEIGHT: 180.75pt" type="#_x0000_t75" /><imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/01/clip_image001.png" o:title="" />/P> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: center; mso-layout-grid-align: none" align="center">?1zd日志目录</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>日志文g状?/b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">在活动日志目录中Q日志文件可以是zd日志Q也可以是联机归日志。活动日志是那些?DB2 用于当前事务处理和崩溃恢复的日志。联机归日志是那些 DB2 UDB q行常规处理时不再需要,而进行数据库恢复时可能还会需要的日志。当实现用户出口E序Ӟq些联机归日志最l以归档日志目录中的副本形式出现?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">既然<font face="Times New Roman"> DB2 UDB </font>中用户出口程序的目的是将数据库日志拷贝到归目录中,你将最l在zd日志目录Q缺省ؓ<font face="Times New Roman"> SQLOGDIR</font>Q中得到重复的日志文件。你可能考虑删除q些重复的联机归日志以释放文gpȝI间。在从数据库目录中除去这些日志之前,要十分小心地认它们是否已经成功地被复制到归目录中。还必须保数据库管理器q行崩溃恢复时不再需要它们。要定你的zd日志目录中哪些日志文件不为正常处理所需要,可用通过以下命o查数据库配置Q?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">         </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 24.75pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">     db2 "get db cfg for sample"</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">q条命o的数据库配置输出l果包含第一个活动日志文Ӟ如:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">First active log file = S000009.LOG</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">在如上所C的输出当中Q日志文件S000009.LOG是数据库当前的活动日志。Q何编h该日志文件小的日志文仉被看作联机归日志?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">q里有一个例子:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">在这个场景中Q活动日志目录中有日志文?S000000.LOG - S000009.LOGQ归日志目录中?S000000.LOG - S000008.LOG。因?S000009.LOG 是第一个活动日志文Ӟ所以,可以从活动日志目录中U走 S000001.LOG - S000008.LOG 以释攄盘空间。S000009.LOG 文g必须保留在活动日志目录中Q因为它仍然被当前事务用?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">同样可以通过查数据库历史文g来查看活动日志目录中哪些日志文g不再有用。以下命令将列出数据库备份信息:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 24.75pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">     db2 "list history backup all for database sample"</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">以下是该命o的输出结果的一个例子:</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">List History File for sample<br /><br /></p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">Number of matching file entries = 4</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">Op Obj Timestamp+Sequence Type Dev Earliest Log Current  Log </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">-- --- ------------------ ---- --- ------------------------ </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">B D 20030416162026001 F D S0000010.LOGS0000014.LOG</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">------------------------------------------------------------</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">Contains 2 tablespace(s):</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">00001 SYSCATSPACE </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; mso-outline-level: 1; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">00002 USERSPACE1</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">------------------------------------------------------------</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">在上面的输出中,最早的日志表C,需?S0000010.LOG 及其之后的Q何日志?S00000010.LOG 之前的Q何日志可以被安全的删除。再ơ提醒,在从zd日志目录中删除日志文件之前,验证在活动日志目录中存在q些日志文g的拷贝是十分重要的?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">虽然可以手动的从zd日志目录中删除日志文Ӟ删除联机归日志文g的安全方法是通过prune logfile命o。该命o可以用来删除zd归目录中的日志文g。在下面的示例中Q以下命令将删除日志文g S000000.LOG - S000008.LOGQ?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 24.75pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">     db2 "prune logfile prior to S000009.LOG"</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"> <b>注意Q?/b>Ҏ(gu)(zhn)的恢复{略Q可能会出现之前的前滚操作在数据库上执行的场景。归目录中的老日志文件可能被同名的新日志文g所覆盖Q从而阻止你使用旧日志文件对数据库进行时间点恢复。对用户出口E序的设计程序员来说Q考虑cMq样的情冉|很重要的?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>讄用户出口</b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">在本文中Q我们将采用DB2提供的db2uext2.cdisk样例cE序Q它位于你的c目录当中。在UNIX中,c目录位于<instance_home />/sqllib/samples。Windows中,q目录位于Program Files/IBM/<instance_name />/samples?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>在Windows中设|用户出?/b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b> </b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>修改和编译用户出口程?/b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">1.  创徏名ؓC:mylogs的目?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">2.  C:Program filesIBMSQLLIBsamplescdb2uext2.cdisk拯C个工作目录当?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">3.  对于本示例,用户出口E序的以下部分应该得以验证以反映路径 c:\mylogs\</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define ARCHIVE_PATH "c:\mylogs\" </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define RETRIEVE_PATH "c:\mylogs\" </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define AUDIT_ACTIVE 1 /* enable audit trail logging */ </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define ERROR_ACTIVE 1 /* enable error trail logging */ </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define AUDIT_ERROR_PATH "c:\mylogs\" </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">                 /* path must end with a slash */ </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define AUDIT_ERROR_ATTR "a" /* append to text file */ </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">#define BUFFER_SIZE 32 </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">    /* # of 4K pages for output buffer */</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">4.  定在你的系l中安装了被支持的C~译器(比如QMicrosoft Visual StudioQ而且环境中有该编译器的\径?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">5.  通过命o行,db2uext2.cdisk更名为db2uext2.cq构建:<br /><br />cl db2uext2.c</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none">一旦程序被~译Q将创徏db2uext2.exe和db2uext2.obj文g?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">6.  可执行文gdb2uext2.exe攑ֈ/SQLLIB/BIN目录当中从而数据库管理器能够定位q执行它用以归档和检索日志?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; mso-layout-grid-align: none; mso-pagination: lines-together"> <b>为用户出口创建ƈ准备数据?/b> </p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">7.  ?DB2 命oH口中用 db2sampl 命o创徏 SAMPLE 数据库。这你对下面的示例用样本表?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">db2sampl</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">8.  更新数据库配|文件以便ؓ数据库打开用户出口。请注意Q只能ؓ一个数据库分配用户出口E序Q因?bin 目录被所?DB2 实例׃n?/p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">db2 "update db cfg for sample using userexit on"</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left">db2stop force</p> <p> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 12pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso- </p>/P><img src ="http://www.tkk7.com/yrJavaWorld/aggbug/86425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrJavaWorld/" target="_blank">MyJavaWorld</a> 2006-12-08 18:12 <a href="http://www.tkk7.com/yrJavaWorld/archive/2006/12/08/86425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用keytool创徏密钥仓库 (?http://www.tkk7.com/yrJavaWorld/archive/2006/10/31/78328.htmlMyJavaWorldMyJavaWorldTue, 31 Oct 2006 09:18:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2006/10/31/78328.htmlhttp://www.tkk7.com/yrJavaWorld/comments/78328.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2006/10/31/78328.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/78328.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/78328.html 其实主要的就是要创徏一个密钥仓库以理(zhn)的公钥 / U钥Ҏ(gu)自?zhn)所信Q实体的证书?br />  
W一步:生成密钥?/span>
(zhn)首先要做的是创Z个密钥仓库和生成密钥寏V?zhn)可以使用以下命oQ?/span>  
keytool -genkey -keyalg RSA -keysize 512 -dname "cn=hyq,o=eagle,c=cn" -alias weblogic -keypass 123456 -keystore C:/mykeystore/weblogic.jks -storepass 123456 -validity 365

Q请注意Q键入该命o时必M其成Z行。此处用多行来显C,主要是ؓ了可L。)如下图:
Snap2.gif

该命令将?/span>  C  盘的 “mykeystore?/span> 目录中创建名?/span> “weblogic.jks?/span> 的密钥仓库,q赋予它口o ?/span> 123456 ?/span> 。它?yu)ؓ实体生成公?/span> / U钥对,该实体的 ?/span> 特征?/span> ?/span> 为:常用?/span> “hyq?/span> 、组l?/span> “eagle?/span> 和两个字母的国家代码 “cn?/span> 。?/span> -keyalg ”指定它使用的是那种密钥生成法来创建密钥,~省的是 “DSA?/span> 密钥生成法Q会使用~省?/span> ?/span> ?/span>  DSA  ?/span>  SHA{֐法Q,两个密钥Q公钥与U钥Q的长度?/span> 512 位,?/span> -keysize 来指定,默认的是 1024  位?/span>   该证书包括公钥和特征名信息。该证书的有效期?/span> 365 天,?/span> -validity 来指定,且与别名 “business?/span> 所代表的密钥仓库项兌。私钥被赋予口o ?/span> 123456 ?/span> ?/span>

 

命o行里 DName 信息注解

 

DN 信息?/span>

含义

CN

域名?/span> IP

OU

部门Q没有部门的可不要此?/span>

O

单位名称

L

单位地址

S

省䆾的拼韻IW一个字母大写)

C

国家的简?Q?/span> CN 代表中国Q?/span>


如果采用选项的缺省|可以大大~短该命令。实际上Q这些选项q不是必需的;对于有缺省值的选项Q未指定时将使用~省|对于M被要求的|(zhn)将会得到要求输入它的提C。例如:输入命o keytool -genkey -keystore "C:/tone.jks" -storepass 123456 -keyalg RSA Q就会有如下提示Q?br />Snap3.gif


注意Q这里的
密钥仓库路径一定要存在Q如果不存在的话Q它?yu)׃抛如下的异?br />

Snap4.gif
W二?/span>
: 产生证书hcertreq.pem 文g

使用如下命oQ?span lang="EN-US">

keytool -certreq -alias weblogic -sigalg "MD5withRSA" -file C:/mykeystore/certreq.pem -keypass 123456 -keystore C:/mykeystore/weblogic.jks -storepass 123456

Snap5.gif
q样?/span> C:/mykeystore/ 目录?/span> ׃产生一?/span> certreq.pem 文gQ内容如下:

-----BEGIN NEW CERTIFICATE REQUEST-----

MIHlMIGQAgEAMCsxCzAJBgNVBAYTAmNuMQ4wDAYDVQQKEwVlYWdsZTEMMAoGA1UEAxMDaHlxMFww

DQYJKoZIhvcNAQEBBQADSwAwSAJBAMhaIG2Ki7+RwZUP4gPBdTbnY38bisW16u1XUyysPxdNwSie

aSd6E3Hm277E7NjHoz56ZoaYdPPDmdiTkMrS9rcCAwEAAaAAMA0GCSqGSIb3DQEBBAUAA0EAYRNl

l5dyGgV9hhu++ypcJNQTrDIwjx1QT4fgVubrtIaHU0fzHamD5QG6PYddw9TL51XQHvu6tOS0NUc/

ItNKJw==

-----END NEW CERTIFICATE REQUEST-----

W三步:q就相对来说单多了,是?span lang="EN-US">CA提交证书h?br />    你可以随便从|上找一家免费的CA认证适用机构Q很多的Q,然后按照上面的提C行操作就可以了,q一步就要用到前面生成的certreq.pem 文g?/font>。(注意Q一定要下蝲根证书)
    生成的证书和下载的根证书放至你比较Ҏ(gu)扑ֈ的位|,我一般将它们和生成的jks文g攑ֈ一赗?br />
W四步:导入证书
    通过命oQkeytool -import -alias RootCA -trustcacerts -file C:/mykeystore/RootCADemo.cer -keystore C:/mykeystore/weblogic.jks -storepass 123456根证书导入W一步生成的weblogic.jks中,接着所有其它的证书按照此命令全部导入。(注意证书的别名不能重复,同时一?strong>注意要用?-trustcacertsQ否则,你在以后使用Ӟ它将会认Z导入的这些证书是不可信Q?Q就会导致你在配|SSL时不能正常的工作。)
    q就全部完成?font size="3">密钥仓库
的创建。然后就可以在支持这些证书格式的服务器上使用了。下一将会写一下在weblogic上如何配|双向SSL



MyJavaWorld 2006-10-31 17:18 发表评论
]]>
DB2数据库中的锁和ƈ发性控?/title><link>http://www.tkk7.com/yrJavaWorld/archive/2006/08/22/65040.html</link><dc:creator>MyJavaWorld</dc:creator><author>MyJavaWorld</author><pubDate>Tue, 22 Aug 2006 04:07:00 GMT</pubDate><guid>http://www.tkk7.com/yrJavaWorld/archive/2006/08/22/65040.html</guid><wfw:comment>http://www.tkk7.com/yrJavaWorld/comments/65040.html</wfw:comment><comments>http://www.tkk7.com/yrJavaWorld/archive/2006/08/22/65040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrJavaWorld/comments/commentRss/65040.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrJavaWorld/services/trackbacks/65040.html</trackback:ping><description><![CDATA[现在的DB2 UDBpȝ中, 主要通过锁和隔离U别q两个主要的工具来控制ƈ发连接,l护数据库中的数据在高ƈ发的环境下的安全? <p>我们在这里将要的阐述一下锁和隔ȝ别?/p><p>锁:</p><p>DB2 UDB中, 锁的主要作用对象是表和行Q?其他如表I间和烦引也是锁的对象, 但是因ؓ其多为系l控Ӟ 理员和用户使用较少Q在q里׃涉及了?</p><p>对于行锁和表锁, 它们的区别不a而喻Q?主要是锁的对象不同?当然锁对象的不同q带也会影响DB2的ƈ发能力?</p><p>DB2中的表锁主要有以下几种Q?/p><p>1Q?IS锁: 此锁作用于整个表Q表C拥有此锁的应用q接要读取表中的某些数据Q?但是在此应用q接d具体的数据时Q?q必获得该行的行锁;</p><p>2Q?IX锁: 此锁作用于整个表Q表C拥有此锁的应用q接需要独占用表中的某些数据Q?但是在此应用q接独占使用具体的数据时Q?q必获得该行上相应的行U锁Q?/p><p>3Q?SIX锁: 此锁是锁转换的物,表示应用q接拥有S和IX锁的Ҏ(gu);</p><p>4Q?S锁: 此锁作用于整个表Q?拥有此锁的应用连接可以读取表中的MU录Q?/p><p>5Q?U锁: 此锁作用于整个表Q?拥有此锁的应用连接可以读取表中的MU录Q也可以更新表中的纪录, 但是更新旉要再获得X锁; 此锁主要在“select ?with update”语句徏立的可更新游标中起作用, 其他的应用可以读取表中的U录Q?但是不能更新它;</p><p>6Q?X锁: 此锁作用于整个表Q?拥有此锁的应用连接独占的使用表中的Q何纪录;可以q行更新或其他操作;</p><p>7Q?Z锁: 此锁作用于整个表Q?也称独占锁,主要是在象修改表的定义?删除表这一cȝ语句中会使用?拥有此锁的应用连接对该表有完全的控制权?其他的Q何应用不能读取或更新表中的Q何纪录?/p><p>在这里我们主要要看一?IS/IX/SIXq三个锁?在这三个锁中IS/IX本nq不具备使得应用q接可以d或更新纪录的能力Q应用连接要d和更新纪录时Q?需要再得到相应的行U锁Q?反之亦然Q?M应用要获得行U锁操作数据记录之前Q?也必获得某个相应的表锁?SIX锁也是类似的情况。这是Z麽在很多情况下我们用的是行U锁Q?但是用快照(SNAPSHOTQ等工具却能够看到有表锁存在的原因?/p><p>那麽DB2中又有哪些行U锁呢? 让我们来看下面的q张图:</p><p><img height="179" alt="那麽DB2中又有哪些行U锁呢?" src="http://www-900.ibm.com/cn/support/nav/images/p23-45-01.jpg" width="400" /><br /><br /></p><p>此图中列ZDB2中包含的行锁?表中的第三列指出Q?要获得此行锁之前, 需要预先获得的表锁, q里列出的是最低要求?/p><p>q六个行U锁的主要功能如下:</p><p>1Q?S锁:此行U锁的拥有者可以读取该行的信息Q?</p><p>2Q?U锁:此行U锁的拥有者可以读取该行的信息Q如果要更新该行Q则仍然需要一个行U的X锁;其他的应用只能读取该行的信息Q此锁主要是用于FOR UPDATE的游标?/p><p>3Q?X锁:此行U锁的拥有者可以更新该行的U录Q其他的应用不能q接此行的信息;</p><p>4Q?W锁:此锁和X锁类|不同之处是此锁和NW锁兼容;</p><p>5Q?NS锁:cM于S锁,用于Next KeyQ?/p><p>6Q?NW锁:cM于W锁,用于Next KeyQ?/p><p>在DB2数据库中Q?是通过行锁和表锁协调作用来提供较好的ƈ发性, 同时保证数据库中数据的安全?在DB2中缺省情况下使用行锁(当然需要IS/IX锁配合)Q只有当出现锁资源不I 或者是用命令指定用表U锁的情况下Q?才会在应用连接中使用表锁?寚w资源分配有兴的读者可以参考DB2的管理手册, 查找其中关于locklist和maxlocks参数的论q。对于用命o指定表锁的情况Q?可以参考DB2的命令手册中的lock table命oQ?此命令用于直接锁表?/p><p>隔离U别Q?/p><p>下面让我们来看一下隔ȝ别?隔离U别主要用于控制在DB2Ҏ(gu)应用提交的SQL语句向DB2数据库中的相应对象加锁时Q?会锁住哪些纪录, 也就是锁定的范围?隔离U别的不同, 锁定的纪录的范围可能会有很大的差别?/p><p>隔离U别分ؓRR/RS/CS/URq四个别?下面让我们来逐一Q?/p><p>1Q?RR隔离U别Q?在此隔离U别下, DB2会锁住所有相关的U录?在一个SQL语句执行期间Q?所有执行此语句扫描q的U录都会被加上相应的锁?具体的锁的类型还是由操作的类型来军_Q?如果是读取,则加׃n锁; 如果是更斎ͼ 则加独占锁?׃会锁定所有ؓ获得SQL语句的结果而扫描的U录Q?所以锁的数量可能会很庞大, q个时候, 索引的增加可能会对SQL语句的执行有很大的媄响,因ؓ索引会媄响SQL语句扫描的纪录数量?/p><p>2Q?RS隔离U别Q?此隔ȝ别的要求比RR隔离U别E弱Q此隔离U别下会锁定所有符合条件的U录?不论是读取, q是更新Q?如果SQL语句中包含查询条Ӟ 则会Ҏ(gu)有符合条件的U录加相应的锁?如果没有条g语句Q?也就是对表中的所有记录进行处理,则会Ҏ(gu)有的U录加锁?/p><p>3Q?CS隔离U别Q?此隔ȝ别仅锁住当前处理的纪录?</p><p>4Q?UR隔离U别Q此隔离U别下,如果是读取操作,不会出现M的行U锁。对于非只读的操作,它的锁处理和CS相同?/p><p>在这四种隔离U别中, CS是缺省倹{?q四U隔ȝ别均可以保证DB2数据库在q发的环境下不会有数据丢q情况发生?要注意的是如果对U录q行了修改,需要在相应的纪录上加独占类型的锁, q些独占cd的锁直到交易l束时才会被释放Q?q一点在四种隔离U别下都是相同的?/p><img src ="http://www.tkk7.com/yrJavaWorld/aggbug/65040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrJavaWorld/" target="_blank">MyJavaWorld</a> 2006-08-22 12:07 <a href="http://www.tkk7.com/yrJavaWorld/archive/2006/08/22/65040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>REORG TABLEhttp://www.tkk7.com/yrJavaWorld/archive/2006/07/26/60257.htmlMyJavaWorldMyJavaWorldWed, 26 Jul 2006 14:10:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2006/07/26/60257.htmlhttp://www.tkk7.com/yrJavaWorld/comments/60257.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2006/07/26/60257.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/60257.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/60257.html REORG TABLE

REORG TABLE 语句压羃与指定的表相兌的数据?

调用

此语句可以在使用 DB2 CLI 函数的应用程序中使用Q也可以通过 CLP 发出?

语法

>>-REORG TABLE--table-name--+------------+---------------------><
                            '-int1--int2-'
 
 

描述

REORG TABLE table-name
标识重组操作的表。名U必L识现有的表?
int1
需要恢复的字节的可选最百分比?
int2
需要ؓ要执行的表压羃恢复的最字节数?

规则

  • 可选的?int1 ?int2 必须一起用,或全都不用?
  • 可选的?int1 必须是非负数?
  • 可选的?int1 必须介于 0 ?100 之间?

注意事项

  • DB2 Everyplace 可以以内部方式调用表重组?
  • W一个可选参数是表必d含的不可用的字节的百分比Q即癑ֈ之十Q?0Q意味“至百分之十的I间不可用”。)W二个可选参数是表必d含的不可用的字节敎ͼ?1000 意味“至?1000 个字节必L不可用的I间”。)必须W合两个条gQ才可以q行表的实际重组?
  • 如果没有指定参数QDB2 Everyplace 对这此选项使用~省倹{缺省百分比?30 且缺省字节是 6144。因此,“reorg table t1”与“reorg table t1 30 6144”相同?
  • 如果重组方式讄为已启用Q则 DB2 Everyplace 自动重l表。如果在 DELETE ?UPDATE 上启用了重组Q则在执行语句之后,会对目标表执行“reorg table table_name 50 30270”。如果在 DROP TABLE 上启用了重组Q则在删除表处理l束时执行“reorg table DB2eSYSTABLES 30 10240”(对于 DB2eSYSCOLUMNS ?DB2eSYSRELS 也是如此Q?
  • ?C/C++ E序中,通过使用h属?SQL_ATTR_REORG_MODE ?CLI/ODBC 函数 SQLSetStmtAttr 讄重组方式。在 JAVA E序中,通过 DB2eStatement 接口 enableReorg Ҏ(gu)讄重组方式。缺省值是启用重组?
  • 重组表时Q通过物理上回收删除和更新创徏的不可用I间来压~包含表的数据文件。然后将表的索引更新为指向行的新物理位置?
  • 可以重组“DB2 Everyplace pȝ目录”基本表?
  • 在执?REORG TABLE 语句Ӟ数据库中不应发生M其它zd?

CZ

使用~省值压~?VNNURSE 表?

REORG TABLE VNNURSE 


MyJavaWorld 2006-07-26 22:10 发表评论
]]>
DB2 存储q程问题(?http://www.tkk7.com/yrJavaWorld/archive/2006/07/21/59363.htmlMyJavaWorldMyJavaWorldFri, 21 Jul 2006 02:03:00 GMThttp://www.tkk7.com/yrJavaWorld/archive/2006/07/21/59363.htmlhttp://www.tkk7.com/yrJavaWorld/comments/59363.htmlhttp://www.tkk7.com/yrJavaWorld/archive/2006/07/21/59363.html#Feedback0http://www.tkk7.com/yrJavaWorld/comments/commentRss/59363.htmlhttp://www.tkk7.com/yrJavaWorld/services/trackbacks/59363.html阅读全文

MyJavaWorld 2006-07-21 10:03 发表评论
]]>
Java正则表达?/title><link>http://www.tkk7.com/yrJavaWorld/archive/2006/07/20/59209.html</link><dc:creator>MyJavaWorld</dc:creator><author>MyJavaWorld</author><pubDate>Thu, 20 Jul 2006 07:48:00 GMT</pubDate><guid>http://www.tkk7.com/yrJavaWorld/archive/2006/07/20/59209.html</guid><wfw:comment>http://www.tkk7.com/yrJavaWorld/comments/59209.html</wfw:comment><comments>http://www.tkk7.com/yrJavaWorld/archive/2006/07/20/59209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yrJavaWorld/comments/commentRss/59209.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yrJavaWorld/services/trackbacks/59209.html</trackback:ping><description><![CDATA[ <table id="HB_Mail_Container" height="100%" cellspacing="0" cellpadding="0" width="100%" border="0" unselectable="on"> <tbody> <tr height="100%" width="100%" unselectable="on"> <td id="HB_Focus_Element" valign="top" width="100%" background="" height="250" unselectable="off"> <h1 class="title">J***A正则表达?/h1> <div id="dytzfmp" class="entity"> <b>关键?/b>Q?<a target="_blank">正则表达?/a>                                           <p></p><h2 id="header55">正则表达?/h2><p>。正则表辑ּ(regular expression)?span class="original_words">JDK 1.4</span>的新功能Q但是对sed和awkq样的Unix的标准实用工P以及PythonQPerl之类的语a来讲Q它早就已经成ؓ其不可或~的l成部分?有h甚至认ؓQ它q是Perl能大h功的最主要的原?。单从技术角度来Ԍ正则表达式只是一U处理字W串的工?q去<span id="tekmslc" class="original_words">Java</span>q个d是交?span class="original_words">String</span>Q?span class="original_words">StringBuffer</span>以及<span id="twgmoxe" class="original_words">StringTokenizer</span>处理?Q但是它常常和I/O一起用,所以放到这里来讲也不算太离题吧?/p><p>正则表达式是一U功能强大但又非常灵zȝ文本处理工具。它能让你用~程的方式来描述复杂的文本模式,然后在字W串里把它找出来。一旦你扑ֈ了这U模式,你就能随心所Ʋ地处理q些文本了。虽然初看v来正则表辑ּ的语法有点让人望而生畏,但它提供了一U精l的动态语aQ我们能用一U通用的方式来解决各种字符串的问题Q包括匹配,选择Q编辑以及校验?/p><h3 id="header56">创徏正则表达?/h3><p>你可以从比较单的东西入手学习(fn)正则表达式。要惛_面地掌握怎样构徏正则表达式,可以ȝ<span id="cjlriaz" class="original_words">JDK</span>文?span class="original_words">java.util.regex</span>?span class="original_words">Pattern</span>cȝ文?/p><table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr><th colspan="2">字符</th></tr><tr><td><span id="ubsypws" class="original_words">B</span></td><td>字符<span id="mtvbhzy" class="original_words">B</span></td></tr><tr><td><span id="uqavqia" class="original_words">\xhh</span></td><td>16q制?span class="original_words">0xhh</span>所表示的字W?/td></tr><tr><td><span id="cjwrxlz" class="original_words">\uhhhh</span></td><td>16q制?span class="original_words">0xhhhh</span>所表示的Unicode字符</td></tr><tr><td><span id="dvqhnbt" class="original_words">\t</span></td><td>Tab</td></tr><tr><td><span id="lduacmw" class="original_words">\n</span></td><td>换行W?/td></tr><tr><td><span id="spvionb" class="original_words">\r</span></td><td>回RW?/td></tr><tr><td><span id="wdytzcb" class="original_words">\f</span></td><td>换页W?/td></tr><tr><td><span id="elrtkcb" class="original_words">\e</span></td><td>Escape</td></tr></tbody></table><p>正则表达式的强大体现在它能定义字W集(character class)。下面是一些最常见的字W集及其定义的方式,此外q有一些预定义的字W集Q?/p><table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr valign="top"><th colspan="2"><span id="greoftw" class="original_words">字符?/span></th></tr><tr valign="top"><td valign="top"><span id="vgtkbpw" class="original_words">.</span></td><td valign="top">表示L一个字W?</td></tr><tr valign="top"><td valign="top" width="131"><span id="lsntzcx" class="original_words">[abc]</span></td><td valign="top" width="311">表示字符<span id="uikbzgq" class="original_words">a</span>Q?span class="original_words">b</span>Q?span class="original_words">c</span>中的L一??span class="original_words">a|b|c</span>相同) </td></tr><tr valign="top"><td valign="top" width="131"><span id="nqwnpsv" class="original_words">[^abc]</span></td><td valign="top" width="311">?span class="original_words">a</span>Q?span class="original_words">b</span>Q?span class="original_words">c</span>之外的Q意一个字W?否定) </td></tr><tr valign="top"><td valign="top" width="131"><span id="cxdyewz" class="original_words">[a-zA-Z]</span></td><td valign="top" width="311">?span class="original_words">a</span>?span class="original_words">z</span>?span class="original_words">A</span>?span class="original_words">Z</span>当中的Q意一个字W?范围) </td></tr><tr valign="top"><td valign="top" width="131"><span id="wzupknx" class="original_words">[abc[hij]]</span></td><td valign="top" width="311"><span id="wdjwnbp" class="original_words">a,b,c,h,i,j</span>中的L一个字W??span class="original_words">a|b|c|h|i|j</span>相同)(q) </td></tr><tr valign="top"><td valign="top" width="131"><span id="nbwnels" class="original_words">[a-z&&[hij]]</span></td><td valign="top" width="311"><span id="bxkqdry" class="original_words">h,i,j</span>中的一?交集) </td></tr><tr valign="top"><td valign="top" width="131"><span id="fxdflor" class="original_words">\s</span></td><td valign="top" width="311">I格字符(I格? tab, 换行, 换页, 回R) </td></tr><tr valign="top"><td valign="top" width="131"><span id="jmhjews" class="original_words">\S</span></td><td valign="top" width="311">非空格字W?<span id="fmoupoc" class="original_words">[^\s]</span>) </td></tr><tr valign="top"><td valign="top" width="131"><span id="lsjpvyf" class="original_words">\d</span></td><td valign="top" width="311">一个数字,也就?span class="original_words">[0-9]</span></td></tr><tr valign="top"><td valign="top" width="131"><span id="kwciocj" class="original_words">\D</span></td><td valign="top" width="311">一个非数字的字W,也就?span class="original_words">[^0-9]</span></td></tr><tr valign="top"><td valign="top" width="131"><span id="ubhrxed" class="original_words">\w</span></td><td valign="top" width="311">一个单词字W?word character)Q即<span id="yfwctas" class="original_words">[a-zA-Z_0-9]</span></td></tr><tr valign="top"><td valign="top" width="131"><span id="knisjxp" class="original_words">\W</span></td><td valign="top" width="311">一个非单词的字W,<span id="jfwythk" class="original_words">[^\w]</span></td></tr></tbody></table><p>如果你用q其它语a的正则表辑ּQ那么你一眼就能看出反斜杠的与众不同。在其它语言里,"<span id="ahrmdvu" class="original_words">\\</span>"的意思是"我只是要在正则表辑ּ里插入一个反斜杠。没什么特别的意思?但是在Java里,"<span id="ahjezrn" class="original_words">\\</span>"的意思是"我要插入一个正则表辑ּ的反斜杠Q所以跟在它后面的那个字W的意思就变了?举例来说Q如果你惌CZ个或更多?单词字符"Q那么这个正则表辑ּ应该是"<span id="uxzuadk" class="original_words">\\w+</span>"。如果你要插入一个反斜杠Q那得?<span id="ubduwzg" class="original_words">\\\\</span>"。不q像换行Q蟩gcȝq是只用一根反斜杠Q?\n\t"?/p><p>q里只给你讲一个例子;你应?span class="original_words">JDK</span>文?span class="original_words">java.util.regex.Pattern</span>加到收藏多wQ这样就能很Ҏ(gu)地找到各U正则表辑ּ的模式了?/p><table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr><th colspan="2">逻辑q算W?</th></tr><tr><td>XY</td><td>X 后面跟着 Y</td></tr><tr><td>X|Y</td><td>X或Y</td></tr><tr><td>(X)</td><td>一?要匹配的l?capturing group)". 以后可以用\i来表C第i个被匚w的组?/td></tr></tbody></table><p></p><table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr valign="top"><th valign="top" width="383" colspan="2">边界匚wW?</th></tr><tr valign="top"><td valign="top" width="143"><span id="esntmad" class="original_words">^</span></td><td valign="top" width="239">一行的开?</td></tr><tr valign="top"><td valign="top" width="143"><span id="adcprym" class="original_words">$</span></td><td valign="top" width="239">一行的l尾 </td></tr><tr valign="top"><td valign="top" width="143"><span id="qevfasv" class="original_words">\b</span></td><td valign="top" width="239">一个单词的边界 </td></tr><tr valign="top"><td valign="top" width="143"><span id="jflcilz" class="original_words">\B</span></td><td valign="top" width="239">一个非单词的边?</td></tr><tr valign="top"><td valign="top" width="143"><span id="bizfadv" class="original_words">\G</span></td><td valign="top" width="239">前一个匹配的l束 </td></tr></tbody></table><p>举一个具体一些的例子。下面这些正则表辑ּ都是合法的,而且都能匚w"Rudolph"Q?/p><blockquote><pre>Rudolph [rR]udolph [rR][aeiou][a-z]ol.* R.*</pre></blockquote><h3 id="header57">数量表示W?/h3><p>"数量表示W?quantifier)"的作用是定义模式应该匚w多少个字W?/p><ul><li>Greedy(贪婪?Q?除非另有表示Q否则数量表C符都是greedy的。Greedy的表辑ּ会一直匹配下去,直到匚w不下Mؓ止?u>(如果你发现表辑ּ匚w的结果与预期的不W?</u>Q很有可能是因ؓQ你以ؓ表达式会只匹配前面几个字W,而实际上它是greedy的,因此会一直匹配下厅R? </li><li>Reluctant(勉强?Q?用问可C,它会匚w最的字符。也UCؓlazy, minimal matching, non-greedy, 或ungreedy? </li><li>Possessive(占有?Q?目前只有Java支持(其它语言都不支持)。它更加先进Q所以你可能q不太会用。用正则表达式匹配字W串的时候会产生很多中间状态,<u>(一般的匚w引擎会保存这U中间状态,)</u>q样匚wp|的时候就能原路返回了。占有型的表辑ּ不保存这U中间状态,因此也就不会回头重来了。它能防止正则表辑ּ的失控,同时也能提高q行的效率?</li></ul><table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr valign="top"><th><span id="rjtzfia" class="original_words">Greedy</span></th><th><span id="skboftl" class="original_words">Reluctant</span></th><th><span id="soqhcjq" class="original_words">Possessive</span></th><th>匚w </th></tr><tr valign="top"><td valign="top" width="71"><span id="cyezmld" class="original_words">X?</span></td><td valign="top" width="86"><span id="dkuarjm" class="original_words">X??</span></td><td valign="top" width="93"><span id="fxzbhvy" class="original_words">X?+</span></td><td valign="top" width="231">匚w一个或零个<span id="kntzump" class="original_words">X</span></td></tr><tr valign="top"><td valign="top" width="71"><span id="yqscehk" class="original_words">X*</span></td><td valign="top" width="86"><span id="mxdfwor" class="original_words">X*?</span></td><td valign="top" width="93"><span id="dkedyxp" class="original_words">X*+</span></td><td valign="top" width="231">匚w零或多个<span id="zvuekgn" class="original_words">X</span></td></tr><tr valign="top"><td valign="top" width="71"><span id="wsyavrn" class="original_words">X+</span></td><td valign="top" width="86"><span id="tavmoky" class="original_words">X+?</span></td><td valign="top" width="93"><span id="mtofwoc" class="original_words">X++</span></td><td valign="top" width="231">匚w一个或多个<span id="poutkgj" class="original_words">X</span></td></tr><tr valign="top"><td valign="top" width="71"><span id="hkqhnfm" class="original_words">X{n}</span></td><td valign="top" width="86"><span id="uqlgbta" class="original_words">X{n}?</span></td><td valign="top" width="93"><span id="onxdybe" class="original_words">X{n}+</span></td><td valign="top" width="231">匚w正好n?span class="original_words">X</span></td></tr><tr valign="top"><td valign="top" width="71"><span id="grbsymt" class="original_words">X{n,}</span></td><td valign="top" width="86"><span id="ovmdnfi" class="original_words">X{n,}?</span></td><td valign="top" width="93"><span id="esjpvcu" class="original_words">X{n,}+</span></td><td valign="top" width="231">匚w臛_n?span class="original_words">X</span></td></tr><tr valign="top"><td valign="top" width="71"><span id="fvfhrym" class="original_words">X{n,m}</span></td><td valign="top" width="86"><span id="nytzuiw" class="original_words">X{n,m}?</span></td><td valign="top" width="93"><span id="dkblgjx" class="original_words">X{n,m}+</span></td><td valign="top" width="231">匚w臛_n个,臛_m?span class="original_words">X</span></td></tr></tbody></table><p>再提醒一下,要想让表辑ּ照你的意思去q行Q你应该用括h'X'括v来。比方说Q?/p><blockquote><pre>abc+</pre></blockquote><p>gq个表达式能匚w一个或若干?abc'Q但是如果你真的用它d?abcabcabc'的话Q实际上只会扑ֈ三个字符。因个表辑ּ的意思是'ab'后边跟着一个或多个'c'。要惛_配一个或多个完整?abc'Q你应该q样Q?/p><blockquote><pre>(abc)+</pre></blockquote><p>正则表达式能轻而易丑֜把你l耍了Q这是一U徏立在<span id="btzupdk" class="original_words">Java</span>之上的新语言?/p><h4 id="header58">CharSequence</h4><p>JDK 1.4定义了一个新的接口,?span class="original_words">CharSequence</span>。它提供?span class="original_words">String</span>?span class="original_words">StringBuffer</span>q两个类的字W序列的抽象Q?/p><blockquote><pre><font color="#0000ff">interface</font> CharSequence { charAt(<font color="#0000ff">int</font> i); length(); subSequence(<font color="#0000ff">int</font> start, <font color="#0000ff">int</font> end); toString(); }</pre></blockquote><p>Z实现q个新的<span id="asypkjb" class="original_words">CharSequence</span>接口Q?span class="original_words">String</span>Q?span class="original_words">StringBuffer</span>以及<span id="mevtkym" class="original_words">CharBuffer</span>都作了修攏V很多正则表辑ּ的操作都要拿<span id="mxdypho" class="original_words">CharSequence</span>作参数?/p><h3 id="header59"><span id="hzuagyf" class="original_words">Pattern</span>?span class="original_words">Matcher</span></h3><p>先给一个例子。下面这D늨序可以测试正则表辑ּ是否匚w字符丌Ӏ第一个参数是要匹配的字符Ԍ后面是正则表辑ּ。正则表辑ּ可以有多个。在Unix/Linux环境下,命o行下的正则表辑ּq必ȝ引号?/p><p>当你创徏正则表达式时Q可以用q个E序来判断它是不是会按照你的要求工作?/p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:TestRegularExpression.java</font><font color="#009900">// Allows you to easly try out regular expressions.</font><font color="#009900">// {Args: abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}" }</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> TestRegularExpression { <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { <font color="#0000ff">if</font>(args.length < 2) { System.out.println(<font color="#004488">"Usage:\n"</font> + <font color="#004488">"java TestRegularExpression "</font> + <font color="#004488">"characterSequence regularExpression+"</font>); System.exit(0); } System.out.println(<font color="#004488">"Input: \"</font><font color="#004488">" + args[0] + "</font>\<font color="#004488">""</font>); <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 1; i < args.length; i++) { System.out.println( <font color="#004488">"Regular expression: \"</font><font color="#004488">" + args[i] + "</font>\<font color="#004488">""</font>); Pattern p = Pattern.compile(args[i]); Matcher m = p.matcher(args[0]); <font color="#0000ff">while</font>(m.find()) { System.out.println(<font color="#004488">"Match \"</font>" + m.group() + <font color="#004488">"\"</font> at positions " + m.start() + <font color="#004488">"-"</font> + (m.end() - 1)); } } } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p><span id="hdfezgu" class="original_words">Java</span>的正则表辑ּ是由<span id="nqsqhky" class="original_words">java.util.regex</span>?span class="original_words">Pattern</span>?span class="original_words">Matcher</span>cd现的?span class="original_words">Pattern</span>对象表示l编译的正则表达式。静态的<span id="vyekmed" class="original_words">compile( )</span>Ҏ(gu)负责表C正则表辑ּ的字W串~译?span class="original_words">Pattern</span>对象。正如上qCE所C的Q只要给<span id="kytdnbp" class="original_words">Pattern</span>?span class="original_words">matcher( )</span>Ҏ(gu)送一个字W串p获取一?span class="original_words">Matcher</span>对象。此外,<span id="fmdjesg" class="original_words">Pattern</span>q有一个能快速判断能否在<span id="cjtkbpw" class="original_words">input</span>里面扑ֈ<span id="dgxsyfi" class="original_words">regex</span>?注意Q原文有误,漏了Ҏ(gu)?</p><blockquote><pre><font color="#0000ff">static</font><font color="#0000ff">boolean</font> matches( regex,  input)</pre></blockquote><p>以及能返?span class="original_words">String</span>数组?span class="original_words">split( )</span>Ҏ(gu)Q它能用<span id="rytzfil" class="original_words">regex</span>把字W串分割开来?/p><p>只要l?span class="original_words">Pattern.matcher( )</span>Ҏ(gu)传一个字W串p获得<span id="ihjtoru" class="original_words">Matcher</span>对象了。接下来p?span class="original_words">Matcher</span>的方法来查询匚w的结果了?/p><blockquote><pre><font color="#0000ff">boolean</font> matches() <font color="#0000ff">boolean</font> lookingAt() <font color="#0000ff">boolean</font> find() <font color="#0000ff">boolean</font> find(<font color="#0000ff">int</font> start)</pre></blockquote><p><span id="jqhnipl" class="original_words">matches( )</span>的前提是<span id="aoyizcy" class="original_words">Pattern</span>匚w整个字符Ԍ?span class="original_words">lookingAt( )</span>的意思是<span id="kyarips" class="original_words">Pattern</span>匚w字符串的开头?</p><h4 id="header60">find( )</h4><p><span id="woqwryu" class="original_words">Matcher.find( )</span>的功能是发现<span id="xpkxdrb" class="original_words">CharSequence</span>里的Q与pattern相匹配的多个字符序列。例如:</p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:FindDemo.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">import</font> java.util.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> FindDemo { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { Matcher m = Pattern.compile(<font color="#004488">"\\w+"</font>) .matcher(<font color="#004488">"Evening is full of the linnet's wings"</font>); <font color="#0000ff">while</font>(m.find()) System.out.println(m.group()); <font color="#0000ff">int</font> i = 0; <font color="#0000ff">while</font>(m.find(i)) { System.out.print(m.group() + <font color="#004488">" "</font>); i++; } monitor.expect(<font color="#0000ff">new</font> String[] { <font color="#004488">"Evening"</font>, <font color="#004488">"is"</font>, <font color="#004488">"full"</font>, <font color="#004488">"of"</font>, <font color="#004488">"the"</font>, <font color="#004488">"linnet"</font>, <font color="#004488">"s"</font>, <font color="#004488">"wings"</font>, <font color="#004488">"Evening vening ening ning ing ng g is is s full "</font> + <font color="#004488">"full ull ll l of of f the the he e linnet linnet "</font> + <font color="#004488">"innet nnet net et t s s wings wings ings ngs gs s "</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>"<span id="vjizfth" class="original_words">\\w+</span>"的意思是"一个或多个单词字符"Q因此它会将字符串直接分解成单词?span class="original_words">find( )</span>像一个P代器Q从头到扫描一遍字W串。第二个<span id="pwyeknf" class="original_words">find( )</span>是带<span id="juhnels" class="original_words">int</span>参数的,正如你所看到的,它会告诉Ҏ(gu)从哪里开始找——即从参C|开始查找?/p><h4 id="header61">Groups</h4><p>Group是指里用括号括v来的Q能被后面的表达式调用的正则表达式。Group 0 表示整个表达式,group 1表示W一个被括v来的groupQ以此类推。所以;</p><blockquote><pre>A(B(C))D</pre></blockquote><p>里面有三个groupQgroup 0?span class="original_words">ABCD</span>Q?group 1?span class="original_words">BC</span>Qgroup 2?span class="original_words">C</span>?/p><p>你可以用下述<span id="pwrmdnf" class="original_words">Matcher</span>Ҏ(gu)来用groupQ?/p><p><span id="mpvbask" class="original_words">public int groupCount( )</span>q回matcher对象中的group的数目。不包括group0?/p><p><span id="grmsnut" class="original_words">public String group( ) </span>q回上次匚w操作(比方?span class="original_words">find( )</span>)的group 0(整个匚w)</p><p><span id="tsfavjq" class="original_words">public String group(int i)</span>q回上次匚w操作的某个group。如果匹配成功,但是没能扑ֈgroupQ则q回null?/p><p><span id="onpvfxw" class="original_words">public int start(int group)</span>q回上次匚w所扑ֈ的,group的开始位|?/p><p><span id="ewyxdvu" class="original_words">public int end(int group)</span>q回上次匚w所扑ֈ的,group的结束位|,最后一个字W的下标加一?/p><p>下面我们举一些group的例子:</p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:Groups.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> Groups { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">static</font><font color="#0000ff">public</font><font color="#0000ff">final</font> String poem = <font color="#004488">"Twas brillig, and the slithy toves\n"</font> + <font color="#004488">"Did gyre and gimble in the wabe.\n"</font> + <font color="#004488">"All mimsy were the borogoves,\n"</font> + <font color="#004488">"And the mome raths outgrabe.\n\n"</font> + <font color="#004488">"Beware the Jabberwock, my son,\n"</font> + <font color="#004488">"The jaws that bite, the claws that catch.\n"</font> + <font color="#004488">"Beware the Jubjub bird, and shun\n"</font> + <font color="#004488">"The frumious Bandersnatch."</font>; <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { Matcher m = Pattern.compile(<font color="#004488">"(?m)(\\S+)\\s+((\\S+)\\s+(\\S+))$"</font>) .matcher(poem); <font color="#0000ff">while</font>(m.find()) { <font color="#0000ff">for</font>(<font color="#0000ff">int</font> j = 0; j <= m.groupCount(); j++) System.out.print(<font color="#004488">"["</font> + m.group(j) + <font color="#004488">"]"</font>); System.out.println(); } monitor.expect(<font color="#0000ff">new</font> String[]{ <font color="#004488">"[the slithy toves]"</font> + <font color="#004488">"[the][slithy toves][slithy][toves]"</font>, <font color="#004488">"[in the wabe.][in][the wabe.][the][wabe.]"</font>, <font color="#004488">"[were the borogoves,]"</font> + <font color="#004488">"[were][the borogoves,][the][borogoves,]"</font>, <font color="#004488">"[mome raths outgrabe.]"</font> + <font color="#004488">"[mome][raths outgrabe.][raths][outgrabe.]"</font>, <font color="#004488">"[Jabberwock, my son,]"</font> + <font color="#004488">"[Jabberwock,][my son,][my][son,]"</font>, <font color="#004488">"[claws that catch.]"</font> + <font color="#004488">"[claws][that catch.][that][catch.]"</font>, <font color="#004488">"[bird, and shun][bird,][and shun][and][shun]"</font>, <font color="#004488">"[The frumious Bandersnatch.][The]"</font> + <font color="#004488">"[frumious Bandersnatch.][frumious][Bandersnatch.]"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>q首诗是<span id="gntvbtp" class="original_words"><cite>Through the Looking Glass</cite></span>的,Lewis Carroll?Jabberwocky"的第一部分。可以看到这个正则表辑ּ里有很多用括hh的groupQ它是由L多个q箋的非I字W?'<span id="utofwoc" class="original_words">\S+</span>')和Q意多个连l的I格字符('<span id="akbofbi" class="original_words">\s+</span>')所l成的,其最l目的是要捕h行的最后三个单词;'<span id="yuakxtw" class="original_words">$</span>'表示一行的l尾。但?<span id="earbhkc" class="original_words">$</span>'通常表示整个字符串的l尾Q所以这里要明确地告诉正则表辑ּ注意换行W。这一Ҏ(gu)?<span id="fqlrtlo" class="original_words">(?m)</span>'标志完成?模式标志会过一会讲??/p><h4 id="header62">start( )和end( )</h4><p>如果匚w成功Q?span class="original_words">start( )</span>会返回此ơ匹配的开始位|,<span id="xcofloc" class="original_words">end( )</span>会返回此ơ匹配的l束位置Q即最后一个字W的下标加一。如果之前的匚w不成?或者没匚w)Q那么无论是调用<span id="xulnehk" class="original_words">start( )</span>q是<span id="earmhzc" class="original_words">end( )</span>Q都会引发一?span class="original_words">IllegalStateException</span>。下面这D늨序还演示?span class="original_words">matches( )</span>?span class="original_words">lookingAt( )</span>Q?/p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:StartEnd.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> StartEnd { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { String[] input = <font color="#0000ff">new</font> String[] { <font color="#004488">"Java has regular expressions in 1.4"</font>, <font color="#004488">"regular expressions now expressing in Java"</font>, <font color="#004488">"Java represses oracular expressions"</font> }; Pattern p1 = Pattern.compile(<font color="#004488">"re\\w*"</font>), p2 = Pattern.compile(<font color="#004488">"Java.*"</font>); <font color="#0000ff">for</font>(<font color="#0000ff">int</font> i = 0; i < input.length; i++) { System.out.println(<font color="#004488">"input "</font> + i + <font color="#004488">": "</font> + input[i]); Matcher m1 = p1.matcher(input[i]), m2 = p2.matcher(input[i]); <font color="#0000ff">while</font>(m1.find()) System.out.println(<font color="#004488">"m1.find() '"</font> + m1.group() + <font color="#004488">"' start = "</font>+ m1.start() + <font color="#004488">" end = "</font> + m1.end()); <font color="#0000ff">while</font>(m2.find()) System.out.println(<font color="#004488">"m2.find() '"</font> + m2.group() + <font color="#004488">"' start = "</font>+ m2.start() + <font color="#004488">" end = "</font> + m2.end()); <font color="#0000ff">if</font>(m1.lookingAt()) <font color="#009900">// No reset() necessary</font> System.out.println(<font color="#004488">"m1.lookingAt() start = "</font> + m1.start() + <font color="#004488">" end = "</font> + m1.end()); <font color="#0000ff">if</font>(m2.lookingAt()) System.out.println(<font color="#004488">"m2.lookingAt() start = "</font> + m2.start() + <font color="#004488">" end = "</font> + m2.end()); <font color="#0000ff">if</font>(m1.matches()) <font color="#009900">// No reset() necessary</font> System.out.println(<font color="#004488">"m1.matches() start = "</font> + m1.start() + <font color="#004488">" end = "</font> + m1.end()); <font color="#0000ff">if</font>(m2.matches()) System.out.println(<font color="#004488">"m2.matches() start = "</font> + m2.start() + <font color="#004488">" end = "</font> + m2.end()); } monitor.expect(<font color="#0000ff">new</font> String[] { <font color="#004488">"input 0: Java has regular expressions in 1.4"</font>, <font color="#004488">"m1.find() 'regular' start = 9 end = 16"</font>, <font color="#004488">"m1.find() 'ressions' start = 20 end = 28"</font>, <font color="#004488">"m2.find() 'Java has regular expressions in 1.4'"</font> + <font color="#004488">" start = 0 end = 35"</font>, <font color="#004488">"m2.lookingAt() start = 0 end = 35"</font>, <font color="#004488">"m2.matches() start = 0 end = 35"</font>, <font color="#004488">"input 1: regular expressions now "</font> + <font color="#004488">"expressing in Java"</font>, <font color="#004488">"m1.find() 'regular' start = 0 end = 7"</font>, <font color="#004488">"m1.find() 'ressions' start = 11 end = 19"</font>, <font color="#004488">"m1.find() 'ressing' start = 27 end = 34"</font>, <font color="#004488">"m2.find() 'Java' start = 38 end = 42"</font>, <font color="#004488">"m1.lookingAt() start = 0 end = 7"</font>, <font color="#004488">"input 2: Java represses oracular expressions"</font>, <font color="#004488">"m1.find() 'represses' start = 5 end = 14"</font>, <font color="#004488">"m1.find() 'ressions' start = 27 end = 35"</font>, <font color="#004488">"m2.find() 'Java represses oracular expressions' "</font> + <font color="#004488">"start = 0 end = 35"</font>, <font color="#004488">"m2.lookingAt() start = 0 end = 35"</font>, <font color="#004488">"m2.matches() start = 0 end = 35"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>注意Q只要字W串里有q个模式Q?span class="original_words">find( )</span>p把它l找出来Q但?span class="original_words">lookingAt( )</span>?span class="original_words">matches( )</span>Q只有在字符串与正则表达式一开始就相匹配的情况下才能返?span class="original_words">true</span>?span class="original_words">matches( )</span>成功的前提是正则表达式与字符串完全匹配,?span class="original_words">lookingAt( )</span><a id="ref67" href="mk:@MSITStore:C:\Documents%20and%20Settings\wangkai\桌面\TIJ3_cn.chm::/chap12/nocomment.html#comment67"><sup>[67]</sup></a>成功的前提是Q字W串的开始部分与正则表达式相匚w?/p><h4 id="header63">匚w的模?Pattern flags)</h4><p><span id="vgmhcme" class="original_words">compile( )</span>Ҏ(gu)q有一个版本,它需要一个控制正则表辑ּ的匹配行为的参数Q?/p><blockquote><pre>Pattern Pattern.compile(String regex, <font color="#0000ff">int</font> flag)</pre></blockquote><span id="wkjpkcq" class="original_words">flag</span>的取D围如下: <table class="narration" cellspacing="0" bordercolordark="#000000" cellpadding="2" bordercolorlight="#000000" border="2"><tbody><tr><th><span id="rhntvnf" class="original_words">~译标志</span></th><th><span id="mjpvkgf" class="original_words">效果</span></th></tr><tr><td><span id="ykflgjm" class="original_words">Pattern.CANON_EQ</span></td><td>当且仅当两个字符?正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达?a\u030A"会匹??"。默认情况下Q不考虑"规范相等?canonical equivalence)"?</td></tr><tr><td><span id="bgmhnft" class="original_words">Pattern.CASE_INSENSITIVE<br />(?i)</span></td><td>默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表辑ּ忽略大小写进行匹配。要惛_Unicode字符q行大小不明感的匚wQ只要将<span id="wikbogn" class="original_words">UNICODE_CASE</span>与这个标志合hp了?</td></tr><tr><td><span id="tyidjmh" class="original_words">Pattern.COMMENTS<br />(?x)</span></td><td>在这U模式下Q匹配时会忽?正则表达式里?I格字符(译者注Q不是指表达式里?\\s"Q而是指表辑ּ里的I格QtabQ回车之c?。注释从#开始,一直到q行l束。可以通过嵌入式的标志来启用Unix行模式?</td></tr><tr><td><span id="ziojewo" class="original_words">Pattern.DOTALL<br />(?s)</span></td><td>在这U模式下Q表辑ּ'.'可以匚wL字符Q包括表CZ行的l束W。默认情况下Q表辑ּ'.'不匹配行的结束符?</td></tr><tr><td><span id="tyavxas" class="original_words">Pattern.MULTILINE<br />(?m)</span></td><td>在这U模式下Q?^'?$'分别匚w一行的开始和l束。此外,'^'仍然匚w字符串的开始,'$'也匹配字W串的结束。默认情况下Q这两个表达式仅仅匹配字W串的开始和l束?</td></tr><tr><td><span id="kwrxdki" class="original_words">Pattern.UNICODE_CASE<br />(?u)</span></td><td>在这个模式下Q如果你q启用了<span id="uofagcj" class="original_words">CASE_INSENSITIVE</span>标志Q那么它会对Unicode字符q行大小写不明感的匹配。默认情况下Q大写不明感的匚w只适用于US-ASCII字符集?</td></tr><tr><td><span id="chceocu" class="original_words">Pattern.UNIX_LINES<br />(?d)</span></td><td>在这个模式下Q只?\n'才被认作一行的中止Qƈ且与'.'Q?^'Q以?$'q行匚w?</td></tr></tbody></table><p>在这些标志里面,<span id="bgbhufi" class="original_words">Pattern.CASE_INSENSITIVE</span>Q?span class="original_words">Pattern.MULTILINE</span>Q以?span class="original_words">Pattern.COMMENTS</span>是最有用?其中<span id="oekqlor" class="original_words">Pattern.COMMENTS</span>q能帮我们把思\理清楚,q且/或者做文档)。注意,你可以用在表辑ּ里插记号的方式来启用l大多数的模式。这些记号就在上面那张表的各个标志的下面。你希望模式从哪里开始启动,在哪里插记受?/p><p>可以?OR" ('|')q算W把q些标志合用:</p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:ReFlags.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> ReFlags { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { Pattern p = Pattern.compile(<font color="#004488">"^java"</font>, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); Matcher m = p.matcher( <font color="#004488">"java has regex\nJava has regex\n"</font> + <font color="#004488">"J***A has pretty good regular expressions\n"</font> + <font color="#004488">"Regular expressions are in Java"</font>); <font color="#0000ff">while</font>(m.find()) System.out.println(m.group()); monitor.expect(<font color="#0000ff">new</font> String[] { <font color="#004488">"java"</font>, <font color="#004488">"Java"</font>, <font color="#004488">"J***A"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>q样创徏出来的正则表辑ּp匚w?java"Q?Java"Q?J***A"...开头的字符串了。此外,如果字符串分好几行,那它q会Ҏ(gu)一行做匚w(匚w始于字符序列的开始,l于字符序列当中的行l束W?。注意,<span id="kavxskn" class="original_words">group( )</span>Ҏ(gu)仅返回匹配的部分?/p><h3 id="header64">split( )</h3><p>所谓分割是指将以正则表辑ּ为界Q将字符串分割成<span id="oekbahd" class="original_words">String</span>数组?/p><blockquote><pre>String[] split(CharSequence charseq) String[] split(CharSequence charseq, <font color="#0000ff">int</font> limit)</pre></blockquote><p>q是一U既快又方便地将文本Ҏ(gu)一些常见的边界标志分割开来的Ҏ(gu)?/p><table class="code"><tbody><tr><td><pre><font color="#009900">//: c12:SplitDemo.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">import</font> java.util.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> SplitDemo { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { String input = <font color="#004488">"This!!unusual use!!of exclamation!!points"</font>; System.out.println(Arrays.asList( Pattern.compile(<font color="#004488">"!!"</font>).split(input))); <font color="#009900">// Only do the first three:</font> System.out.println(Arrays.asList( Pattern.compile(<font color="#004488">"!!"</font>).split(input, 3))); System.out.println(Arrays.asList( <font color="#004488">"Aha! String has a split() built in!"</font>.split(<font color="#004488">" "</font>))); monitor.expect(<font color="#0000ff">new</font> String[] { <font color="#004488">"[This, unusual use, of exclamation, points]"</font>, <font color="#004488">"[This, unusual use, of exclamation!!points]"</font>, <font color="#004488">"[Aha!, String, has, a, split(), built, in!]"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>W二?span class="original_words">split( )</span>会限定分割的ơ数?/p><p>正则表达式是如此重要Q以至于有些功能被加q了<span id="bgbwgnf" class="original_words">String</span>c,其中包括<span id="lmoulog" class="original_words">split( )</span>(已经看到?Q?span class="original_words">matches( )</span>Q?span class="original_words">replaceFirst( )</span>以及<span id="dxoupsz" class="original_words">replaceAll( )</span>。这些方法的功能?span class="original_words">Pattern</span>?span class="original_words">Matcher</span>的相同?</p><h3 id="header65">替换操作</h3><p>正则表达式在替换文本斚w特别在行。下面就是一些方法:</p><p><span id="mniojbp" class="original_words">replaceFirst(String replacement)</span>字W串里,W一个与模式相匹配的子串替换?span class="original_words">replacement</span>?</p><p><span id="vekbhov" class="original_words">replaceAll(String replacement)</span>Q将输入字符串里所有与模式相匹配的子串全部替换?span class="original_words">replacement</span>?/p><p><span id="oiscxew" class="original_words">appendReplacement(StringBuffer sbuf, String replacement)</span>?span class="original_words">sbuf</span>q行逐次替换Q而不是像<span id="bvbhyft" class="original_words">replaceFirst( )</span>?span class="original_words">replaceAll( )</span>那样Q只替换W一个或全部子串。这是个非常重要的方法,因ؓ它可以调用方法来生成<span id="nwnxdgu" class="original_words">replacement</span>(<span id="zpvmsoc" class="original_words">replaceFirst( )</span>?span class="original_words">replaceAll( )</span>只允许用固定的字W串来充?span class="original_words">replacement</span>)。有了这个方法,你就可以~程区分groupQ从而实现更强大的替换功能?/p><p>调用?span class="original_words">appendReplacement( )</span>之后Qؓ了把剩余的字W串拯回去Q必调?span class="original_words">appendTail(StringBuffer sbuf, String replacement)</span>?</p><p>下面我们来演CZ下怎样使用q些替换Ҏ(gu)。说明一下,q段E序所处理的字W串是它自己开头部分的注释Q是用正则表辑ּ提取出来q加以处理之后再传给替换Ҏ(gu)的?/p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:TheReplacements.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> java.io.*; <font color="#0000ff">import</font> com.bruceeckel.util.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#009900">/*! Here's a block of text to use as input to the regular expression matcher. Note that we'll first extract the block of text by looking for the special delimiters, then process the extracted block. !*/</font><font color="#0000ff">public</font><font color="#0000ff">class</font> TheReplacements { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) <font color="#0000ff">throws</font> Exception { String s = TextFile.read(<font color="#004488">"TheReplacements.java"</font>); <font color="#009900">// Match the specially-commented block of text above:</font> Matcher mInput = Pattern.compile(<font color="#004488">"</font><font color="#004488">/\\*!(.*)!\\*</font><font color="#004488">/"</font>, Pattern.DOTALL) .matcher(s); <font color="#0000ff">if</font>(mInput.find()) s = mInput.group(1); <font color="#009900">// Captured by parentheses</font><font color="#009900">// Replace two or more spaces with a single space:</font> s = s.replaceAll(<font color="#004488">" {2,}"</font>, <font color="#004488">" "</font>); <font color="#009900">// Replace one or more spaces at the beginning of each</font><font color="#009900">// line with no spaces. Must enable MULTILINE mode:</font> s = s.replaceAll(<font color="#004488">"(?m)^ +"</font>, <font color="#004488">""</font>); System.out.println(s); s = s.replaceFirst(<font color="#004488">"[aeiou]"</font>, <font color="#004488">"(VOWEL1)"</font>); StringBuffer sbuf = <font color="#0000ff">new</font> StringBuffer(); Pattern p = Pattern.compile(<font color="#004488">"[aeiou]"</font>); Matcher m = p.matcher(s); <font color="#009900">// Process the find information as you</font><font color="#009900">// perform the replacements:</font><font color="#0000ff">while</font>(m.find()) m.appendReplacement(sbuf, m.group().toUpperCase()); <font color="#009900">// Put in the remainder of the text:</font> m.appendTail(sbuf); System.out.println(sbuf); monitor.expect(<font color="#0000ff">new</font> String[]{ <font color="#004488">"Here's a block of text to use as input to"</font>, <font color="#004488">"the regular expression matcher. Note that we'll"</font>, <font color="#004488">"first extract the block of text by looking for"</font>, <font color="#004488">"the special delimiters, then process the"</font>, <font color="#004488">"extracted block. "</font>, <font color="#004488">"H(VOWEL1)rE's A blOck Of tExt tO UsE As InpUt tO"</font>, <font color="#004488">"thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE'll"</font>, <font color="#004488">"fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr"</font>, <font color="#004488">"thE spEcIAl dElImItErs, thEn prOcEss thE"</font>, <font color="#004488">"ExtrActEd blOck. "</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>我们用前面介l的<span id="kpkfhdk" class="original_words">TextFile.read( )</span>Ҏ(gu)来打开和读取文件?span class="original_words">mInput</span>的功能是匚w'<span id="nontzrf" class="original_words">/*!</span>' ?'<span id="fkuezcu" class="original_words">!*/</span>' 之间的文?注意一下分l用的括?。接下来Q我们将所有两个以上的q箋I格全都替换成一个,q且各行开头的I格全都L(Z让这个正则表辑ּ能对所有的行,而不仅仅是第一行v作用Q必d用多行模?。这两个操作都用?span class="original_words">String</span>?span class="original_words">replaceAll( )</span>(q里用它更方?。注意,׃每个替换只做一ơ,因此除了预编?span class="original_words">Pattern</span>之外Q程序没有额外的开销?/p><p><span id="kavevyq" class="original_words">replaceFirst( )</span>只替换第一个子丌Ӏ此外,<span id="nscmhkj" class="original_words">replaceFirst( )</span>?span class="original_words">replaceAll( )</span>只能用常?literal)来替换,所以如果你每次替换的时候还要进行一些操作的话,它们是无能ؓ力的。碰到这U情况,你得?span class="original_words">appendReplacement( )</span>Q它能让你在q行替换的时候想写多代码就写多。在上面那段E序里,创徏<span id="fkmdnux" class="original_words">sbuf</span>的过E就是选group做处理,也就是用正则表达式把元音字母扑և来,然后换成大写的过E。通常你得在完成全部的替换之后才调?span class="original_words">appendTail( )</span>Q但是如果要模仿<span id="pqsylsv" class="original_words">replaceFirst( )</span>(?replace n")的效果,你也可以只替换一ơ就调用<span id="wfpzqxa" class="original_words">appendTail( )</span>。它会把剩下的东西全都放q?span class="original_words">sbuf</span>?/p><p>你还可以?span class="original_words">appendReplacement( )</span>?span class="original_words">replacement</span>参数里用"$g"引用已捕L(fng)groupQ其?g' 表示group的号码。不q这是ؓ一些比较简单的操作准备的,因而其效果无法与上q程序相比?/p><h3 id="header66">reset( )</h3><p>此外Q还可以?span class="original_words">reset( )</span>Ҏ(gu)l现有的<span id="hmwrxlo" class="original_words">Matcher</span>对象配上个新?span class="original_words">CharSequence</span>?/p><table class="code"><tbody><tr><td><pre><font color="#009900">//: c12:Resetting.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> java.io.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> Resetting { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) <font color="#0000ff">throws</font> Exception { Matcher m = Pattern.compile(<font color="#004488">"[frb][aiu][gx]"</font>) .matcher(<font color="#004488">"fix the rug with bags"</font>); <font color="#0000ff">while</font>(m.find()) System.out.println(m.group()); m.reset(<font color="#004488">"fix the rig with rags"</font>); <font color="#0000ff">while</font>(m.find()) System.out.println(m.group()); monitor.expect(<font color="#0000ff">new</font> String[]{ <font color="#004488">"fix"</font>, <font color="#004488">"rug"</font>, <font color="#004488">"bag"</font>, <font color="#004488">"fix"</font>, <font color="#004488">"rig"</font>, <font color="#004488">"rag"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>如果不给参数Q?span class="original_words">reset( )</span>会把<span id="zpvflds" class="original_words">Matcher</span>讑ֈ当前字符串的开始处?/p><h3 id="header67">正则表达式与Java I/O</h3><p>到目前ؓ止,你看到的都是用正则表辑ּ处理静态字W串的例子。下面我们来演示一下怎样用正则表辑ּ扫描文gq且扑և匚w的字W串。受Unix的grep启发Q我写了?span class="original_words">JGrep.java</span>Q它需要两个参敎ͼ文g名,以及匚w字符串用的正则表辑ּ。它会把匚wq个正则表达式那部分内容及其所属行的行h印出来?/p><table class="code"><tbody><tr><td><pre><font color="#009900">//: c12:JGrep.java</font><font color="#009900">// A very simple version of the "grep" program.</font><font color="#009900">// {Args: JGrep.java "\\b[Ssct]\\w+"}</font><font color="#0000ff">import</font> java.io.*; <font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> java.util.*; <font color="#0000ff">import</font> com.bruceeckel.util.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> JGrep { <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) <font color="#0000ff">throws</font> Exception { <font color="#0000ff">if</font>(args.length < 2) { System.out.println(<font color="#004488">"Usage: java JGrep file regex"</font>); System.exit(0); } Pattern p = Pattern.compile(args[1]); <font color="#009900">// Iterate through the lines of the input file:</font> ListIterator it = <font color="#0000ff">new</font> TextFile(args[0]).listIterator(); <font color="#0000ff">while</font>(it.hasNext()) { Matcher m = p.matcher((String)it.next()); <font color="#0000ff">while</font>(m.find()) System.out.println(it.nextIndex() + <font color="#004488">": "</font> + m.group() + <font color="#004488">": "</font> + m.start()); } } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>文g是用<span id="dtkqhzr" class="original_words">TextFile</span>打开?本章的前半部分讲?。由?span class="original_words">TextFile</span>会把文g的各行放?span class="original_words">ArrayList</span>里面Q而我们又提取了一?span class="original_words">ListIterator</span>Q因此我们可以在文g的各行当中自q?既能向前也可以向??</p><p>每行都会有一?span class="original_words">Matcher</span>Q然后用<span id="ykfwcfx" class="original_words">find( )</span>扫描。注意,我们?span class="original_words">ListIterator.nextIndex( )</span>跟踪行号?</p><p>试参数?span class="original_words">JGrep.java</span>和以<span id="qrmsume" class="original_words">[Ssct]</span>开头的单词?/p><h3 id="header68">q需要StringTokenizer?</h3><p>看到正则表达式能提供q么强大的功能,你可能会怀疑,是不是还需要原先的<span id="udyeznf" class="original_words">StringTokenizer</span>。JDK 1.4以前Q要惛_割字W串Q只有用<span id="sxsjadg" class="original_words">StringTokenizer</span>。但现在Q有了正则表辑ּ之后Q它?yu)p做得更干净利烦了?/p><table class="sourcecode"><tbody><tr><td><pre><font color="#009900">//: c12:ReplacingStringTokenizer.java</font><font color="#0000ff">import</font> java.util.regex.*; <font color="#0000ff">import</font> com.bruceeckel.simpletest.*; <font color="#0000ff">import</font> java.util.*; <font color="#0000ff">public</font><font color="#0000ff">class</font> ReplacingStringTokenizer { <font color="#0000ff">private</font><font color="#0000ff">static</font> Test monitor = <font color="#0000ff">new</font> Test(); <font color="#0000ff">public</font><font color="#0000ff">static</font><font color="#0000ff">void</font> main(String[] args) { String input = <font color="#004488">"But I'm not dead yet! I feel happy!"</font>; StringTokenizer stoke = <font color="#0000ff">new</font> StringTokenizer(input); <font color="#0000ff">while</font>(stoke.hasMoreElements()) System.out.println(stoke.nextToken()); System.out.println(Arrays.asList(input.split(<font color="#004488">" "</font>))); monitor.expect(<font color="#0000ff">new</font> String[] { <font color="#004488">"But"</font>, <font color="#004488">"I'm"</font>, <font color="#004488">"not"</font>, <font color="#004488">"dead"</font>, <font color="#004488">"yet!"</font>, <font color="#004488">"I"</font>, <font color="#004488">"feel"</font>, <font color="#004488">"happy!"</font>, <font color="#004488">"[But, I'm, not, dead, yet!, I, feel, happy!]"</font> }); } } <font color="#009900">///:~</font></pre></td></tr></tbody></table><p>有了正则表达式,你就能用更复杂的模式字W串分割开来——要是交l?span class="original_words">StringTokenizer</span>的话Q事情会ȝ得多。我可以很有把握地说Q正则表辑ּ可以取代<span id="uzfwrfi" class="original_words">StringTokenizer</span>?</p><p>要想q一步学?fn)正则表辑ּQ徏议你?cite><span id="qgmdjcq" class="original_words">Mastering Regular Expression, 2nd Edition</span></cite>Q作者Jeffrey E. F. Friedl (O’Reilly, 2002)?/p><h2 id="header69">ȝ</h2><p>Java的I/O类库应该能满你的基本需求:你可以用它来d控制収ͼ文gQ内存,甚至是Internet。你q可以利用承来创徏新的输入和输出类型。你甚至可以利用Java会自动调用对象的<span id="fctkxpd" class="original_words">toString( )</span>Ҏ(gu)的特?Java仅有?自动cd转换")Q通过重新定义q个Ҏ(gu)Q来对要传给的对象做一个简单的扩展?/p><p>但是Java的I/O类库及其文还是留下了一些缺憾。比方说你打开一个文件往里面写东西,但是q个文g已经有了Q这么做会把原先的内容给覆盖?。这时要是能有一个异常就好了——有些编E语a能让你规定只能往新徏的文仉输出。看来Java是要你用<span id="intoqxl" class="original_words">File</span>对象来判断文件是否存在,因ؓ如果你用<span id="fkmdjme" class="original_words">FileOutputStream</span>?span class="original_words">FileWriter</span>的话Q文件就会被覆盖了?/p><p>我对I/O类库的评h(hun)是比较矛盄Q它实能干很多事情Q而且做到了跨q_。但是如果你不懂decorator模式Q就会觉得这U设计太隄解了Q所以无论是对老师q是学生Q都得多q力。此外这个类库也不完_否则我也用不着d<span id="qgtgmwz" class="original_words">TextFile</span>了。此外它没有提供格式化输出的功能Q而其他语a都已l提供了q种功能?/p></div> </td> </tr> <tr hb_tag="1" unselectable="on"> <td style="FONT-SIZE: 1pt" height="1" unselectable="on"> <div class="zpgqhkn" id="hotbar_promo"> </div> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/yrJavaWorld/aggbug/59209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yrJavaWorld/" target="_blank">MyJavaWorld</a> 2006-07-20 15:48 <a href="http://www.tkk7.com/yrJavaWorld/archive/2006/07/20/59209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ssni703.com" target="_blank">վavƬ</a>| <a href="http://igdytt.com" target="_blank">?VþþƷ </a>| <a href="http://dgyxcsb.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://56aaaa.com" target="_blank">ѹۿ</a>| <a href="http://zgjzysfc.com" target="_blank">޾ƷƵ</a>| <a href="http://xjtuykw.com" target="_blank">99ȲƷ99</a>| <a href="http://zbr555sina.com" target="_blank">ѹۿվ</a>| <a href="http://jcthbank.com" target="_blank">޾Ʒŷ޾Ʒ</a>| <a href="http://cih60o.com" target="_blank">Ļavר</a>| <a href="http://by1687.com" target="_blank">Ůžžѹۿվ</a>| <a href="http://3688008.com" target="_blank">Ʒ޳aƬ߹ۿٸ</a>| <a href="http://binz132.com" target="_blank">yellowƵѿ</a>| <a href="http://9156892.com" target="_blank">պƷƵѹۿ</a>| <a href="http://cn-zggx.com" target="_blank">޸Ůˮavվ</a>| <a href="http://4p5e.com" target="_blank">߹ۿѲavƬ</a>| <a href="http://xiaomaomi8.com" target="_blank">޾Ʒ91רֻ</a>| <a href="http://bomilon.com" target="_blank">ŮƷĻ</a>| <a href="http://yy6090qpgdy.com" target="_blank">91˳վɫwww</a>| <a href="http://xieehuomh.com" target="_blank">ò </a>| <a href="http://xuexilo.com" target="_blank">һ</a>| <a href="http://www96008.com" target="_blank">ѻɫëƬƵ</a>| <a href="http://zqsplc.com" target="_blank">av߾Ʒ޵һվ</a>| <a href="http://727744.com" target="_blank">þֻƷ10</a>| <a href="http://3c3w.com" target="_blank">˾Ʒձר61 </a>| <a href="http://25v8.com" target="_blank">ĻAV߾Ʒѹۿ</a>| <a href="http://34pmpm.com" target="_blank">Ļav</a>| <a href="http://dszb0099.com" target="_blank">hƵѿ</a>| <a href="http://zddzbp.com" target="_blank">վ߹ۿ</a>| <a href="http://taoduoduo666.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://wowo123.com" target="_blank">ҹ޾ƷƬ </a>| <a href="http://wwyw99977.com" target="_blank">һѹۿƵİ </a>| <a href="http://lanoss.com" target="_blank">鶹һѲվ</a>| <a href="http://xzgfbxg.com" target="_blank">ɫվwww</a>| <a href="http://blzcn.com" target="_blank">뾫ƷһƵ</a>| <a href="http://lzqzvip.com" target="_blank">޾Ʒ߹ۿ</a>| <a href="http://929119.com" target="_blank">eeussӰԺ</a>| <a href="http://102sds.com" target="_blank">ۺAV߲</a>| <a href="http://hysw100.com" target="_blank">޾ƷպAV</a>| <a href="http://benjiebf.com" target="_blank">޹þþþþþ</a>| <a href="http://023439.com" target="_blank">޾Ʒ߹ۿ </a>| <a href="http://minliusoft.com" target="_blank">ٸ69XXX</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>