技术开发 频道

DB2 V9.5 工作负载管理系列

 IBM 的 DB2 V9.5 引入并完善了工作负载管理(WORKLOAD MANAGEMENT)功能,使得我们可以更深入地洞察系统的运行情况并更好地控制资源和性能。在 DB2 V9.5 中,新引入的工作负载管理功能(WLM)可以帮助您标识、管理和监视数据服务器的工作负载。本文将重点介绍 DB2 V9.5 关于工作负载管理(WLM)的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。
 
构建数据库环境

  首先我们在 WINDOWS XP 环境下安装 DB2 ESE V9.5,安装完成后,打开一个 DB2CLP 窗口,发出CREATE DB 命令,创建示例数据库 DB2TEST1,命令中需要指定数据库代码页或数据库代码集,因为在 DB2 V9.5 中所有创建的数据库默认情况下数据库代码页都是 1208,数据库代码集都是 UTF-8,这点和之前的版本不一样。如果想把数据库代码页设置成 1386,数据库代码集设置成 GBK,就需要在 CREATE DB 命令中把数据库代码页设置成 1386 或者把数据库代码集设置成 GBK。具体如清单 1 所示:

  清单 1. 创建示例数据库 DB2TEST1

C:\> DB2 CREATE DATABASE DB2TEST1 USING CODESET GBK TERRITORY CN COLLATE

  USING SYSTEM PAGESIZE
4096

  DB20000I
CREATE DATABASE 命令成功完成。

  命令执行成功,这样我们创建了一个示例数据库 DB2TEST1。继续在这个 DB2CLP 窗口中发出 GET DB CFG 命令,查看示例数据库 DB2TEST1 的配置参数,我们可以看到数据库地域是 CN,数据库代码页被设置成了 1386,数据库代码集被设置成了 GBK。另外,在 DB2 V9.5 新增了几个参数,分别是数字兼容性、Varchar2 兼容性、十进制浮点舍入方式、启用 XML 字符操作和 WLM 收集时间间隔(分钟),这些参数的具体信息可以查看 DB2 信息中心。查看示例数据库 DB2TEST1 配置参数的详细情况请参见清单 2 所示:

  清单 2. 查看示例数据库 DB2TEST1 配置参数 

C:\> db2 get db cfg for db2test1

  数据库 db2test1 的数据库配置

  数据库配置发行版级别
= 0x0c00

  数据库发行版级别
= 0x0c00

  数据库地域
= CN

  数据库代码页
= 1386

  数据库代码集
= GBK

  数据库国家
/地区代码 = 86

  数据库整理顺序
= UNIQUE

  备用整理顺序 ( ALT_COLLATE )
=

  数字兼容性
= OFF

  
Varchar2 兼容性 = OFF

  数据库页大小
= 4096

  动态 SQL 查询管理 ( DYN_QUERY_MGMT )
= DISABLE

  对此数据库的发现支持 ( DISCOVER_DB )
= ENABLE

  限制访问
= NO

  缺省查询优化类 ( DFT_QUERYOPT )
= 5

  并行度 ( DFT_DEGREE )
= 1

  在算术异常时继续 ( DFT_SQLMATHWARN )
= NO

  缺省刷新有效期 ( DFT_REFRESH_AGE )
= 0

  缺省维护的选项( DFT_MTTB_TYPES )的表类型
= SYSTEM

  保留的高频值的数目 ( NUM_FREQVALUES )
= 10

  保留的分位点数目 ( NUM_QUANTILES )
= 20

  十进制浮点舍入方式 ( DECFLT_ROUNDING )
= ROUND_HALF_EVEN

  . . . . . . . . . .

  自调整内存 ( SELF_TUNING_MEM )
= ON

  数据库共享内存大小(
4 KB) ( DATABASE_MEMORY ) = AUTOMATIC

  数据库内存阈值 ( DB_MEM_THRESH )
= 10

  锁定列表的最大存储量(
4 KB) ( LOCKLIST ) = AUTOMATIC

  每个应用程序的锁定百分比列表 ( MAXLOCKS )
= AUTOMATIC

  程序包高速缓存大小(
4 KB) ( PCKCACHESZ ) = AUTOMATIC

  共享排序的排序堆域值(
4 KB) ( SHEAPTHRES_SHR ) = AUTOMATIC

  排序列表堆(
4 KB) ( SORTHEAP ) = AUTOMATIC

  . . . . . . . . . .

  自动维护 ( AUTO_MAINT )
= ON

  自动数据库备份 ( AUTO_DB_BACKUP )
= OFF

  自动表维护 ( AUTO_TBL_MAINT )
= ON

  自动 runstats ( AUTO_RUNSTATS )
= ON

  自动语句统计信息 ( AUTO_STMT_STATS )
= OFF

  自动统计信息概要分析 ( AUTO_STATS_PROF )
= OFF

  自动概要文件更新 ( AUTO_PROF_UPD )
= OFF

  自动重组 ( AUTO_REORG )
= OFF

  启用 XML 字符操作 ( ENABLE_XMLCHAR )
= YES

  WLM 收集时间间隔(分钟) ( WLM_COLLECT_INT )
= 0

  继续在这个 DB2CLP 窗口中,发出 DB2LEVEL 命令,查看 DB2 的版本信息,需要注意 DB2 代码发行版是 " SQL09050 ",工作负载管理(WLM)是从 DB2 V9.5 开始的,具体如清单 3 所示:

  清单 3. 查看示例数据库 DB2TEST1 的版本情况

C:\> db2level

  DB21085I 实例 " DB2_01 " 使用 "
32 " 位和 DB2 代码发行版 " SQL09050 ",级别标识为" 03010107 "。

  参考标记为 " DB2 v9.
5.0.808 "、" s071001 " 和 " NT3295 ",修订包为 " 0 "。

  产品使用 DB2 副本名 " DB2COPY2 " 安装在 " C:\PROGRA
~1\IBM\SQLLIB~1 " 中。

  我们在操作系统中存在两个用户,分别是 RHETTE,和 DB2ADMIN,密码都是 passw0rd。我们使用RHETTE 用户在 DB2CLP 窗口中连上示例数据库 DB2TEST1,执行带有 CREATE TABLE 语句的脚本 project.sql,创建示例表 PROJECT,具体如清单 4 所示:

  清单 4 . 创建示例表 PROJECT

 C:\> db2 connect to db2test1

  数据库连接信息

  数据库服务器
= DB2 / NT 9.5.0

  SQL 授权标识
= RHETTE

  本地数据库别名
= DB2TEST1

  C:\
>db2 -tvf project.sql

  
CREATE TABLE "RHETTE"."PROJECT" ( "PROJNO" CHAR ( 6 ) NOT NULL ,

  "PROJNAME"
VARCHAR ( 24 ) NOT NULL WITH DEFAULT '' , "DEPTNO" CHAR ( 3 ) NOT NULL ,

  "RESPEMP"
CHAR ( 6 ) NOT NULL , "PRSTAFF" DECIMAL ( 5 , 2 ) , "PRSTDATE" DATE ,

  "PRENDATE" DATE , "MAJPROJ"
CHAR ( 6 ) ) IN "USERSPACE1"

  DB20000I SQL命令成功完成。

  
ALTER TABLE "RHETTE"."PROJECT" ADD CONSTRAINT "PK_PROJECT" PRIMARY KEY ( "PROJNO" )

  DB20000I SQL命令成功完成。

  
CREATE INDEX "RHETTE"."XPROJ2" ON "RHETTE"."PROJECT" ( "RESPEMP" ASC)

  ALLOW
REVERSE SCANS

  DB20000I SQL命令成功完成。

  继续在 DB2CLP 窗口中插入测试数据,然后发出 SELECT 语句,我们可以看到这些数据,具体如清单 5 所示:

  清单 5 . 插入数据到示例表 PROJECT 中

C:\> db2 select * from project

  PROJNO PROJNAME DEPTNO RESPEMP PRSTAFF PRSTDATE PRENDATE MAJPROJ

  
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  AD3100 ADMIN SERVICES D01
000010 6.50 2002-01-01 2003-02-01 -

  AD3110 GENERAL ADMIN SYSTEMS D21
000070 6.00 2002-01-01 2003-02-01

  AD3100

  AD3111 PAYROLL PROGRAMMING D21
000230 2.00 2002-01-01 2003-02-01

  AD3110

  AD3112 PERSONNEL PROGRAMMING D21
000250 1.00 2002-01-01 2003-02-01

  AD3110

  AD3113 ACCOUNT PROGRAMMING D21
000270 2.00 2002-01-01 2003-02-01

  AD3110

  IF1000 QUERY SERVICES C01
000030 2.00 2002-01-01 2003-02-01 -

  IF2000
USER EDUCATION C01 000030 1.00 2002-01-01 2003-02-01 -

  MA2100 WELD LINE AUTOMATION D01
000010 12.00 2002-01-01 2003-02-01 -

  MA2110 W L PROGRAMMING D11
000060 9.00 2002-01-01 2003-02-01

  MA2100

  MA2111 W L PROGRAM DESIGN D11
000220 2.00 2002-01-01 1982-12-01

  MA2110

  MA2112 W L ROBOT DESIGN D11
000150 3.00 2002-01-01 1982-12-01

  MA2110

  MA2113 W L PROD CONT PROGS D11
000160 3.00 2002-02-15 1982-12-01

  MA2110

  OP1000 OPERATION SUPPORT E01
000050 6.00 2002-01-01 2003-02-01 -

  OP1010 OPERATION E11
000090 5.00 2002-01-01 2003-02-01

  OP1000

  OP2000 GEN SYSTEMS SERVICES E01
000050 5.00 2002-01-01 2003-02-01 -

  OP2010 SYSTEMS SUPPORT E21
000100 4.00 2002-01-01 2003-02-01

  OP2000

  OP2011 SCP SYSTEMS SUPPORT E21
000320 1.00 2002-01-01 2003-02-01

  OP2010

  OP2012 APPLICATIONS SUPPORT E21
000330 1.00 2002-01-01 2003-02-01

  OP2010

  OP2013 DB
/DC SUPPORT E21 000340 1.00 2002-01-01 2003-02-01

  OP2010

  PL2100 WELD LINE PLANNING B01
000020 1.00 2002-01-01 2002-09-15

  MA2100

  20 条记录已选择。

  定义服务类(SERVICE CLASS)

  服务类的目的是为工作运行定义一个执行环境,这个环境包含可用的资源和不同的执行阈值,当你定义一个工作负载时,你必须为之指定对应的服务类。如果你没有显式的定义工作负载,用户数据库请求会被认为是系统默认的工作负载,其对应的服务类是系统默认的用户服务类。所有的系统数据库请求,对应的都是默认系统服务类。

  所有的数据库请求都是在服务类中执行的,并且在服务类中获得相应的资源。所有的连接都是映射到工作负载上的,所有的工作负载都是映射到服务类上的。针对服务类中资源分配的情况,可以定义相应的阈值,来进行限定。DB2 的服务类拥有两层结构:服务父类(Service Superclass)和服务子类(Service Subclass)。

  当你使用服务类时,你可以通过控制这个服务类的一系列属性,使不同的工作具有不同的优先级。比如,你可以设置服务类中工作的 I/O 页预取优先级,设置服务类中所有代理的 CPU 优先级,你还可以通过不同类型的阈值控制服务类中工作所使用的资源。

  下面我们打开一个 DB2CLP 窗口,发出 ALTER SERVICE CLASS 命令,使服务类 super_class、服务子类subclass_rhette、subclass_db2admin 失效,接着发出 DROP SERVICE CLASS 命令,删除服务类和服务子类。需要注意的是,如果你想删除一个服务父类(service superclass),需要保证所有相关的服务子类、工作负载、连接、动作、阈值等都无效。DROP SERVICE CLASS 命令成功完成后,发出 CREATE SERVICE CLASS 命令,创建我们需要的服务父类和服务子类,具体如清单 6 所示:

  清单 6 . 创建服务类和服务子类 

C:\> db2 -tvf create_serviceclass.sql

  
alter service class subclass_rhette under super_class disable

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
alter service class subclass_db2admin under super_class disable

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
alter service class super_class disable

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
drop service class subclass_rhette under super_class

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
drop service class subclass_db2admin under super_class

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
drop service class super_class

  DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在

  SQL 处理期间,它返回:

  SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE
= 42704

  
create service class super_class

  DB20000I SQL命令成功完成。

  
create service class subclass_rhette under super_class agent priority

  
default prefetch priority default collect activity data on all with details

  
and values collect aggregate activity data base collect aggregate request data base

  DB20000I SQL命令成功完成。

  
create service class subclass_db2admin under super_class agent priority 6

  prefetch priority high

  DB20000I SQL命令成功完成。

  名称成功完成,需要注意的是我们在执行 CREATE SERVICE CLASS 命令时,指定了多个选项,下面来分别介绍一下:

  AGENT PRIORITY DEFAULT or AGENT PRIORITY integer-constant

  代理进程的优先级实际是CPU 的优先级。

  需要注意的是,使用这个属性只适用于用户请求对应的服务类,不适合系统数据库请求对应的系统服务类。你可以使用这个属性把当前服务类中代理的线程优先级和其他服务类区别开来。

  AGENT PRIORITY integer-constant:指定运行在服务类中的代理相对于操作系统优先级的相对值。 AGENT PRIORITY DEFAULT:和运行在 DB2 中的线程一样的正常优先级。默认值是 DEFAULT。当代理优先级设置为 DEFAULT 时,没有特殊的操作发生,服务类中的代理将按照所有的 DB2 线程一样的优先级进行调度。DEDAULT 对应的值是 -32768。

  当这个参数设置成 DEFAULT 以外的值时,代理真正的优先级将是正常优先级加上 AGENT PRIORITY,并将在下次动作时生效。比如,如果正常的优先级是 20,并且我们把这个参数设置成 6,那么服务类中的代理的优先级是 20+6=26.

  当服务父类的代理优先级设成 default 时,那么这个服务父类中的代理将按照和操作系统调度 DB2 线程一样的优先级进行调度。当服务子类的代理优先级设成 default 时,服务子类继承服务父类的进程优先级。默认的服务子类的代理优先级不能进行修改。

  在 Linux 和 UNIX 平台,integer-constant 的值可以是 -20 到 20(值越小代表的优先级越高),在windows 平台,integer-constant 的值可以是 -6 到 6(值越小代表的优先级月低)。

  PREFETCH PRIORITY

  你可以使用这个参数来控制服务类中代理的预取优先级。可选的值有 high, medium, low. 当你设置了这个参数,服务类中的代理对应的预取顺序在下次将按照你设置的值进行。如果你在一个预取请求提交后再修改这个参数的值,那么这个预取请求将不受新的设置参数值映像。

  DEFAULT :对一个数据库服务父类来说,默认的值是 medium 预取顺序。当你对数据库服务子类指定默认值时,服务子类将继承相应的服务父类的预取优先级。

  HIGH :把预取优先级设成高的。

  MEDIUM :把预取优先级设成中的。

  LOW :把预取优先级设成低的。

  COLLECT ACTIVITY DATA

  指定当动作完成后服务类中执行的每个动作信息都发送到相应的事件监控器中。默认值是 COLLECT ACTIVITY DATA NONE。COLLECT ACTIVITY DATA 子句只适用于服务子类。

  NONE :指定将不收集这个服务类中执行每个动作信息。

  ON COORDINATOR DATABASE PARTITION: 指定只收集动作所在数据库分区上的动作数据。

  ON ALL DATABASE PARTITIONS : 指定收集所有数据库分区上的动作数据。但是,动作细节和值还是只在动作所在的数据库分区上收集。

  WITHOUT DETAILS : 指定语句和编译环境不发送给事件监控器。

  WITH DETAILS : 指定将语句和编译环境发送给事件监控器。

  AND VALUES : 指定把动作相关的输入数据值发送给相应的事件监控器。

  COLLECT AGGREGATE ACTIVITY DATA

  指定捕获这个服务类相关的 aggregate activity data 并发送给相应的事件监控器。这些信息将被定期收集,收集的频率受工作负载管理收集时间间隔配置参数 (wlm_collect_int) 数据库配置参数控制。默认值是 COLLECT AGGREGATE ACTIVITY DATA NONE. COLLECT AGGREGATE ACTIVITY DATA 子句只适用于服务子类。

  BASE : 指定这个服务类的基本 aggregate activity data 将被捕获并发送给相应的事件监控器。

  EXTENDED : 指定这个服务类的所有 aggregate activity data 将被捕获并发送给相应的事件监控器。

  NONE : 指定将不捕获这个服务类的 aggregate activity data 。

  COLLECT AGGREGATE REQUEST DATA

  指定捕获这个服务类相关的 aggregate request data 并发送给相应的事件监控器。这些信息将被定期收集,收集的频率受工作负载管理收集时间间隔配置参数 (wlm_collect_int) 数据库配置参数控制。 默认值是COLLECT AGGREGATE ACTIVITY DATA NONE。 COLLECT AGGREGATE ACTIVITY DATA 子句只适用于服务子类。

  BASE :指定这个服务类的基本 aggregate request data 将被捕获并发送给相应的事件监控器。

  NONE :指定将不捕获这个服务类的 aggregate request data 。

  工作负载管理收集时间间隔配置参数(wlm_collect_int)

  此参数指定工作负载管理(WLM)统计信息的收集和复位时间间隔(以分钟为单位)。

  每隔 x wlm_collect_int 分钟(其中 x 是 wlm_collect_int 参数的值),就会收集所有工作负载管理统计信息并将它们发送至任何活动统计信息事件监视器,然后复位统计信息。如果存在活动事件监视器,那么将根据该事件监视器的创建方式,将统计信息写入文件或表。如果它不存在,那么将只复位统计信息,而不进行收集。

  可以使用统计信息事件监视器收集的工作负载管理统计信息来监视短期和长期系统行为。由于可以将结果合并在一起来获得长期行为,所以可以使用较小的时间间隔来同时获得短期系统行为和长期系统行为。但是,由于必须手动合并不同时间间隔中的结果,这将使分析变得复杂。如果不需要手动合并结果,那么较小的时间间隔会导致不必要的开销增大。因此,减小时间间隔以捕获较短期的行为,并且在只分析长期行为就已足够的情况下,增大时间间隔以减少开销。

  需要对每个数据库定制时间间隔,而不是对每个 SQL 请求、命令调用或应用程序进行定制。没有其他配置参数需要考虑。

  注: 所有 WLM 统计信息表函数都返回自上次复位统计信息以来累积的统计信息。将按此配置参数指定的时间间隔定期复位统计信息。

  需要注意的是,默认的服务子类 SYSDEFAULTSUBCLASS,自动为每个服务父类自动创建一个。我们可以通过系统视图 SYSCAT.SERVICECLASSES,或者通过 db2pd 加 –serviceclasses 选项进行查看定义的服务类。

  继续在 DB2CLP 窗口中,发出 DB2PD 命令,查看我们创建的服务类情况,我们可以看到服务父类SUPER_CLASS,服务子类 SUBCLASS_RHETTE、SUBCLASS_DB2ADMIN,以及默认创建的服务子类SYSDEFAULTSUBCLASS,具体如清单7所示:

  清单 7 . 查看窗口的服务类

Database Partition 0 - - Database DB2TEST1 - - Active - - Up 0 days 06 : 26 : 15

  Service Classes:

  . . . . . . . . . .

  Service Class Name
= SUPER_CLASS

  Service Class ID
= 14

  Service Class Type
= Service Superclass

  
Default Subclass ID = 15

  Service Class State
= Enabled

  Agent Priority
= Default

  Prefetch Priority
= Default

  Outbound Correlator
= None

  
Work Action Set ID = N/A

  Collect Activity Opt
= None

  Num Connections
= 0

  Last
Statistics Reset Time = 2007 - 12 - 27 13:33:05.000000

  Num Coordinator Connections
= 0

  Coordinator Connections HWM
= 0

  Associated Workload Occurrences ( WLO ) :

  AppHandl
[ nod - index ] WL ID WLO ID UOW ID WLO State

  Service Class Name
= SYSDEFAULTSUBCLASS

  Service Class ID
= 15

  Service Class Type
= Service Subclass

  Parent Superclass ID
= 14

  Service Class State
= Enabled

  Agent Priority
= Default

  Prefetch Priority
= Default

  Outbound Correlator
= None

  Collect Activity Opt
= None

  Collect Aggr Activity Opt
= None

  Collect Aggr Request Opt
= None

  Act Lifetime Histogram Template ID
= 1

  Act Queue Time Histogram Template ID
= 1

  Act
Execute Time Histogram Template ID = 1

  Act Estimated Cost Histogram Template ID
= 1

  Act Interarrival Time Histogram Template ID
= 1

  Request
Execute Time Histogram Template ID = 1

  Access
Count = 0

  Last Stats Reset Time
= 2007-12-27 13:33:05.000000

  Activities HWM
= 0

  Activities Completed
= 0

  Activities Rejected
= 0

  Activities Aborted
= 0

  Associated Agents:

  EDU ID AppHandl
[ nod-index ] WL ID WLO ID UOW ID Activity ID

  Associated Non
-agent threads:

  PID TID Thread Name

  Service Class Name
= SUBCLASS_RHETTE

  Service Class ID
= 16

  Service Class Type
= Service Subclass

  Parent Superclass ID
= 14

  Service Class State
= Enabled

  Agent Priority
= Default

  Prefetch Priority
= Default

  Outbound Correlator
= None

  Collect Activity Opt
= On all partitions with details and values

  Collect Aggr Activity Opt
= Base

  Collect Aggr Request Opt
= Base

  Act Lifetime Histogram Template ID
= 1

  Act Queue Time Histogram Template ID
= 1

  Act
Execute Time Histogram Template ID = 1

  Act Estimated Cost Histogram Template ID
= 1

  Act Interarrival Time Histogram Template ID
= 1

  Request
Execute Time Histogram Template ID = 1

  Access
Count = 0

  Last Stats Reset Time
= 2007-12-27 13:33:05.000000

  Activities HWM
= 0

  Activities Completed
= 0

  Activities Rejected
= 0

  Activities Aborted
= 0

  Associated Agents:

  EDU ID AppHandl
[ nod-index ] WL ID WLO ID UOW ID Activity ID

  Associated Non
-agent threads:

  PID TID Thread Name

  Service Class Name
= SUBCLASS_DB2ADMIN

  Service Class ID
= 17

  Service Class Type
= Service Subclass

  Parent Superclass ID
= 14

  Service Class State
= Enabled

  Agent Priority
= 6

  Prefetch Priority
= High

  Outbound Correlator
= None

  Collect Activity Opt
= None

  Collect Aggr Activity Opt
= None

  Collect Aggr Request Opt
= None

  Act Lifetime Histogram Template ID
= 1

  Act Queue Time Histogram Template ID
= 1

  Act
Execute Time Histogram Template ID = 1

  Act Estimated Cost Histogram Template ID
= 1

  Act Interarrival Time Histogram Template ID
= 1

  Request
Execute Time Histogram Template ID = 1

  Access
Count = 0

  Last Stats Reset Time
= 2007-12-27 13:33:05.000000

  Activities HWM
= 0

  Activities Completed
= 0

  Activities Rejected
= 0

  Activities Aborted
= 0

  Associated Agents:

  EDU ID AppHandl
[ nod-index ] WL ID WLO ID UOW ID Activity ID

  Associated Non
-agent threads:

  PID TID Thread Name

       我们也可以通过控制中心查看系统视图 SYSDEFAULTSUBCLASS,来看一下我们创建的服务类情况,具体如图 2 所示:

  图 2 . 查看已定义的服务类

0
相关文章