cache buffers chains以及热块解决方案

今天是2013-10-10,今天下午我调休了,中午饭过后从14点一直睡到16点,这种感觉真爽。
 之前学习过关于buffer cache的cache buffers lru chain的知识,其中说到了lru,dirty list,ws等等,详见:http://blog.csdn.net/xiaohai20102010/article/details/11490925

今天在看一下buffer bucket 与 cache buffers chain
为了快速找到查询中所需要的block是否在cache buffer中,oracle划分了bucket,根据每个数据块dba进行hash计算,然后存放到不同的bucket中区,bucket中存有cache buffers chain以及相关block的buffer header,举个例子,buffer相当于一个图书馆,bucket相当于每个抽屉,在这个抽屉中记录了是每个buffer中块的信息也就是buffer header,这个名片的信息(buffer header)通过cache buffers chain进行串联起来,每个抽屉都要有专门人进行管理,不然大家都翻卡片找自己的书那么不乱了嘛,这个管理这就是cache buffer chain latch当我们找书的时候,首先经过hash计算找到buffer位于哪个bucket中,然后通过获得cache buffers chain lath然后从cache buffers chain上 拿到每个buffer的名片信息,然后再去获得这个buffer,如果没有找到,那么就会从数据文件中去读这个所需信息。(通俗易懂的说发,呵呵)
 ORACLE 中可以通过查看隐含参数可以知道有多个bucket,就像查看x$KCBWDS可以知道有多少个ws一样。
eg:

SQL> set verify off
SQL> @getsp.sql
Enter value for par: db_block_hash

KSPPINM                                            KSPPSTVL             KSPPDESC
-------------------------------------------------- -------------------- ------------------------------------------------------------
_db_block_hash_buckets                             65536                Number of database block hash buckets
_db_block_hash_latches                             2048                 Number of database block hash latches

SQL>
可以看到有65536个bucket,但是latch的数量为:2048,也就是说每个cache buffers chain latch 管理32个bucket,65536/2048=32,在google找到了一个图,如下,可以更加明白:

首先我通过转储buffers然后找到一个chain如下:
EG:
ALTER SYSTEM SET EVENTS 'IMMEDAITE TRACE NAME BUFFERS LEVEL 10';

CHAIN: 35 LOC: 0x7bcf8bb0 HEAD: [0x733dc118,0x733dc118]
    BH (0x733dc060) file#: 1 rdba: 0x004075b5 (1/30133) class: 1 ba: 0x730a0000
      set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 475,28
      dbwrid: 0 obj: 225 objn: 225 tsn: 0 afn: 1 hint: f
      hash: [0x7bcf8bb0,0x7bcf8bb0] lru: [0x733dc288,0x733dc018]
      lru-flags: debug_dump
      ckptq: [NULL] fileq: [NULL] objq: [0x733dc790,0x733dbf08] objaq: [0x733dc7a0,0x733dbf18]
      st: XCURRENT md: NULL fpin: 'kdswh05: kdsgrp' tch: 2
      flags:
      LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]
      buffer tsn: 0 rdba: 0x004075b5 (1/30133)
      scn: 0x0000.0002d9f1 seq: 0x01 flg: 0x06 tail: 0xd9f10601
      frmt: 0x02 chkval: 0x1ca5 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
可以看到这是第35个chain,其中包含的是buffer header 信息,bh就是代表buffer header的,在其中还可以找到刚刚提及到的hash计算,hash: [0x7bcf8bb0,0x7bcf8bb0]代表下一个buffer header 的地址以及上一个buffer header地址,lru: [0x733dc288,0x733dc018]代表在lru中下一个buffer块的位和上一个lru中buffer块的位置。另外还有一个tch:2,这个代表这个快被两次访问,如果该值越到,那么这个块就越热手 ,大家都在找她,也就会出现热点块的概念,同时伴随着chache buffers chain的latch 竞争。
对于chain中的bh的信息,在oracle中还存有一个fixed table 那就是x$bh,对于该视图介绍,请看博客地址:
http://blog.csdn.net/xiaohai20102010/article/details/10285449
这里介绍几个常用的字段信息:
TS#         NUMBER 8.X Tablespace number 
DBARFIL     NUMBER 8.X Relative file number of block 
DBAFIL      NUMBER 7.3 File number of block 
DBABLK      NUMBER Block number of block 
NXT_HASH    NUMBER Next buffer on this hash chain 
PRV_HASH    NUMBER Previous buffer on this hash chain 
NXT_LRU     NUMBER Next buffer on the LRU 
PRV_LRU     NUMBER Previous buffer on the LRU 
HLADDR      RAW(4) Hash Chain Latch Address 
TCH     NUMBER 8.1 Touch Count
next_hash以及PRV_HASH 对应于上文提到的hash: [0x7bcf8bb0,0x7bcf8bb0],NXT_LRU以及PRV_LRU对应上文提到的lru: [0x733dc288,0x733dc018],tch对应于上文提到的tch: 2。等等等等,还有很多信息反正bufferheader的信息都在x$bh中可以找到。但是注意oracle一直在变动这些表,具体字段还需依据系统版本来定。

select ts#,dbarfil,dbafil,dbablk,nxt_hash,prv_hash,nxt_lru,prv_lru,hladdr,tch from x$bh where nxt_hash='0x7bcf8bb0';

一、
知道如上信息了,首先查看一下数据库中,最热手的数据块信息;
eg:
SQL> select * from (select ts#,file#,dbarfil,dbablk,state,tch,nxt_hash,prv_hash,nxt_repl,prv_repl from x$bh order by tch desc) where rownum<20;

TS#      FILE#    DBARFIL     DBABLK      STATE        TCH NXT_HASH         PRV_HASH         NXT_REPL         PRV_REPL
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------------- ----------------
         0          1          1       2017          1        255 000000007BDC00B0 000000007BDC00B0 0000000073FF9DD8 0000000073FF65C8
         0          1          1       2016          1        254 000000007BE481C0 000000007BE481C0 0000000071FDE370 0000000071FDD740
         1          2          2      62997          1        235 000000007BE20D10 0000000070FD82F0 0000000073FF7BB8 000000006FFEADC0
         1          2          2      39076          1        201 000000007BCFD820 000000007BCFD820 000000006FFF1690 000000006FFF12E8
         1          2          2      36844          1        196 000000007BDC69E0 000000007BDC69E0 000000006FFEF6E0 000000006FFEF0C8
         1          2          2      36839          1        150 000000007BDA68F0 00000000777F7CB8 00000000777FB500 00000000777FA660
         1          2          2      39131          1        126 000000007BCFA8B0 000000007BCFA8B0 000000006FFF07F0 000000006FFF0580
         1          2          2      39127          1        126 000000007BDB66B0 000000007BDB66B0 000000006FFF06B8 000000006FFF0448
         1          2          2      60461          1        126 000000007BDB0550 000000007BDB0550 000000006FFF01D8 000000006FFEFF68
         1          2          2      36826          1        126 000000007BD9A400 000000007BD9A400 000000006FFEFE30 000000006FFEFBC0
         0          1          1      66493          1        126 00000000727E3618 000000007BD99600 000000006FFF0CD0 000000006FFF0A60

TS#      FILE#    DBARFIL     DBABLK      STATE        TCH NXT_HASH         PRV_HASH         NXT_REPL         PRV_REPL
---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------------- ---------------- ----------------
         0          1          1      77698          1        126 000000007BD95EB0 000000006F3E4D40 000000006FFF0928 000000006FFF06B8
         0          1          1        465          1        126 000000007BD81070 000000007BD81070 000000006FFF0B98 000000006FFF0928
         1          2          2      39083          1        126 0000000072FE7578 000000007BD71D30 0000000073FFAA08 000000006FFF0CD0
         1          2          2      60459          1        126 000000007BD5C130 000000007BD5C130 000000006FFF0448 000000006FFF01D8
         1          2          2      36824          1        126 000000007BD45FE0 000000007BD45FE0 000000006FFEFBC0 000000006FFEF950
         1          2          2      39073          1        126 0000000072FF72F8 000000007BD31B50 000000006FFF12E8 000000006FFF1558
         0          1          1        497          1        126 000000007BD31A30 000000007BD31A30 000000006FFF0E08 000000006FFF0B98
         1          2          2      60462          1        126 000000007BD28440 000000007BD28440 000000006FFF00A0 000000006FFEFE30

19 rows selected.

SQL>
可以看到在dbablk为:2017,它的nxt_hash与prv_hash都是一个,也就是说这个块自己在一个chain上,这个chain中在没有其他数据块。

知道了这个信息,我们可以知道这些热块存在于那个表空间,那个数据文件,那个数据块是热的等等信息。

二、
根据x$bh找到访问频繁的对象。可以与dba_extents关联

eg:
SQL>  select owner,segment_name,partition_name,segment_type,tablespace_name from dba_extents a,
  2   (select * from
  3      (select ts#,file#,dbarfil,dbablk,state,tch,nxt_hash,prv_hash,nxt_repl,prv_repl from x$bh order by tch desc)
  4    where rownum<20) b
  5    where a.file_id=b.file# and a.block_id <= b.dbablk and a.block_id+a.blocks >= b.dbablk and a.relative_fno=b.dbarfil;
 
 
OWNER                          SEGMENT_NAME                                                                     PARTITION_NAME                 SEGMENT_TYPE       TABLESPACE_NAME
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------
SYS                            JOB$                                                                                                            TABLE              SYSTEM
SYS                            JOB$                                                                                                            TABLE              SYSTEM
SYS                            SCHEDULER$_CLASS                                                                                                TABLE              SYSTEM
SYS                            SCHEDULER$_JOB                                                                                                  TABLE              SYSTEM
SYS                            SCHEDULER$_JOB                                                                                                  TABLE              SYSTEM
SYS                            SCHEDULER$_JOB                                                                                                  TABLE              SYSTEM
SYS                            SCHEDULER$_LIGHTWEIGHT_JOB                                                                                      TABLE              SYSTEM
SYS                            C_USER#                                                                                                         CLUSTER            SYSTEM
SYS                            C_USER#                                                                                                         CLUSTER            SYSTEM
SYS                            I_USER#                                                                                                         INDEX              SYSTEM
SYS                            I_USER1                                                                                                         INDEX              SYSTEM
SYS                            I_SYSAUTH1                                                                                                      INDEX              SYSTEM
SYS                            I_SYSAUTH1                                                                                                      INDEX              SYSTEM
SYS                            I_SYSAUTH1                                                                                                      INDEX              SYSTEM
SYS                            I_SYSAUTH1                                                                                                      INDEX              SYSTEM
SYS                            I_SYSAUTH1                                                                                                      INDEX              SYSTEM
SYS                            I_PROFILE                                                                                                       INDEX              SYSTEM
SYS                            I_JOB_JOB                                                                                                       INDEX              SYSTEM
SYS                            I_JOB_NEXT                                                                                                      INDEX              SYSTEM
SYS                            SCHEDULER$_CLASS_PK                                                                                             INDEX              SYSTEM
 
OWNER                          SEGMENT_NAME                                                                     PARTITION_NAME                 SEGMENT_TYPE       TABLESPACE_NAME
------------------------------ -------------------------------------------------------------------------------- ------------------------------ ------------------ ------------------------------
SYS                            SCHEDULER$_CLASS_PK                                                                                             INDEX              SYSTEM
SYS                            SCHEDULER$_LOBJ_UK                                                                                              INDEX              SYSTEM
 
22 rows selected
 
SQL>
三、
根据x$bh 也可以找到对应于获得该cache buffers chain 的latch信息,注意不能与v$latch进行关联,因为该视图是个汇总,需要与v$latch_children视图进行关联:
eg:
SQL> select name,gets,misses,sleeps,immediate_gets,immediate_misses,spin_gets,wait_time
  2  from v$latch_children a,
  3  (select * from
  4   (select ts#,file#,dbarfil,dbablk,state,tch,nxt_hash,hladdr,prv_hash,nxt_repl,prv_repl from x$bh order by tch desc)
  5   where rownum<20) b
  6    where a.ADDR=b.hladdr and a.name='cache buffers chains' order by gets desc;
 
NAME                                                                   GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES  SPIN_GETS  WAIT_TIME
---------------------------------------------------------------- ---------- ---------- ---------- -------------- ---------------- ---------- ----------
cache buffers chains                                                  94752          0          0             71                0          0          0
cache buffers chains                                                  37077          0          0             60                0          0          0
cache buffers chains                                                  29415          0          0             70                0          0          0
cache buffers chains                                                  27973          0          0             67                0          0          0
cache buffers chains                                                  21447          0          0             71                0          0          0
cache buffers chains                                                  15893          0          0             64                0          0          0
cache buffers chains                                                  10095          0          0             66                0          0          0
cache buffers chains                                                   8585          0          0            146                0          0          0
cache buffers chains                                                   3782          0          0             76                0          0          0
cache buffers chains                                                   3744          0          0             67                0          0          0
cache buffers chains                                                   3447          0          0             70                0          0          0
cache buffers chains                                                   3386          0          0             65                0          0          0
cache buffers chains                                                   2785          0          0             76                0          0          0
cache buffers chains                                                   2782          0          0             71                0          0          0
cache buffers chains                                                   2683          0          0             67                0          0          0
cache buffers chains                                                   2488          0          0             69                0          0          0
cache buffers chains                                                   2443          0          0             66                0          0          0
cache buffers chains                                                   2300          0          0             62                0          0          0
cache buffers chains                                                   1895          0          0             71                0          0          0
 
19 rows selected
 
SQL>
四、
如果存在cache buffers chains 可以通过statspack report查看得到信息,可以参考v$session_wait 视图找到free latch 等待事件,并且可以通过如下语句找到相应的latch 地址,然后我们在去组合找到对象,也是一种方法
eg:
查找属于cache buffers chains的latch信息,注意下面是演示,没有真正出现cache buffers chains latch竞争现象。
SQL> select addr,name,gets,misses,sleeps,immediate_gets,immediate_misses,spin_gets,wait_time
  2     from v$latch_children where name='cache buffers chains' and rownum<20 order by sleeps desc
  3  ;
 
ADDR             NAME                                                                   GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES  SPIN_GETS  WAIT_TIME
---------------- ---------------------------------------------------------------- ---------- ---------- ---------- -------------- ---------------- ---------- ----------
000000007BE5B278 cache buffers chains                                                   1243          0          0             72                0          0          0
000000007BE58468 cache buffers chains                                                    915          0          0             71                0          0          0
000000007BE5B0E8 cache buffers chains                                                   9720          0          0             69                0          0          0
000000007BE5B020 cache buffers chains                                                    957          0          0             65                0          0          0
000000007BE5AF58 cache buffers chains                                                    924          0          0             69                0          0          0
000000007BE5AE90 cache buffers chains                                                    514          0          0             67                0          0          0
000000007BE5ADC8 cache buffers chains                                                   1220          0          0             71                0          0          0
000000007BE5AD00 cache buffers chains                                                   1120          0          0             66                0          0          0
000000007BE59C38 cache buffers chains                                                   1041          0          0            139                0          0          0
000000007BE59B70 cache buffers chains                                                    473          0          0             66                0          0          0
000000007BE59AA8 cache buffers chains                                                    899          0          0             70                0          0          0
000000007BE599E0 cache buffers chains                                                    851          0          0             66                0          0          0
000000007BE59918 cache buffers chains                                                   3122          0          0             67                0          0          0
000000007BE59850 cache buffers chains                                                    487          0          0             65                0          0          0
000000007BE59788 cache buffers chains                                                    738          0          0             77                0          0          0
000000007BE596C0 cache buffers chains                                                   1008          0          0             69                0          0          0
000000007BE585F8 cache buffers chains                                                    756          0          0             69                0          0          0
000000007BE58530 cache buffers chains                                                   1983          0          0             72                0          0          0
000000007BE5B1B0 cache buffers chains                                                    539          0          0             63                0          0          0
 
19 rows selected
 
SQL>
既然找到了latch的addr,那么也就可以找到相应的对象信息:
eg:
SQL>   select b.ts#,b.file#,b.dbarfil,b.dbablk,b.tch,a.gets,a.misses,a.sleeps,a.immediate_gets,a.immediate_misses from
  2    (select * from
  3    (select addr,ts#,file#,dbarfil,dbablk,hladdr,tch,nxt_hash,prv_hash,nxt_repl,prv_repl from x$bh
  4     order by tch desc) where rownum<20 )b,
  5     (select addr,name,gets,misses,sleeps,immediate_gets,immediate_misses,spin_gets,wait_time
  6   from v$latch_children where name='cache buffers chains' order by misses desc) a
  7    where a.addr=b.hladdr order by b.tch desc;
 
       TS#      FILE#    DBARFIL     DBABLK        TCH       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------- ----------------
         0          1          1      12498        175       9117          0          0            151                0
         0          1          1      12584        172       4000          0          0             71                0
         0          1          1      12496        172       4048          0          0             82                0
         0          1          1      12481        172       3666          0          0             68                0
         0          1          1      12489        172       2105          0          0             77                0
         0          1          1      12497        170       3029          0          0             83                0
         0          1          1        964        168      99290          0          0             76                0
         0          1          1       2025        166       3789          0          0             72                0
         0          1          1        963        166      38918          0          0             60                0
         0          1          1        965        166      29381          0          0             71                0
         1          2          2      36771        151      16726          0          0             68                0
         0          1          1      77728        151       2506          0          0             68                0
         1          2          2      38275        151       2897          0          0             70                0
         0          1          1        417        111       5778          0          0             70                0
         1          2          2      36847         89       2964          0          0             72                0
         0          1          1      46461         77       7481          0          0             88                0
         0          1          1      12097         76       2741          0          0             70                0
         0          1          1      12145         76       3046          0          0             80                0
         0          1          1      65330         76      12240          0          0             68                0
 
19 rows selected
 
SQL>
五、
如下是看到一个blog,在此学习一下。
 
热点块和热点对象我们都找到了,但是我们该怎么来解决这个问题呢?一般来说,热点块会导致cache buffers chains竞争等待,但并不是说cache buffer chains一定是因为热点块而起,在特别情况下有可能是因为latch数量的问题导致的,也就是一个latch管理的buffers数量太多而导致竞争激烈。但是latch数量我们一般是不会轻易去设置的,这是oracle的隐藏参数。
 
实际上最有效的办法,是从优化sql入手,不良的sql往往带来大量的不必要的访问,这是造成热点块的根源。比如本该通过全表扫描的查询却走了索引的range scan,这样将带来大量的对块的重复访问。从而形成热点问题。再或者比如不当地走了nested loops的表连接,也可能对非驱动表造成大量的重复访问。那么在这个时候,我们的目标就是找出这些sql来并尝试优化。在statspack报告中,根据报告中sql列表,我们如果是通过dba_extents确定的热点对象而不是通过dba_objects确定的,则可以通过查找出的热点segment转换为对应的表,对于非分区的索引,index_name就是segment_name,通过dba_indexes很容易的找到对应的table_name,对于分区表和分区索引也能通过和dba_tab_partition和dba_ind_partitions找到segment和table的对应关系。通过这些table到statspack报告中去找相关的sql。
 
select sql_text
from stats$sqltext a,
(select distinct a.owner,a.segment_name,a.segment_type from
dba_extents a,
(select dbarfil,dbablk
from (select dbarfil,dbablk
from x$bh order by tch desc) where rownum < 11) b
where a.RELATIVE_FNO = b.dbarfil
and a.BLOCK_ID <= b.dbablk and a.block_id + a.blocks > b.dbablk) b
where a.sql_text like '%'||b.segment_name||'%' and b.segment_type = 'TABLE'
order by a.hash_value,a.address,a.piece;

cache buffers chains以及热块解决方案的更多相关文章

  1. 【转载】latch: cache buffers chains

    本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们 ...

  2. latch: cache buffers chains故障处理总结(转载)

    一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当 ...

  3. 案例:latch: cache buffers chains event tuning

    前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...

  4. latch:cache buffers chains的优化思路

    数据块在buffer cache存放是以linked list方式存放的.当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于bu ...

  5. latch: cache buffers chains故障处理总结

    一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当 ...

  6. Oracle索引失效问题:WHERE C1='' OR C2 IN(SubQuery),并发请求时出现大量latch: cache buffers chains等待

    问题描述: 项目反馈某功能响应时间很长,高峰期时系统整体响应很慢... 获取相应的AWR,问题确实比较严重,latch: cache buffers chains等待,因为这些会话SQL执行时间太长, ...

  7. cache buffers chains latch

    cache buffers chains latch 从 Oracle 8i Database 开始, 散列锁存器<-------(1:m)------>hash bucket<-- ...

  8. [转帖]深入理解latch: cache buffers chains

    深入理解latch: cache buffers chains http://blog.itpub.net/12679300/viewspace-1244578/ 原创 Oracle 作者:wzq60 ...

  9. 低效的SQL引发的cache buffers chains latch

    1.低效的SQL 低效的SQL语句时发生cache buffers chains 锁存器争用的最重要原因.多个进程同时扫描大范围的索引或表时,可能广泛 地发生cache buffers chains ...

随机推荐

  1. 数据库——SQL中EXISTS怎么用1(转)

    EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤   EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返 ...

  2. Mac安装wget

    Mac安装wget wget版本: wget-1.17 参考来源: Mac OS 安装Wget 給Mac添加wget功能 The Wget package for Mac http://brew.sh ...

  3. HTTP小结

    http 一.HTTP协议简介 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交 ...

  4. iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放

    一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...

  5. HTTP API 设计指南(响应部分)

    前言 这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引. 这篇指南除了详细介绍现有的 API 外 ...

  6. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

  7. 【转】C# 调用WebService的方法

    很少用C#动态的去调用Web Service,一般都是通过添加引用的方式,这样的话是自动成了代理,那么动态代理调用就是我们通过代码去调用这个WSDL,然后自己去生成客户端代理.更多的内容可以看下面的两 ...

  8. JAVA 多线程机制(二)

    主要内容 1.理解线程的并发性 2.线程的同步 3.线程的常用方法   上一章中由于线程的并发性导致了多线程的执行总是会出现一些问题..线程的并发性是程序员不可控制 的,也是不可避免的,线程的并发性往 ...

  9. Asp.net mvc中应用autofac

    1.nuget安装依赖

  10. Session超时问题(AOP 过滤器)

    public class TimeoutAttribute : ActionFilterAttribute { public override void OnActionExecuting(Actio ...