??xml version="1.0" encoding="utf-8" standalone="yes"?> SQL语句Q? SQL优化Q? ORACLE优化器: 1 帔R优化Q? 2 操作W优化: 其中Q? ~~ ANY和SOME 操作W优? ~~ ALL操作W优? ~~ BETWEEN 操作W优? ~~ NOT 操作W优? 如何~写高效的SQL: 1 合理的烦引设计: 语句B 语句C ȝ1 2 避免使用不兼容的数据cdQ? 3 IS NULL 与IS NOT NULLQ? 4 IN和EXISTSQ? 5 IN、OR子句怼使用工作表,使烦引失效: 6 避免或简化排序: 7 消除对大型表行数据的序存取Q? 8 避免相关子查询: 9 避免困难的正规表辑ּQ? 10 不充份的q接条gQ? 11 存储q程中,采用临时表优化查询: 好了Q搞定? 影响SQL server性能的关键三个方?转脓) 关键词:Sql Server 转脓?http://202.200.129.193/ 优化数据库和应用E序打下良好的基?/p>
标准化的数据库逻辑设计包括用多的、有怺关系的窄表来代替很多列的长数据表。下面是一些用标准化 表的一些好处?/p>
A:׃表窄Q因此可以排序和徏立烦引更?/p>
B:׃多表Q所以多镞的索引成ؓ可能 C:更窄更紧凑的索引 D:每个表中可以有少一些的索引Q因此可以提高insert update delete{的速度Q因些操作在索引 多的情况下会对系l性能产生很大的媄?/p>
E:更少的空值和更少的多余|增加了数据库的紧凑?/p>
׃标准化,所以会增加了在获取数据时引用表的数目和光的连接关pȝ复杂性。太多的表和复杂的连接关pM降低服务器的性能Q因此在q两者之间需要综合考虑? 2 索引的设? 5000 Nonclustered index 镞烦引和非镞索引的选择 <1:>镞烦引是行的物理序和烦引的序是一致的。页U,低层{烦引的各个U别上都包含实际的数据页。一个表只能是有一个镞索引。由于update,delete语句要求相对多一些的L作,因此镞烦引常常能加速这L操作。在臛_有一个烦引的表中Q你应该有一个镞索引? 当有大量的行正在被插入表中时Q要避免在本表一个自然增长(例如Qidentity列)的列上徏立镞索引。如果你建立了镞的烦引,那么insert的性能׃大大降低。因为每一个插入的行必d表的最后,表的最后一个数据页? <2:>一个非镞的索引是行的物理ơ序与烦引的ơ序是不同的。一个非镞烦引的叶包含了指向行数据늚指针? 3 查询语句的设?/p>
SQL Server优化器通过分析查询语句Q自动对查询q行优化q决定最有效的执行方案。优化器分析查询语句来决定那个子句可以被优化Qƈ针对可以被优化查询的子句来选择有用的烦引。最后优化器比较所有可能的执行Ҏq择最有效的一个方案出来?
[概述]
该语法告诉容器到什么地方去L所有logic:开头的tag.
为tag标记增加arrtibute节点Q语法如下: ○用二分钟配|: 是q么单,OSCache配|好了?/p> ○再用二分钟试一?/strong>Q?/p> ~写jsp文g 其他Q?~存qo?CacheFilter 此文完。。谢谢观看?/p>
转蝲Q?a >http://www.yuzhiguo.com/articleview.asp?id=100
pȝ讄|上有一句话是“最的权限+最的服务=最大的安全”。此句基本上是个人都看过Q但我好?br />
没有看到q一讲的比较详l稍具全面的文章Q下面就以我个hl验作一ơ教学尝试!
最的权限如何实现Q?br />
NTFSpȝ权限讄 在用之前将每个盘根加上 Administrators 用户为全部权?可选加入SYSTEM用户)
删除其它用户Q进入系l盘:权限如下
C:\WINDOWS Administrators SYSTEM用户全部权限 Users 用户默认权限不作修改
其它目录删除Everyone用户Q切记C:\Documents and Settings下All Users\Default User目录及其子目?br />
如C:\Documents and Settings\All Users\Application Data 目录默认配置保留了Everyone用户权限
C:\WINDOWS 目录下面的权限也得注?如 C:\WINDOWS\PCHealth、C:\windows\Installer也是保留了Everyone权限.
删除C:\WINDOWS\Web\printers目录Q此目录的存在会造成IIS里加入一?printers的扩展名Q可溢出d
默认IIS错误面已基本上没多h使用了。徏议删除C:\WINDOWS\Help\iisHelp目录
删除C:\WINDOWS\system32\inetsrv\iisadmpwdQ此目录为管理IIS密码之用Q如一些因密码不同步造成500
错误的时候用 OWA 或 Iisadmpwd 修改同步密码Q但在这里可以删掉,下面讲到的设|将会杜l因pȝ
讄造成的密码不同步问题?br />
打开C:\Windows 搜烦
net.exe;cmd.exe;tftp.exe;netstat.exe;regedit.exe;at.exe;attrib.exe;cacls.exe;format.com;
regsvr32.exe;xcopy.exe;wscript.exe;cscript.exe;ftp.exe;telnet.exe;arp.exe;edlin.exe;
ping.exe;route.exe;finger.exe;posix.exe;rsh.exe;atsvc.exe;qbasic.exe;runonce.exe;syskey.exe
修改权限Q删除所有的用户只保存Administrators 和SYSTEM为所有权?br />
关闭445端口
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\netBT\Parameters
新徏 “DWORD值”值名为 “SMBDeviceEnabled” 数据ؓ默认值??br />
止建立I?br />
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
新徏 “DWORD值”值名为 “RestrictAnonymous” 数据gؓ?” [2003默认?]
止pȝ自动启动服务器共?br />
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
新徏 “DWORD值”值名为 “AutoShareServer” 数据gؓ??br />
止pȝ自动启动理׃n
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
新徏 “DWORD值”值名为 “AutoShareWks” 数据gؓ??br />
通过修改注册表防止小规模DDOSd
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新徏 “DWORD值”值名为 “SynAttackProtect” 数据gؓ??br />
止dump file的?br />
dump文g在系l崩溃和蓝屏的时候是一份很有用的查N题的资料。然而,它也能够l黑客提供一些敏?br />
信息比如一些应用程序的密码{。控刉?gt;pȝ属?gt;高>启动和故障恢复把 写入调试信息 Ҏ无?br />
关闭华医生Dr.Watson
在开?q行中输入“drwtsn32”,或者开?E序-附g-pȝ工具-pȝ信息-工具-Dr WatsonQ调出系l?br />
里的华医生Dr.Watson Q只保留“{储全部线E上下文”选项Q否则一旦程序出错,盘会读很久Qƈ?br />
用大量空间。如果以前有此情况,h找user.dmp文gQ删除后可节省几十MBI间?br />
本地安全{略配置
开始?gt; E序 > 理工具 > 本地安全{略
账户{略 > 密码{略 > 密码最短用期限 改?天[卛_码不q期Q上面我讲到不会造成IIS密码不同步]
账户{略 > 账户锁定{略 > 账户锁定阈值? ơ ̎户锁定时闾b?0分钟 [个h推荐配置]
本地{略 > 审核{略 >
账户理 成功 p|
d事g 成功 p|
对象讉K p|
{略更改 成功 p|
Ҏ使用 p|
pȝ事g 成功 p|
目录服务讉K p|
账户d事g 成功 p|
本地{略 > 安全选项 > 清除虚拟内存面文g 更改?已启?
> 不显CZơ的用户名 更改ؓ"已启?
> 不需要按CTRL+ALT+DEL 更改?已启?
> 不允许 SAM 账户的匿名枚举 更改ؓ"已启?
> 不允许 SAM 账户和共享的匿名枚D 更改?已启?
> 重命名来宾̎户 更Ҏ一个复杂的账户?br />
> 重命名系l管理员账号 更改一个自q的̎号 [同时可徏立一个无用户l的Administrat账户]
l策略编辑器
q行 gpedit.msc 计算机配|?gt; 理模板 > pȝ 昄“关闭事件跟t程序” 更改ؓ已禁用?br />
删除不安全组?br />
WScript.Shell 、Shell.application q两个组件一般一些ASP木马或一些恶意程序都会用到?br />
Ҏ一Q?br />
regsvr32 /u wshom.ocx 卸蝲WScript.Shell lg
regsvr32 /u shell32.dll 卸蝲Shell.application lg
如果按照上面讲到的设|,可不必删除这两个文g
Ҏ二:
删除注册表 HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8} 对应 WScript.Shell
删除注册表 HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540000} 对应 Shell.application
用户理
建立另一个备用管理员账号Q防止特D情况发生?br />
安装有终端服务与SQL服务的服务器停用TsInternetUser, SQLDebuggerq两个̎?br />
用户l说?br />
在将来要使用到的IIS中,IIS用户一般用Guestsl,也可以再重新建立一个独立的专供IIS使用的组Q但
要将q个l赋予C:\Windows 目录取权限[单一d] 个h不徏议用单独目录,太小家子气?/font>
转蝲Q?a >http://www.52net.com/html/2006/0428/63042.html
作者:不祥
PHPq接MySQL的过E中如果出现q很多Z_?Set names '??'"p解决问题Q但很多时候还是会出现各种怪现象,比如说页面能正常存取Q但是phpmyadmin不能正常存取{现象。小弟经q验证,产生了一些个人看法,Ƣ迎大家讨论和指正?br />
MySQL数据库操作过E中出现了三U字W集Q?br />1、页面字W集Q也是 content="TEXT/HTML; CHARSET=GBK"Q?br />2、连接字W集Q也是 "Set names 'GBK'"Q?br />3、字D字W集Q无论是库还是表的字W集Q将最l反映到字段上)
一、实验:
1、情况一
数据库字D字W集Qutf-8
q接字符集:没有昑ּ讄Q默认ؓlatin1
面字符集:gbk
存入q程Q?br />1)面用GBK表示的SQL向服务器提交存入hQ?br />2)默认情况下(不用Set Names '??'Q服务器用latin1打开q接Q?br />3)服务器误认ؓ当前的SQL语句是用latin1表示的;
4)服务器将GBK字符当作latin1字符Q错误的q用“latin1转UTF-8函数”将字符转换后存入UTF-8字段中;
5)Q?错误的latin1(其实是GBK) => 错误的UTF-8Q?br />6)如果用phpmyadmin打开该表Q用utf8q接Q将会看到该字段Zؕ码;
dq程Q?br />1)默认情况下(不用Set Names '??'Q服务器用latin1打开q接Q?br />2)服务器将UTF-8字段中的D{换ؓlatin1q回l客LQ?br />3)Q错误的UTF-8 => 错误的latin1(其实是GBK)Q该q程为存入过E?的逆过E。(刚好错错得对了)
4)服务器误认为是latin1的GBK~码按页面字W集正常昄Q?br />
用示意图来表C就是:
2、情况二CODE 存入q程Q?br /> ----------------------
面 q接 存储
----------------------
GBK => latin1 => utf-8
---------------
------------- |
| +------- 该过E得到的utf-8是一串不知所云的qQ但MySQL固执的认串码为UTF-8
|
+------ MySQLGBK误认为是latin1
dq程Q?br /> ----------------------
面 q接 存储
----------------------
GBK <= latin1 <= utf-8
---------------
------------- |
| +------- 正是q串ql过逆过E{换回正确的GBK~码Q只是MySQL认ؓ是latin1而已
|
+------ MySQL误认ؓ是latin1的GBK~码传回了页面,刚好得到正确的编码?!--c2-->
数据库字D字W集Qutf-8
q接字符集:gbk
面字符集:gbk
文字描述略?br />
C意?CODE 存入q程Q?br /> ----------------------
面 q接 存储
----------------------
GBK => GBK => utf-8
------------
------------- |
| +------- 该过E得到的utf-8是由GBK转换而来的,是正的utf-8~码
|
+------ 面字符集等于连接字W集QMySQL认ؓ面传递给它的是GBK~码Q它的想法正好符合事实?br />
dq程Q?br /> ----------------------
面 q接 存储
----------------------
GBK <= GBK <= utf-8
---------------
------------- |
| +------- 用“utf-8转GBK函数”将正确的utf-8~码转换回GBK
|
+------ 面字符集等于连接字W集Q显C没有Q何问题?!--c2-->
3、情况三
数据库字D字W集Qgbk
q接字符集:没有昑ּ讄Q默认ؓlatin1
面字符集:gbkCODE 存入q程Q?br /> ----------------------
面 q接 存储
----------------------
GBK => latin1 => GBK
------------
------------- |
| +------- 字符被“latin1转GBK函数”{换的成了qQ但MySQL认ؓ它是GBKQ所以工h法正常显C?br /> |
+------ MySQL认ؓ面传递给它的是latin1~码Q它在后箋q程中画蛇添_正的GBK转换Zؕ码?br />
dq程Q?br /> ----------------------
面 q接 存储
----------------------
GBK <= latin1 <= GBK
---------------
------------- |
| +------- “GBK转latin1函数”将q转换为GBKQ但MySQL却认为它们是latin1
|
+------ 错误的latin1~码其实是正的GBK~码Q页面显C正常,但工hCZ正常?!--c2-->
二、字W集之间的{?br />W者试着GBK字符误当作latin1转换为错误的utf-8能成功,逆过E中ؕ码{换回latin1得到的刚好是正确的GBKCODE $str = "中文试";
$str_tran = iconv('latin1', 'utf-8', $str);
echo $str_tran; // 昄qQ既不是GBK也不是utf-8和latin1
echo "<br>-----------<br>";
$str_re_tran = iconv('utf-8', 'latin1', $str_tran);
echo $str_re_tran; // 昄 “中文测试?!--c2-->
而将GBK字符误当作utf-8转换为错误的GBK~码则出现错?br />CODE $str = "中文试";
#$str_tran = iconv('utf-8', 'gbk', $str); // 错误Q!Q?!--c2-->
可见一U编码是否能被当作另一U编码被转换为第三种~码Q取决于~码的固有属性,上面我们丄W一个例子只是碰巧GBK~码能被误当作latin1被{换ؓutf-8。如果是如下情况Q则数据库肯定不能正常存取数据?br />GBK => utf-8 => GBKQ未实验Q?br />三、结?br />面能正常存取但phpmyadmin不能正常存取Q从严格意义上来说应该是一U错误,面是否能正常存取取决于q接字符集是否能正常的被转换为存储字W集?br />要保证页面能正常存取Qƈ且工具也能正怋用,一般保持页面字W集{于或兼容连接字W集可以了?/span>
是对数据?数据)q行操作的惟一途径Q?
消耗了70%~90%的数据库资源Q独立于E序设计逻辑Q相对于对程序源代码的优化,对SQL语句的优化在旉成本和风险上的代价都很低Q?
可以有不同的写法Q易学,隄通?/p>
固定的SQL书写习惯Q相同的查询量保持相同Q存储过E的效率较高?
应该~写与其格式一致的语句Q包括字母的大小写、标点符受换行的位置{都要一?/p>
在Q何可能的时候都会对表达式进行评伎ͼq且把特定的语法l构转换成等Ll构Q这么做的原因是
要么l果表达式能够比源表辑ּh更快的速度
要么源表辑ּ只是l果表达式的一个等仯义结?
不同的SQLl构有时h同样的操作(例如Q? ANY (subquery) and IN (subquery)Q,ORACLE会把他们映射C个单一的语义结构?/p>
帔R的计是在语句被优化时一ơ性完成,而不是在每次执行时。下面是索月薪大?000的的表达式:
sal > 24000/12
sal > 2000
sal*12 > 24000
如果SQL语句包括W一U情况,优化器会单地把它转变成第二种?
优化器不会简化跨比较符的表辑ּQ例如第三条语句Q鉴于此Q应量写用帔R跟字D|较检索的表达式,而不要将字段|于表达式当中。否则没有办法优化,比如如果sal上有索引Q第一和第二就可以使用Q第三就难以使用?/p>
优化器把使用LIKE操作W和一个没有通配W的表达式组成的索表辑ּ转换Z个?”操作符表达式?
例如Q优化器会把表达式ename LIKE 'SMITH'转换为ename = 'SMITH'
优化器只能{换涉及到可变长数据类型的表达式,前一个例子中Q如果ENAME字段的类型是CHAR(10)Q?那么优化器将不做M转换?
一般来讲LIKE比较难以优化?/p>
~~ IN 操作W优化:
优化器把使用IN比较W的索表辑ּ替换为等L使用?”和“OR”操作符的检索表辑ּ?
例如Q优化器会把表达式ename IN ('SMITH','KING','JONES')替换?
ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES?/p>
优化器将跟随值列表的ANY和SOME索条件用{h的同{操作符和“OR”组成的表达式替换?
例如Q优化器如下所C的W一条语句用W二条语句替换:
sal > ANY (:first_sal, :second_sal)
sal > :first_sal OR sal > :second_sal
优化器将跟随子查询的ANY和SOME索条件{换成由“EXISTS”和一个相应的子查询组成的索表辑ּ?
例如Q优化器如下所C的W一条语句用W二条语句替换:
x > ANY (SELECT sal FROM emp WHERE job = 'ANALYST')
EXISTS (SELECT sal FROM emp WHERE job = 'ANALYST' AND x > sal)
优化器将跟随值列表的ALL操作W用{h的?”和“AND”组成的表达式替换。例如:
sal > ALL (:first_sal, :second_sal)表达式会被替换ؓQ?
sal > :first_sal AND sal > :second_sal
对于跟随子查询的ALL表达式,优化器用ANY和另外一个合适的比较W组成的表达式替换。例?
x > ALL (SELECT sal FROM emp WHERE deptno = 10) 替换为:
NOT (x <= ANY (SELECT sal FROM emp WHERE deptno = 10))
接下来优化器会把W二个表辑ּ适用ANY表达式的转换规则转换Z面的表达式:
NOT EXISTS (SELECT sal FROM emp WHERE deptno = 10 AND x <= sal)
优化器L用?gt;=”和?lt;=”比较符来等L代替BETWEEN操作W?
例如Q优化器会把表达式sal BETWEEN 2000 AND 3000用sal >= 2000 AND sal <= 3000来代ѝ?/p>
优化器L试图化检索条件以消除“NOT”逻辑操作W的影响Q这涉及到“NOT”操作符的消除以及代以相应的比较q算W?
例如Q优化器下面的W一条语句用W二条语句代替:
NOT deptno = (SELECT deptno FROM emp WHERE ename = 'TAYLOR')
deptno <> (SELECT deptno FROM emp WHERE ename = 'TAYLOR')
通常情况下一个含有NOT操作W的语句有很多不同的写法Q优化器的{换原则是低쀜NOT”操作符后边的子句尽可能的简单,即可能会ɾl果表达式包含了更多的“NOT”操作符?
例如Q优化器如下所C的W一条语句用W二条语句代替:
NOT (sal < 1000 OR comm IS NULL)
NOT sal < 1000 AND comm IS NOT NULL sal >= 1000 AND comm IS NOT NULL
当然要考虑sql帔R的优化和操作W的优化啦,另外Q还需要:
例:表record?20000行,试看在不同的索引下,下面几个SQL的运行情况:
语句A
SELECT count(*) FROM record
WHERE date >'19991201' and date < '19991214?and amount >2000
SELECT count(*) FROM record
WHERE date >'19990901' and place IN ('BJ','SH')
SELECT date,sum(amount) FROM record
group by date
1 在date上徏有一个非聚集索引
AQ?25U?
BQ?27U?
CQ?55U?
分析Q?
date上有大量的重复|在非聚集索引下,数据在物理上随机存放在数据页上,在范围查找时Q必L行一ơ表扫描才能扑ֈq一范围内的全部行?
2 在date上的一个聚集烦?
AQ(14U)
BQ(14U)
CQ(28U)
分析Q?
在聚集烦引下Q数据在物理上按序在数据页上,重复g排列在一P因而在范围查找Ӟ可以先找到这个范围的h点,且只在这个范围内扫描数据,避免了大范围扫描Q提高了查询速度?
3 在placeQdateQamount上的l合索引
AQ(26U)
CQ(27U)
BQ(< 1U)
分析Q?
q是一个不很合理的l合索引Q因为它的前导列是placeQ第一和第二条SQL没有引用placeQ因此也没有利用上烦引;W三个SQL使用了placeQ且引用的所有列都包含在l合索引中,形成了烦引覆盖,所以它的速度是非常快的?
4 在dateQplaceQamount上的l合索引
AQ?(< 1U?
BQ(< 1U)
CQ(11U)
分析Q?
q是一个合理的l合索引。它date作ؓ前导列,使每个SQL都可以利用烦引,q且在第一和第三个SQL中Ş成了索引覆盖Q因而性能辑ֈ了最优?/p>
~省情况下徏立的索引是非聚集索引Q但有时它ƈ不是最佳的Q合理的索引设计要徏立在对各U查询的分析和预上。一般来_
有大量重复倹{且l常有范围查询(between, >,< Q?gt;=,< =Q和order by、group by发生的列Q考虑建立聚集索引Q?
l?常同时存取多列,且每列都含有重复值可考虑建立l合索引Q在条g表达式中l常用到的不同D多的列上建立索,在不同值少的列上不要徏立烦引。比如在雇员 表的“性别”列上只有“男”与“女”两个不同|因此无必要建立索引。如果徏立烦引不但不会提高查询效率,反而会严重降低更新速度?
l合索引要尽量关键查询形成索引覆盖Q其前导列一定是使用最频繁的列?/p>
例如float和INt、char和varchar、bINary和varbINary是不兼容的。数据类型的不兼容可能优化器无法执行一些本来可以进行的优化操作。例?
SELECT name FROM employee WHERE salary Q?60000
在这条语句中,如salary字段是money型的,则优化器很难对其q行优化,因ؓ60000是个整型数。我们应当在~程时将整型转化成ؓ钱币?而不要等到运行时转化?/p>
?能用null作烦引,M包含null值的列都不会被包含在烦引中。即使烦引有多列q样的情况下Q只要这些列中有一列含有nullQ该列就会从索引中排 除。也是说如果某列存在空|即对该列徏索引也不会提高性能。Q何在WHERE子句中用is null或is not null的语句优化器是不?怋用烦引的?/p>
EXISTS要远比IN的效率高。里面关pdfull table scan和range scan。几乎将所有的IN操作W子查询改写Z用EXISTS的子查询?
例子Q?
语句1
SELECT dname, deptno FROM dept
WHERE deptno NOT IN
(SELECT deptno FROM emp);
语句2
SELECT dname, deptno FROM dept
WHERE NOT EXISTS
(SELECT deptno FROM emp
WHERE dept.deptno = emp.deptno);
明显的,2要比1的执行性能好很?
因ؓ1中对empq行了full table scan,q是很浪Ҏ间的操作。而且1中没有用到emp的INdexQ?
因ؓ没有WHERE子句。?中的语句对empq行的是range scan?/p>
如果不生大量重复|可以考虑把子句拆开。拆开的子句中应该包含索引?/p>
应当化或避免对大型表q行重复的排序。当能够利用索引自动以适当的次序生输出时Q优化器避免了排序的步骤。以下是一些媄响因素:
索引中不包括一个或几个待排序的列;
group by或order by子句中列的次序与索引的次序不一P
排序的列来自不同的表?
Z避免不必要的排序Q就要正地增徏索引Q合理地合ƈ数据库表Q尽有时可能媄响表的规范化Q但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图化它Q如~小排序的列的范围等?/p>
?嵌套查询中,对表的顺序存取对查询效率可能产生致命的媄响。比如采用顺序存取策略,一个嵌?层的查询Q如果每层都查询1000行,那么q个查询p查询 10亿行数据。避免这U情늚主要Ҏ是对连接的列进行烦引。例如,两个表:学生表(学号、姓名、年??Q和选课表(学号、课E号、成l)。如果两?表要做连接,p在“学号”这个连接字D上建立索引?
q可以用ƈ集来避免序存取。尽在所有的查列上都有烦引,但某些Ş式的WHERE子句优化器用顺序存取。下面的查询强q对orders表执行顺序操作:
SELECT Q?FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上徏有烦引,但是在上面的语句中优化器q是使用序存取路径扫描整个表。因个语句要索的是分ȝ行的集合Q所以应该改为如下语句:
SELECT Q?FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT Q?FROM orders WHERE order_num=1008
q样p利用索引路径处理查询?/p>
一个列的标{时在L询和WHERE子句中的查询中出玎ͼ那么很可能当L询中的列值改变之后,子查询必重新查询一ơ。查询嵌套层ơ越多,效率低Q因此应当尽量避免子查询。如果子查询不可避免Q那么要在子查询中过滤掉可能多的行?/p>
MATCHES和LIKE关键字支持通配W匹配,技术上叫正规表辑ּ。但q种匚w特别耗费旉。例如:SELECT Q?FROM customer WHERE zipcode LIKE ?8_ _ _?
即在zipcode字段上徏立了索引Q在q种情况下也q是采用序扫描的方式。如果把语句改ؓSELECT Q?FROM customer WHERE zipcode >?8000”,在执行查询时׃利用索引来查询,昄会大大提高速度?
另外Q还要避免非开始的子串。例如语句:SELECT Q?FROM customer WHERE zipcode[2Q?] >?0”,在WHERE子句中采用了非开始子Ԍ因而这个语句也不会使用索引?/p>
例:表card?896行,在card_no上有一个非聚集索引Q表account?91122行,在account_no上有一个非聚集索引Q试看在不同的表q接条g下,两个SQL的执行情况:
SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no
Q?0U)
SQL改ؓQ?
SELECT sum(a.amount) FROM account a,card b WHERE a.card_no = b.card_no and a.account_no=b.account_no
Q?lt; 1U)
分析Q?
在第一个连接条件下Q最x询方案是account作外层表Qcard作内层表Q利用card上的索引Q其I/Oơ数可由以下公式估算为:
外层表account上的22541?Q外层表account?91122?内层表card上对应外层表W一行所要查扄3)=595907ơI/O
在第二个q接条g下,最x询方案是card作外层表Qaccount作内层表Q利用account上的索引Q其I/Oơ数可由以下公式估算为:
外层表card上的1944?Q外层表card?896?内层表account上对应外层表每一行所要查扄4)= 33528ơI/O
可见Q只有充份的q接条gQ真正的最x案才会被执行?
多表操作在被实际执行前,查询优化器会Ҏq接条gQ列出几l可能的q接Ҏq从中找出系l开销最的最x案。连接条件要充䆾考虑带有索引的表、行数多的表Q内外表的选择可由公式Q外层表中的匚w行数*内层表中每一ơ查扄ơ数定Q乘U最ؓ最x案?
不可优化的WHERE子句
?
下列SQL条g语句中的列都建有恰当的烦引,但执行速度却非常慢Q?
SELECT * FROM record WHERE substrINg(card_no,1,4)='5378'
(13U?
SELECT * FROM record WHERE amount/30< 1000
Q?1U)
SELECT * FROM record WHERE convert(char(10),date,112)='19991201'
Q?0U)
分析Q?
WHERE子句中对列的M操作l果都是在SQLq行旉列计算得到的,因此它不得不q行表搜索,而没有用该列上面的索引Q如果这些结果在查询~译时就能得刎ͼ那么可以被SQL优化器优化,使用索引Q避免表搜烦Q因此将SQL重写成下面这P
SELECT * FROM record WHERE card_no like '5378%'
Q?lt; 1U)
SELECT * FROM record WHERE amount< 1000*30
Q?lt; 1U)
SELECT * FROM record WHERE date= '1999/12/01'
Q?lt; 1U)
?
1Q从parven表中按vendor_num的次序读数据Q?
SELECT part_numQvendor_numQprice FROM parven ORDER BY vendor_num
INTO temp pv_by_vn
q个语句序读parvenQ?0)Q写一个时表Q?0)Qƈ排序。假定排序的开销?00,d?00c?
2Q把临时表和vendor表连接,把结果输出到一个时表Qƈ按part_num排序Q?
SELECT pv_by_vnQ* vendor.vendor_num FROM pv_by_vnQvendor
WHERE pv_by_vn.vendor_num=vendor.vendor_num
ORDER BY pv_by_vn.part_num
INTO TMP pvvn_by_pn
DROP TABLE pv_by_vn
q?个查询读取pv_by_vn(50?Q它通过索引存取vendor?.5万次Q但׃按vendor_numơ序排列Q实际上只是通过索引序地读 vendor表(40Q?=42)Q输出的表每늺95行,?60c写q存取这些页引发5Q?60=800ơ的dQ烦引共d892c?
3Q把输出和partq接得到最后的l果Q?
SELECT pvvn_by_pn.Q,part.part_desc FROM pvvn_by_pnQpart
WHERE pvvn_by_pn.part_num=part.part_num
DROP TABLE pvvn_by_pn
q样Q查询顺序地读pvvn_by_pn(160?Q通过索引读part?.5万次Q由于徏有烦引,所以实际上q行1772ơ磁盘读写,优化比例?0??/p>
其实sql的优化,各种数据库之间都是互通的
1 逻辑数据库和表的设计
数据库的逻辑设计、包括表与表之间的关pL优化关系型数据库性能的核心。一个好的逻辑数据库设计可以ؓ
定义h相关关系的主键和外来键时应该注意的事主要是Q用于连接多表的主键和参考的键要有相同的数据cd?/p>
A:量避免表扫?
查你的查询语句的where子句Q因是优化器重要x的地斏V包含在where里面的每一列(column)都是可能的侯选烦引,辑ֈ最优的性能Q考虑在下面给出的例子Q对于在where子句中给Zcolumn1q个列?
下面的两个条件可以提高烦引的优化查询性能Q?
W一Q在表中的column1列上有一个单索引
W二Q在表中有多索引Q但是column1是第一个烦引的?
避免定义多烦引而column1是第二个或后面的索引Q这L索引不能优化服务器性能
例如Q下面的例子用了pubs数据库?
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = 'White'
按下面几个列上徏立的索引会是对优化器有用的索引
?au_lname
?au_lname, au_fname
而在下面几个列上建立的烦引将不会对优化器起到好的作用
?au_address
?au_fname, au_lname
考虑使用H的索引在一个或两个列上Q窄索引比多索引和复合烦引更能有效。用H的索引Q在每一上
会有更多的行和更少的烦引别(相对与多索引和复合烦引而言Q,q将推进pȝ性能?
对于多列索引QSQL Serverl持一个在所有列的烦引上的密度统计(用于联合Q和在第一个烦引上?
histogramQ柱状图Q统计。根据统计结果,如果在复合烦引上的第一个烦引很被选择使用Q那么优化器对很多查询请求将不会使用索引?
有用的烦引会提高select语句的性能Q包括insert,uodate,delete?
但是Q由于改变一个表的内容,会影响索引。每一个insert,update,delete语句会使性能下降一些。实验表明,不要在一个单表上用大量的索引Q不要在׃n的列上(指在多表中用了参考约束)使用重叠的烦引?
在某一列上查唯一的数据的个数Q比较它与表中数据的行数做一个比较。这是数据的选择性,q比较结果将会帮助你军_是否某一列作Z选的索引列,如果需要,建哪一U烦引。你可以用下面的查询语句q回某一列的不同值的数目?
select count(distinct cloumn_name) from table_name
假设column_name是一?0000行的表,则看column_nameq回值来军_是否应该使用Q及应该使用什么烦引?
Unique values Index
20 Clustered index
3 No index
在下面的几个情况下,你可以考虑用镞索引Q?
例如Q?某列包括的不同值的个数是有限的Q但是不是极的Q?
֮表的州名列有50个左右的不同州名的羃写|可以使用镞烦引?
例如Q?对返回一定范围内值的列可以用镞索引Q比如用between,>,>=,<,<={等来对列进行操作的列上?
select * from sales where ord_date between '5/1/93' and '6/1/93'
例如Q?Ҏ询时q回大量l果的列可以使用镞烦引?
SELECT * FROM phonebook WHERE last_name = 'Smith'
当一个数据正在被插入Q这时这个数据页是被锁定的)Q所有的其他插入行必ȝ待直到当前的插入已经l束?
一个烦引的叶中包括实际的数据页Qƈ且在盘上的数据늚ơ序是跟镞烦引的逻辑ơ序一L?/p>
在一个表中可以有多个非镞索引Q你可以在以下几个情况下考虑使用非镞索引?
在有很多不同值的列上可以考虑使用非镞索引
例如Q一个part_id列在一个part表中
select * from employee where emp_id = 'pcm9809f'
查询语句中用order by 子句的列上可以考虑使用镞烦?/p>
在执行一个查询时Q用一个where子句来限制必d理的行数Q除非完全需要,否则应该避免在一个表中无限制地读q处理所有的行?
例如下面的例子,
select qty from sales where stor_id=7131
是很有效的比下面q个无限制的查询
select qty from sales
避免l客L最后数据选择q回大量的结果集。允许SQL Serverq行满它目的的函数限制l果集的大小是更有效的?
q能减少|络I/Oq能提高多用L相关q发时的应用E序性能。因Z化器x的焦点就是where子句的查询,以利用有用的索引。在表中的每一个烦引都可能成ؓ包括在where子句中的侯选烦引。ؓ了最好的性能可以늅下面的用于一个给定列column1的烦引?
W一Q在表中的column1列上有一个单索引
W二Q在表中有多索引Q但是column1是第一个烦引的列不要在where子句中用没有column1列烦引的查询语句Qƈ避免在where子句用一个多索引的非W一个烦引的索引?
q时多烦引是没有用的?
For example, given a multicolumn index on the au_lname, au_fname columns of the authors table in
the pubs database,
下面q个query语句利用了au_lname上的索引
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = 'White'
AND au_fname = 'Johnson'
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = 'White'
下面q个查询没有利用索引Q因Z使用了多索引的非W一个烦引的索引
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_fname = 'Johnson'
Taglib是JSP比较高的技术。做为JSP开发h员来Ԍ不了解taglib是可以接受的。因为JSP的风格或者JAVA的风格就是一U简z的。如果技术太q复杂或者繁琐,׃在技术的汪洋中失去自我?br />
但是Q当我们的项目变得越来越大,或者团队有了一些技术积累之后,很自然就会有我们的开发工作提高一个层ơ的需要。当我们面对一些非常类似的界面或者程序单元的时候,我们会想到把q样的工作成果直接用于下一个项目。这L问题可以由taglib来解冟?br />
到此q没有真正说明一下taglib是什么。只要你从事qJSP的开发工作,你就已经使用qtaglib了。只不过是在不知不觉中用的。你一定不会忘?<jsp:include />标记。实际上q就是一个taglib。Taglib直译做标记库Q是JSP定义l开发h员可以用自行定义的标记体系。也是_开发h员可以在JSP中用自己定义的Ҏ标记。而该标记可以用作特定的用途。比如显CZ个每个页都需要的公司版权信息。就可以不用复制_脓相同的代码到每个去了?br />
但是taglib可以完成的工作远q不止这些。由于每个自定义标记一定是一个完全的JAVAc,我们可以定义非常丰富的一l行为,q且可以通过自定义的attribute来控制它?br />
[实例]
我习惯用实例来说明问题。大家也讔R对用户会话状态的查不陌生。当用户d到系l后Q我们希望自动保持用Ld状态。而这个过E在每个需要认证用h能访问的E序单元都需要实现。通常我们需要访问预定义的session服务器变量,当这个变量不满某值时卛_定改用户为非法访问或者会话状态丢失?br />
我们来看一下用taglib如何实现。我们需要编写一个仅处理该逻辑的标记。实现的最单的逻辑Q检查用L态session|不满x值时卛_用户转向一个预先设|的报错c?br />
以下是源?CheckSessionTag.java)Q?br />(省略了细?
public class CheckSessionTag extends TagSupport
{
public
int
doEndTag()
{
try
{
String member_id
=
(String) pageContext.getSession().getAttribute(
"
member_id
"
);
if
(member_id
==
null
||
member_id.equals(
""
))
{
pageContext.forward(
"
/home/check_session_fail.jsp
"
);
}
}
catch
(Exception e)
{
//
报告异常q程省略.
}
return
EVAL_PAGE;
}
}
[分析]
在以上源码中Q我们在使tag自动查用户session变量中的"member_id"|如果该gؓI,则立卛_定用h有访问权限,则立卛_程导向一个预先设定的报错:/home/check_session_fail.jsp.
cCheckSessionTagz自:TagSupport(javax.servlet.jsp.tagext.TagSupport). 是一个从JAVA 1.3开始支持的cdQ位于servlet.jar包。java文档l出的描q是Q?br />
A base class for defining new tag handlers implementing Tag. The TagSupport class is a utility class intended to be used as the base class for new tag handlers. The TagSupport class implements the Tag and IterationTag interfaces and adds additional convenience methods including getter methods for the properties in Tag. TagSupport has one static method that is included to facilitate coordination among cooperating tags. Many tag handlers will extend TagSupport and only redefine a few methods.
(该类为所有taglib的基cR该cd义了实现标记的一pd接口?
在实例CheckSessionTagcMQ我们仅仅重写了doEndTagҎ。没有向其容器:jsp输ZQ何东ѝ但是该cd实际应用中是切实可行的?br />
以下是在一个成品项目中的某jsp中截取的片断Q?br /><logic:checkSession />
当我们直接用输入url的方式访问本|Q我们被立即带到了报告:用户会话状态丢失或者未l登录的c?br />q就省却了我们习以ؓ常的一工作:以前我们必须复制相同的scriplet到每个jspc(实际上,也可以用类似intercept filter的模式来处理此需求)。这使我们的开发工作变得reusable, flexiable, 和extendable。可以想象,如果我们x变检查session的逻辑Q则可以仅仅通过改变CheckSessionTag内部的逻辑可以通盘改变。ƈ且我们可以通过llogic:checkSession标记加上cMtarget=admin的attribute来限定只有管理员才可以访问的区域。这是形成lg化开发的基本q程?br />
如何实施?
[实施q程]
我们需要做一pd工作来将taglib引入我们的工E?br />
web.xml
Z使jsp解析器可以识别我们的taglib必须其配置在web.xml内。web.xml位于/WEB-INF目录内?br />使用特定语法来配|我们的taglib:
web.xml(片断)
<
web-app
>
<
taglib
>
<
taglib-uri
>
/WEB-INF/logic.tld
</
taglib-uri
>
<
taglib-location
>
/WEB-INF/logic.tld
</
taglib-location
>
</
taglib
>
<
web-app
>
tld是taglib defination的羃写。即taglib定义。该文g定义了我们用的标记QJavacd何加载,q且该标记如何工作。让我们来看一D实际的tld:
logic.tld(片断)
<?
xml version="1.0" encoding="ISO-8859-1"
?>
<!
DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2/EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"
>
<
taglib
>
<
tlib-version
>
1.0
</
tlib-version
>
<
jsp-version
>
1.2
</
jsp-version
>
<
short-name
>
logic
</
short-name
>
<
uri
>
/taglibs/logic
</
uri
>
<
tag
>
<
name
>
checkSession
</
name
>
<
tag-class
>
mbajob.common.tags.logic.CheckSessionTag
</
tag-class
>
<
body-content
>
empty
</
body-content
>
</
tag
>
我们注意到taglib标记?
1Q short-name: 标记的prefix名?br />2Q uri: 识别该taglib的名U?br />
tag标记Q?br />1Q name: 标记名(prefix:之后Q?br />2Q tag-classQ类名(包含包名Q?br />3Q body-content: 标记内容模式Q如果该标记没有内容则ؓempty.
logic.tld攄?WEB-INF下,此时保~译好的CheckSessionTagcd以被容器讉K到。即可完成配|。必L意的是,不同的jsp容器的配|可能有差别。本文的配置是基于Resin 2.1.11
[应用]
建立一个jspc在源码的开头加入如下的预编译指令:(page)
<%@ taglib prefix="logic" uri="/WEB-INF/logic.tld" %>
此指令告诉编译器到哪里去L所有以logic:开头的标记的定义?br />
接下来在L位置加入标记Q?lt;logic:checkSession />卛_以工作了。当标记被实例化后,卌动执行doEndTagq程Q检查session服务器变量|之后页q程跌{?br />
[深入一些:attribute]
有时候我们希望可以对标记q行一些定制。依旧拿checkSession做例Q现在我们要限制两类用户讉KpȝQ某
些部分仅允许h理员权限的用户讉K。这h们设惛_以在<logic:checkSession target=admin />q行q一步定义。这需要在CheckSessionTagcM增加一些额外的逻辑。检查的q程很简单,取决于你的安全系l的分析Q但是,我们写了target attribute如何是类可以得到该数据,q是一个关键的问题?br />
Z实现对tag增加可用的attribute, 需要做如下工作Q?br />1Q ؓcd加相应的成员及相应读写器Q?br />CheckSessionTag.java(片断):
public class CheckSessionTag extends TagSupport
{
private String target;
public
void
setTarget(String t)
{
this
.target
=
t;
}
public String getTarget()
{
return
this
.target;
}
public
int
doEndTag()
{
}
2Q 更改logic.tld:
.
<
tag
>
<
name
>
checkSession
</
name
>
<
tag-class
>
mbajob.common.tags.logic.CheckSessionTag
</
tag-class
>
<
body-content
>
empty
</
body-content
>
<
attribute
>
<
name
>
title
</
name
>
<
required
>
true
</
required
>
</
attribute
>
</
tag
>
name: attribute?br />required: 是否为必ȝattribute
q运的是Qjsp内置地将attribute解释为javacȝ成员Q我们无需昑ּ地获取该|卛_直接使用。也是_我们只要在tag内指定了target=admin, 那么QCheckSessionTag在活着的时候就自动获取该|可以在逻辑中直接用?br />
q样Q我们就可以ltag增加L的attribute.
[入门以后]
到此为止Q我么就可以写一些类似的单的tag了。根据不同的需求,完成不同的逻辑。当我们开发一个新的tag的时候,我们在logic.tld里增加一个tag子标记。设|好相应的类型。如果需要,我们可以把我们已l写好的tag们完全的UL到第二个目中用,仅仅做很的更改。而更改也仅仅限于对java源代码?br />
在我和我的团队的实际l验中,taglib最多的应用q是在设计一pdҎ的UI. 例如cM于选择省市多行政区域的选择器。ؓ了放|在HTML中嵌入过多scriplet和脚本,我们的做法通常是将其写在组装好的tag里;Z形成整个应用一致的外观Q我们设计了一套用于组装页构图的框ӞZ向jsp输出集合数据Q我们设计了可以l定数据的呈现器。经q很长一个时期的工作Q我们发现我们的目中jsp内仅有很少的html, 而完全是有taglibl成的。最l,我们的taglib按照layout, logic, element, form分类Q已lŞ成了比较大的规模。我们甚臛_成了apache的struts框架完成的一部分工作。甚臛_得更灉|。所有这些工作中U篏的思想甚至影响到我?NETq_下的技术思\?br />
Z不ɽ幅太长Q我不准备在本文再做深入的探索。仅仅介ltaglib入门U的一些东ѝ有旉的话Q可能会再次写一些高U一些的taglib的设计方法?br />
[与ASP.NET Web Custom Control]
不能说taglib与ASP.NET Web Custom Control有什么可比性。但是我习惯二者放CL。因为因为在某些实际目中,我确实从二者之间找C些共性。甚x时候创作一些组件的时候实现是完全相同的?br />1Q 二者都定义了当标记输出开始标记和l束标记时的q程?br />2Q 二者都可以跨应用用?br />3Q 可以用相同的HTML和脚本?br />
但比较v来,ASP.NET Web Custom Control更高U一些。可以在容器中直接以对象的Ş式访问。ƈ且可以定义方法,事g。意卛_以完全控制一个控件?br />
而taglib同样有优点,例如可以嵌套使用Q开发成本低{。最关键的是Qtaglibh做ؓjava产品的精l,y和活泹{他们分别是有着不同风格的优U技术?br />
参考文?br />taglib最佛_?IBM developerWorks中文?/em>)
http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/
下载的oscache-2.1.1-full.zip解压Q你会看到oscache-2.1.1.jar 及一些目?docs、etc、lib、src?br />现在?etc目录下oscache.properties 、oscache.tld ?oscache-2.1.1.jar 文g复制C的应用服务器目录?br />
使用tomcatQjdk1.4 配置例:
D:\Tomcat 5.0\webapps\ROOT\WEB-INF\lib\oscache-2.1.1.jar
D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.properties
D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.tld
oscache.properties 文g配置参数说明Q?br />cache.memory
gؓtrue ?false Q默认ؓ在内存中作缓存,
如设|ؓfalseQ那cache只能~存到数据库或硬盘中Q那cacheq有什么意义:Q?br />cache.capacity
~存元素个数
cache.persistence.class
持久化缓存类Q如此类打开Q则必须讄cache.path信息
cache.cluster 相关
为集设|信息。如
cache.cluster.multicast.ip为广播IP地址
cache.cluster.properties为集属?br />
再将 D:\Tomcat 5.0\webapps\ROOT\WEB-INF\web.xml 文g中添加如下代?br /><taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>
</taglib>
======================cache1.jsp 内容如下=================
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.util.*" %>
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>
没有~存的日? <%= new Date() %><p>
<!--自动h-->
<cache:cache time="30">
?0U刷新缓存一ơ的日期: <%= new Date() %> <p>
</cache:cache>
<!--手动h-->
<cache:cache key="testcache">
手动h~存的日? <%= new Date() %> <p>
</cache:cache>
<a /></body>
</html>
=========================================================
====================cache2.jsp 执行手动h面如下===========
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="oscache" prefix="cache" %>
<html>
<body>~存已刷?..<p>
<cache:flush key="testcache" scope="application"/>
<a /></body>
</html>
==========================================================
可以让你所?jsp面自动~存?br />
你可以在web.xml中定义缓存过滤器Q定义特定资源的~存?br /><filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>60</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>session</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
上面定义缓存所?jsp面Q缓存刷新时间ؓ60U,~存作用域ؓSession
注意QCacheFilter只捕获Http头ؓ200的页面请求,卛_Ҏ错误h作缓存,
而不对其他请求(?00,404,400Q作~存处理
OSCache使用l验ȝ
OSCache的用主要有4U:
POJO ~存
HTTP Response ~存
JSP Tag Library ~存
O/R Data Access ~存
1、POJO ~存
q种方式的缓存直接调用OSCache的APIq行Q主要用于处理页面内容会Ҏ参数动态改变,可以参数设|ؓkey值来保存数据Q?br />首先Q声明成员变量:
// OSCache Adminitrator instance
private static GeneralCacheAdministrator cacheAdmin = null;
其次Q进行初始化Q?br /> public RingArtistAction() {
cacheAdmin = new GeneralCacheAdministrator();
}
POJOq行~存Q?br /> // Cache data key and refresh period
String key = sex + ":" + place;
int refreshPeriod = Constants.getIntegerValue(Constants.OSCACHE_REFRESH_PERIOD).intValue();
try {
// Get from the cache
artists = (Map) cacheAdmin.getFromCache(key, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
// Get the value (probably from the database)
int count = getArtistCount(sex, place, errors);
artists = getArtistData(sex, place, count, errors);
// Store in the cache
cacheAdmin.putInCache(key, artists);
} catch (Exception ex) {
// We have the current content if we want fail-over.
artists = (Map) nre.getCacheContent();
// It is essential that cancelUpdate is called if the
// cached content is not rebuilt
cacheAdmin.cancelUpdate(key);
ex.printStackTrace();
}
}
2、HTTP Response ~存
q种方式的缓存用来处理整个页面的内容固定Q不会根据参数动态改变:
首先在web.xml中配|CacheFilterQ?br /> <filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>86400</param-value>
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>application</param-value>
</init-param>
</filter>
所有需要缓存的面加入filter-mappingQ?br /> <filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意Q只有返回状态ؓ200QHttpServletResponse.SC_OKQ的内容才会被缓?/p>
3、JSP Tag ~存
JSP Tag~存主要用于~存JSP面的局部内容:
<cache:cache key="especialcategory" cron="* 5 * * *">
<jsp:include page="/ringcategory.do" flush="true" >
<jsp:param name="ringType" value="1"/>
</jsp:include>
</cache:cache>
4、O/R Data Access ~存
请阅d考资料的内容获取详情?/p>
参考资料:
Taking the load off: OSCache helps databases copeQ?a >http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases
子选择?
相对来说Q简化html文g的代码更加重要,因此在css中用子选择器非常有益,同时也css代码更加Ҏ理解。比如下面的代码Q?br /><div id="sub_nav">
<ul>
<li> <a href="#">Item 1</a></li>>
<li> <a href="#">Item 2</a></li>
<li> <a href="#">Item 3</a></li>
</ul>
</div>
如果div li a都有各自的式?采用子选择?可以省略代码中li 和a 的class属性,从而简化代码:
#sub_nav { /* Some styling */ }
#sub_nav li { /* Some styling */ }
#sub_nav a { /* Some styling */ }
l选择器:
当一些元素类型、class或者id都有共同的一些属性,你就可以使用l选择器来避免多次的重复定义。这可以节省不少字节?
例如Q定义所有标题的字体、颜色和marginQ你可以q样写:
h1,h2,h3,h4,h5,h6 {
font-family:"Lucida Grande",Lucida,Arial,Helvetica,sans-serif;
color:#333;
margin:1em 0;
}
如果在用时Q有个别元素需要定义独立样式,你可以再加上新的定义Q可以覆盖老的定义Q例如:
h1 { font-size:2em; }
h2 { font-size:1.6em; }
重用、子选择器和l选择器的灉|使用可以非常有效的减代码,同时非常有利的增加代码的可读性,具体的应用需要在具体~写q程中体会?/span>
margin
和补?strong>padding
Q依据国内出版社的翻译惯例,margin被翻译成边界Qpadding被翻译成补白Q译者依照习惯翻译。但译者认为,margin译成外边距Qpadding译成内边距更ؓ直白和Ş象。你可以依据自己的习惯来适应q两U不同的译法。——译者注Q是隔开元素最常用的两个属性。边界是元素外边的距,而补白则是元素内部的距离?/p>
?code>h2改进代码如下Q?/p>
h2 {
font-size: 1.5em;
background-color: #ccc;
margin: 1em;
padding: 3em;
}
你可以看CU标题外围有一个字W的宽度Q还很臃肿,因ؓ在二U标题内部有3个字W宽度的补白?/p>
元素的四边可以设|不同的倹{?strong>margin-top
?margin-right
?strong>margin-bottom
?margin-left
?strong>padding-top
?strong>padding-right
?strong>padding-bottom
?strong>padding-left
是无需解释的属性(看看英文字面意思啦Q?/p>
边界、补白和ҎQ见下一?/a>Q是人尽皆知的盒状模型的l成所有部分。盒状模型是q样工作的:中间是元素盒子(在脑中惛_一下情形)Q从里到外依ơ包围着补白盒子、边框盒子和边界盒子。很昄圎ͼ如下所C: