﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-happyenjoylife</title><link>http://www.blogjava.net/happyenjoylife/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 10:25:53 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 10:25:53 GMT</pubDate><ttl>60</ttl><item><title>mysql innodb存储与索引的总结</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/12/17/366639.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Sat, 17 Dec 2011 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/12/17/366639.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/366639.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/12/17/366639.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/366639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/366639.html</trackback:ping><description><![CDATA[<h2>Innodb<span style="font-family: 宋体">存储</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">表空间是逻辑存放所有数据的地方，默认情况下会共享一个表空间&#8212;&#8212;</span>ibdata1<span style="font-family: 宋体">，但如果把</span>innodb_file_per_table=ON<span style="font-family: 宋体">后每张表可以单独放到一个表空间内，但还是有很多数据保存在共享的表</span>ibdata1<span style="font-family: 宋体">中，如</span>undo<span style="font-family: 宋体">信息等。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">表空间由各种段</span>(segment)<span style="font-family: 宋体">组成，常见的段有数据段、索引段等。</span>Innodb<span style="font-family: 宋体">是索引组织的，数据段就是</span>clustered index<span style="font-family: 宋体">的叶结点。需要注意的是，不是每个对象都有段。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">区</span>(extend)<span style="font-family: 宋体">是由</span>64<span style="font-family: 宋体">个连续的页组成，每个页（</span>page<span style="font-family: 宋体">）固定为</span>16KB<span style="font-family: 宋体">，所以每个区总共为</span>1M<span style="font-family: 宋体">。页是</span>innodb<span style="font-family: 宋体">最小的磁盘管理单位。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p style="text-indent: 21pt">Innodb<span style="font-family: 宋体">是按行进行存放的，每个区最少可以保存</span>2<span style="font-family: 宋体">条记录，否则就成链式结构了。每行数据除了自定义列以外，还会增加事务</span>id<span style="font-family: 宋体">和回滚指针列。如果没有定义</span>primary key<span style="font-family: 宋体">也没有</span>not null<span style="font-family: 宋体">的</span>unique,<span style="font-family: 宋体">则会增加</span>6<span style="font-family: 宋体">字节的</span>RowId<span style="font-family: 宋体">列作为主键。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/chjw8016/UseInCode/BBB.jpg" width="569" height="345" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图片来自：<a href="http://www.cnblogs.com/chjw8016/archive/2011/03/08/1976891.html">http://www.cnblogs.com/chjw8016/archive/2011/03/08/1976891.html</a><br /><br /></span></p>
<p style="text-indent: 21pt"></p>
<h2>Innodb<span style="font-family: 宋体">表的限制</span></h2>
<p style="text-align: left; line-height: 17.25pt;background: white; vertical-align: baseline" align="left"><span style="border-bottom: windowtext 1pt; border-left: windowtext 1pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; font-family: 'Helvetica','sans-serif'; color: black; font-size: 10pt; border-top: windowtext 1pt; border-right: windowtext 1pt; padding-top: 0cm">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体">一个表不能包含超过</span>1000<span style="font-family: 宋体">列。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left">&nbsp;&nbsp;<span style="font-family: 宋体">内部最大键长度是</span>3500<span style="font-family: 宋体">字节，但</span>MySQL<span style="font-family: 宋体">自己限制这个到</span>1024<span style="font-family: 宋体">字节。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left">&nbsp;&nbsp;<span style="font-family: 宋体">除了</span>VARCHAR, BLOB<span style="font-family: 宋体">和</span>TEXT<span style="font-family: 宋体">列，最大行长度稍微小于数据库页的一半。即，最大行长度大约</span>8000<span style="font-family: 宋体">字节。</span>LONGBLOB<span style="font-family: 宋体">和</span>LONGTEXT<span style="font-family: 宋体">列必须小于</span>4GB, <span style="font-family: 宋体">总的行长度，页包括</span>BLOB<span style="font-family: 宋体">和</span>TEXT<span style="font-family: 宋体">列，必须小于</span>4GB<span style="font-family: 宋体">。</span>InnoDB<span style="font-family: 宋体">在行中存储</span>VARCHAR<span style="font-family: 宋体">，</span>BLOB<span style="font-family: 宋体">或</span>TEXT<span style="font-family: 宋体">列的前</span>768<span style="font-family: 宋体">字节，余下的存储的分散的页中。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left"><span style="font-family: 宋体">虽然</span>InnoDB<span style="font-family: 宋体">内部地支持行尺寸大于</span>65535<span style="font-family: 宋体">，你不能定义一个包含</span>VARCHAR<span style="font-family: 宋体">列的，合并尺寸大于</span>65535<span style="font-family: 宋体">的行。</span></p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql&gt; CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),</p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-&gt; c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),</p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;-&gt; f VARCHAR(10000), g VARCHAR(10000));</p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR 1118 (42000): Row size too large. The maximum row size for the</p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used table type, not counting BLOBs, is 65535. You have to change some</p>
<p style="text-align: left; line-height: 18.75pt;background: white; vertical-align: baseline" align="left">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; columns to TEXT or BLOBs</p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left">&nbsp;<span style="font-family: 宋体">在一些更老的操作系统上，数据文件必须小于</span>2GB<span style="font-family: 宋体">。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left">&nbsp;InnoDB<span style="font-family: 宋体">日志文件的合并尺寸必须小于</span>4GB<span style="font-family: 宋体">。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left"><span style="font-family: 宋体">最小的表空间尺寸是</span>10MB<span style="font-family: 宋体">。最大的表空间尺寸是</span>4,000,000,000<span style="font-family: 宋体">个数据库页（</span>64TB<span style="font-family: 宋体">）。这也是一个表的最大尺寸。</span></p>
<p style="text-align: left; line-height: 17.25pt; text-indent: 21pt;background: white; vertical-align: baseline" align="left">&nbsp;InnoDB<span style="font-family: 宋体">表不支持</span>FULLTEXT<span style="font-family: 宋体">索引</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<h2>Innodb<span style="font-family: 宋体">索引</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">默认情况下</span>Memory<span style="font-family: 宋体">使用存储</span>hash<span style="font-family: 宋体">索引，但也支持</span>b+tree<span style="font-family: 宋体">索引。</span>Hash<span style="font-family: 宋体">索引只用于</span>=<span style="font-family: 宋体">或者</span>&lt;=&gt;<span style="font-family: 宋体">的等式比较，不能用来加速</span>order by<span style="font-family: 宋体">操作，只能通过关键字来搜索一行。</span>innodb<span style="font-family: 宋体">只支持</span>b+<span style="font-family: 宋体">树索引，进一步分为</span>clustered index <span style="font-family: 宋体">与　</span>secondary index<span style="font-family: 宋体">。在一次查询中，只能使用一个索引。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-indent: 10.5pt; margin: 0cm 0cm 0pt 10.5pt">Innodb<span style="font-family: 宋体">是索引组织表，</span>clustered index<span style="font-family: 宋体">的叶结点保存着整行的数据。如果，定义了</span>primary key<span style="font-family: 宋体">，则</span>clustered index<span style="font-family: 宋体">就是</span>primary key<span style="font-family: 宋体">的索引；如果没有定义</span>primary key mysql<span style="font-family: 宋体">会选中第一个仅有</span>not null<span style="font-family: 宋体">列的</span>unique<span style="font-family: 宋体">索引作为主键，并把此索引当作</span>clustered index<span style="font-family: 宋体">使用；如果没找到这样的列，</span>innodb<span style="font-family: 宋体">会创建一个</span>6<span style="font-family: 宋体">字节的</span>RowId<span style="font-family: 宋体">作为主键。所以每张表有且只有一个</span>clustered index<span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Secondary index</span><span style="font-family: 宋体">的叶结点不包括行的全部数据，包含键值以外还包括一个</span>bookmark<span style="font-family: 宋体">，可以告诉</span>innodb<span style="font-family: 宋体">到什么地方可以找到相对应的完整行数据，还保存了主键的健值。</span>Secondary index<span style="font-family: 宋体">包含主键，但不包含完整的行数据，所以</span>innodb<span style="font-family: 宋体">总是会先从</span>secondary index<span style="font-family: 宋体">的叶节点判断是否能得到所需的数据。如</span>,</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Create table t(a int, b varchar(20), primary key(a), key(b));</span></p>
<p style="text-indent: 21pt">Explain select * from t;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">会发现</span>mysql<span style="font-family: 宋体">选择了索引</span>b<span style="font-family: 宋体">，而不是</span>a.</p>
<h2><span style="font-family: 宋体">复合索引</span></h2>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">复合索引是在多列（</span>&gt;=2<span style="font-family: 宋体">）上建立的索引，又叫多列索引或联合索引。</span>Innodb<span style="font-family: 宋体">中的复合索引也是</span>b+ tree<span style="font-family: 宋体">结构。索引的数据包含多列</span>(col1, col2, col3&#8230;)<span style="font-family: 宋体">，在索引中依次按照</span>col1, col2, col3<span style="font-family: 宋体">排序。如</span>(1, 2), (1, 3),(2,0)&#8230;</p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">使用复合索引要充分利用最左前缀原则，顾名思义，就是最左优先。如创建索引</span>ind_col1_col2(col1, col2)<span style="font-family: 宋体">，那么在查询</span>where col1 = xxx and col2 = xx<span style="font-family: 宋体">或者</span>where col1 = xxx<span style="font-family: 宋体">都可以走</span>ind_col1_col2<span style="font-family: 宋体">索引。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在创建多列索引时，要根据业务需求，</span>where<span style="font-family: 宋体">子句中使用最频繁且过滤效果好的的一列放在最左边。</span></p>
<h2><span style="font-family: 宋体">索引操作</span></h2>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">可以通过</span>DML<span style="font-family: 宋体">语句操作</span>innodb<span style="font-family: 宋体">索引。因为</span>innodb<span style="font-family: 宋体">是索引组织的表，对索引的操作会造成锁表，先生成一张临时表，将数据从原始表中写到临时表，再将原始表删除，最后将临时表表名改为原始表表名！因增加、删除、修改字段会对主索引产生影响，所以也会锁表。对</span>secondary index<span style="font-family: 宋体">从</span>Innodb plugin<span style="font-family: 宋体">开始，支持快速索引创建的方法，在创建的过程中不需要重建表，所以速度会很快，同时引擎会在表上加</span>S<span style="font-family: 宋体">锁，在创建过程中只能进行读操作。</span></p>
<h2><span style="font-family: 宋体">索引设计原则</span></h2>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">搜索的索引列，不一定是所要选择的列。也就是说，最适合索引的列是出现在</span>where<span style="font-family: 宋体">子句中的列，或者连接子句中指定的列，而不是出现在</span>select<span style="font-family: 宋体">关键字后的选择列表中的列。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">使用唯一索引。考虑某列的分布，索引的列的基数越大，索引的效果越好。例如，对性别</span>M/F<span style="font-family: 宋体">列做索引没多大用处。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">使用短索引。如果是对字符串进行索引，如果有可能应该指定前缀长度。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">利用最左前缀。尽量将使用频繁且过滤效果好的字段放&#8220;左边&#8221;</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">不要过度索引。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>Innodb<span style="font-family: 宋体">默认会按照一定的顺序保存数据，如果明确定义了主键，则按照主键顺序保存。如果没有主键，但有唯一索引，就按照唯一索引的顺序保存。如果有几个列都是唯一的，都可以作为主键的时候，为了提高查询效率，应选择最常用访问的列作为主键。另外，</span>innodb<span style="font-family: 宋体">的</span>secondary index<span style="font-family: 宋体">都会保存主键的键值，所有主键要尽可能选择较短的数据类型。可以看出，应当尽量避免对主键的修改。经过</span>dba<span style="font-family: 宋体">的测试，保证主键的递增可以提高插入性能。</span></p>
<p>&nbsp;</p>
<h2>Mysql<span style="font-family: 宋体">如何使用索引</span></h2>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">对于创建的多列索引，只要查询的条件中用到了最左边的列，索引一般就会被使用。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">对于使用</span>like<span style="font-family: 宋体">的查询，后面如果是常量并且只有</span>%<span style="font-family: 宋体">号不在第一个字符，索引才可能被使用。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果对大文本进行搜索，应该使用全文索引，而不是使用</span>like &#8216;%...%&#8217;. <span style="font-family: 宋体">但不幸的是</span>innodb<span style="font-family: 宋体">不支持全文索引。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果列名是索引，使用</span> index_column is null<span style="font-family: 宋体">将使用索引。</span>Oracle<span style="font-family: 宋体">是不行的。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果</span>mysql<span style="font-family: 宋体">估计使用索引比全表扫描更慢，最不会使用索引。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果使用</span>memory/head<span style="font-family: 宋体">表并且</span>where<span style="font-family: 宋体">条件中不使用</span>&#8221;=&#8221;<span style="font-family: 宋体">进行索引列，那么不会用到索引。</span>Head<span style="font-family: 宋体">表只有在</span>&#8221;=&#8221;<span style="font-family: 宋体">的时候才会使用索引。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">用</span>or<span style="font-family: 宋体">分割开的条件，如果</span>or<span style="font-family: 宋体">前的条件中的列有索引，而后面列中没有索引，那么涉及到的索引都不会被用到。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>8.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">不是多列索引的第一部分不会走索引。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>9.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">以</span>%<span style="font-family: 宋体">开始的</span>like<span style="font-family: 宋体">不会走索引</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>10.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 宋体">如果列是字符串，那么一定要在</span>where<span style="font-family: 宋体">条件中把字符串常量值用引号引起来，否则不能走索引。因为，</span>mysql<span style="font-family: 宋体">默认把输入的常量值进行转换以后才进行检索。</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>11.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 宋体">经过普通运算或函数运算后的索引字段不能使用索引</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>12.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 宋体">不等于操作不能使用索，</span>&lt;&gt;<span style="font-family: 宋体">、</span>not in<span style="font-family: 宋体">等</span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 0pt 18pt"><span>13.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span>Order by <span style="font-family: 宋体">优化：某些情况下，</span>mysql<span style="font-family: 宋体">可以使用一个索引满足</span>order by,<span style="font-family: 宋体">而不需要额外的排序。</span>Where<span style="font-family: 宋体">条件与</span>order by <span style="font-family: 宋体">使用相同的索引，并且</span>order by<span style="font-family: 宋体">的顺序和索引顺序相同，并且</span>order by<span style="font-family: 宋体">的字段都是升序或者都是降序。</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;</p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2</p>
<p style="margin: 0cm 0cm 0pt 18pt">DESC;</p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;</p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">但是以下情况不使用索引：</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC <span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">--order by <span style="font-family: 宋体">的字段混合</span> ASC <span style="font-family: 宋体">和</span> DESC</p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 WHERE key2=constant ORDER BY key1 <span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">-- <span style="font-family: 宋体">用于查询行的关键字与</span> ORDER BY <span style="font-family: 宋体">中所使用的不相同</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">SELECT * FROM t1 ORDER BY key1, key2 <span style="font-family: 宋体">；</span></p>
<p style="margin: 0cm 0cm 0pt 18pt">-- <span style="font-family: 宋体">对不同的关键字使用</span> ORDER BY <span>&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">可以使用</span>explain<span style="font-family: 宋体">查看</span>sql<span style="font-family: 宋体">的执行计划。</span></p><img src ="http://www.blogjava.net/happyenjoylife/aggbug/366639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-12-17 16:36 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/12/17/366639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Java bridge methods explained</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/08/20/356919.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Sat, 20 Aug 2011 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/08/20/356919.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/356919.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/08/20/356919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/356919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/356919.html</trackback:ping><description><![CDATA[原文： 
<div>http://stas-blogspot.blogspot.com/2010/03/java-bridge-methods-explained.html</div><span style="line-height: 20px; background-color: #ffffff; font-family: Georgia, serif; color: #333333; font-size: 13px" class="Apple-style-span"><br />Bridge methods in Java are synthetic methods, which are necessary to implement some of Java language features. The best known samples are covariant return type and a case in generics when erasure of base method's arguments differs from the actual method being invoked.<br /><br />Have a look at following example:<br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleOne&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;T&nbsp;getT()&nbsp;{<br /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />}<br />}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getT()&nbsp;{<br /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />}<br />}<br />}<br /><br /></span></div></span><span style="line-height: 20px; background-color: #ffffff; font-family: Georgia, serif; color: #333333; font-size: 13px" class="Apple-style-span">Which in reality is just an example of covariant return type and after&nbsp;<a style="color: #5588aa; text-decoration: none" href="http://en.wikipedia.org/wiki/Type_erasure">erasure</a>&nbsp;will look like following snippet:<br /></span><font class="Apple-style-span" color="#333333" size="2" face="Georgia, serif"><span style="line-height: 20px" class="Apple-style-span"><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleOne&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;getT()&nbsp;{<br /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />}<br />}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getT()&nbsp;{<br /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />}<br />}<br />}</span></div><br /></span></font><span style="line-height: 20px; background-color: #ffffff; font-family: Georgia, serif; color: #333333; font-size: 13px" class="Apple-style-span">And after the compilation decompiled result class "B" will be following:<br /></span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleOne$B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SampleOne$A&nbsp;{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SampleOne$B();<br /><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.lang.String&nbsp;getT();<br />Code:<br /></span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aconst_null<br /></span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;areturn<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.lang.Object&nbsp;getT();<br />Code:<br /></span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aload_0<br /></span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;invokevirtual&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Call&nbsp;to&nbsp;Method&nbsp;getT:()Ljava/lang/String;</span><span style="color: #008000"><br /></span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;areturn<br />}<br /></span></div><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><br />Above you can see there is new<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(85,136,170); text-decoration: none" href="http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#80128">synthetic</a><span class="Apple-converted-space">&nbsp;</span>method "java.lang.Object getT()" which is not present in source code. That method acts as bridge method and all is does is delegating invocation to "java.lang.String getT()". Compiler has to do that, because in JVM method return type is part of method's signature, and creation of bridge method is the way to implement covariant return type.<br /><br />Now have a look at following example which is generics-specific: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_23_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_187_Open_Text.style.display='none'; Codehighlighter1_23_187_Closed_Image.style.display='inline'; Codehighlighter1_23_187_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_23_187_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_23_187_Closed_Text.style.display='none'; Codehighlighter1_23_187_Open_Image.style.display='inline'; Codehighlighter1_23_187_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleTwo&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_23_187_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_23_187_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_50_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_91_Open_Text.style.display='none'; Codehighlighter1_50_91_Closed_Image.style.display='inline'; Codehighlighter1_50_91_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_50_91_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_50_91_Closed_Text.style.display='none'; Codehighlighter1_50_91_Open_Image.style.display='inline'; Codehighlighter1_50_91_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_50_91_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_50_91_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_74_89_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_89_Open_Text.style.display='none'; Codehighlighter1_74_89_Closed_Image.style.display='inline'; Codehighlighter1_74_89_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_74_89_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_74_89_Closed_Text.style.display='none'; Codehighlighter1_74_89_Open_Image.style.display='inline'; Codehighlighter1_74_89_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;T&nbsp;getT(T&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_74_89_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_74_89_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;args;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_134_185_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_185_Open_Text.style.display='none'; Codehighlighter1_134_185_Closed_Image.style.display='inline'; Codehighlighter1_134_185_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_134_185_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_134_185_Closed_Text.style.display='none'; Codehighlighter1_134_185_Open_Image.style.display='inline'; Codehighlighter1_134_185_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_134_185_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_185_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_168_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_183_Open_Text.style.display='none'; Codehighlighter1_168_183_Closed_Image.style.display='inline'; Codehighlighter1_168_183_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_168_183_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_168_183_Closed_Text.style.display='none'; Codehighlighter1_168_183_Open_Image.style.display='inline'; Codehighlighter1_168_183_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getT(String&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_168_183_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_183_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;args;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><br /></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">after compilation class "B" will be transformed into following: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_48_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_380_Open_Text.style.display='none'; Codehighlighter1_48_380_Closed_Image.style.display='inline'; Codehighlighter1_48_380_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_48_380_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_48_380_Closed_Text.style.display='none'; Codehighlighter1_48_380_Open_Image.style.display='inline'; Codehighlighter1_48_380_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleThree$B&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SampleThree$A</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_48_380_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_48_380_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SampleThree$B();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.lang.String&nbsp;getT(java.lang.String);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />Code:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aload_1<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;areturn<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;java.lang.Object&nbsp;getT(java.lang.Object);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />Code:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aload_0<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aload_1<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;checkcast&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">class&nbsp;java/lang/String</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">5</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;invokevirtual&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Method&nbsp;getT:(Ljava/lang/String;)Ljava/lang/String;</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">8</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;areturn<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><br />here, the bridge method, which overrides method from base class "A", not just calling one with string argument (#3), but also performs type cast to "java.lang.String" (#2). It means, that if you will execute following code, ignoring compiler's "unchecked" warning, the result will be ClassCastException thrown from the bridge method: 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">A&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;B();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />a.getT(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object()));</span></div></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><br />These two examples are the best known cases where bridge methods are used, but there is, at least, one more, where bridge method is used to "change" visibility of base class's methods. Have a look at following sample and try to guess where compiler may need the bridge method to be created:
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;samplefour;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_45_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_45_183_Open_Text.style.display='none'; Codehighlighter1_45_183_Closed_Image.style.display='inline'; Codehighlighter1_45_183_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_45_183_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_45_183_Closed_Text.style.display='none'; Codehighlighter1_45_183_Open_Image.style.display='inline'; Codehighlighter1_45_183_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleFour&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_45_183_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_45_183_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_62_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_86_Open_Text.style.display='none'; Codehighlighter1_62_86_Closed_Image.style.display='inline'; Codehighlighter1_62_86_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_62_86_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_62_86_Closed_Text.style.display='none'; Codehighlighter1_62_86_Open_Image.style.display='inline'; Codehighlighter1_62_86_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_62_86_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_86_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_82_84_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_84_Open_Text.style.display='none'; Codehighlighter1_82_84_Closed_Image.style.display='inline'; Codehighlighter1_82_84_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_82_84_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_82_84_Closed_Text.style.display='none'; Codehighlighter1_82_84_Open_Image.style.display='inline'; Codehighlighter1_82_84_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_82_84_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_82_84_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_120_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_120_123_Open_Text.style.display='none'; Codehighlighter1_120_123_Closed_Image.style.display='inline'; Codehighlighter1_120_123_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_120_123_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_120_123_Closed_Text.style.display='none'; Codehighlighter1_120_123_Open_Image.style.display='inline'; Codehighlighter1_120_123_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;C&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_120_123_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_120_123_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_157_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_181_Open_Text.style.display='none'; Codehighlighter1_157_181_Closed_Image.style.display='inline'; Codehighlighter1_157_181_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_157_181_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_157_181_Closed_Text.style.display='none'; Codehighlighter1_157_181_Open_Image.style.display='inline'; Codehighlighter1_157_181_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;D&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;A&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_157_181_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_157_181_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_177_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_177_179_Open_Text.style.display='none'; Codehighlighter1_177_179_Closed_Image.style.display='inline'; Codehighlighter1_177_179_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_177_179_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_177_179_Closed_Text.style.display='none'; Codehighlighter1_177_179_Open_Image.style.display='inline'; Codehighlighter1_177_179_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_177_179_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_177_179_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">If you will decompile class C, you will see method "foo" there, which overrides method from base class and delegates to it:
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_46_158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_158_Open_Text.style.display='none'; Codehighlighter1_46_158_Closed_Image.style.display='inline'; Codehighlighter1_46_158_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_46_158_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_46_158_Closed_Text.style.display='none'; Codehighlighter1_46_158_Open_Image.style.display='inline'; Codehighlighter1_46_158_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SampleFour$C&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SampleFour$A</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_46_158_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_158_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;foo();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />Code:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;aload_0<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;invokespecial&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Method&nbsp;SampleFour$A.foo:()V</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><br />compiler needs that method, because class A is not public and can't be accessed outside it's package, but class C is public and all inherited method have to become visible outside the package as well. Note, that class D will not have bridge method, because it overrides "foo" and there is no need to "increase" visibility.<br />It looks like, that type of bridge method, was introduced after<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(85,136,170); text-decoration: none" href="http://bugs.sun.com/view_bug.do?bug_id=6342411">bug</a><span class="Apple-converted-space">&nbsp;</span>which was fixed in Java 6. It means that before Java 6 that type of bridge method is not generated and method "C#foo" can't be called from package other than it's own via reflection, so following snippet causes IllegalAccessException, in cases when compiled on Java version &lt; 1.6:
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;samplefive;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />SampleFour.C.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getMethod(</span><span style="color: #000000">"</span><span style="color: #000000">foo</span><span style="color: #000000">"</span><span style="color: #000000">).invoke(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SampleFour.C());</span></div></span><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 13px/20px Georgia, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">Normal invocation, without using reflection, will work fine.<br /><br />Probably there are some other cases where bridge methods are used, but there is no source of information about it. Also, there is no definition of bridge method, although you can guess it easily, it's pretty obvious from examples above, but still would be nice to have something in spec which states it clearly. In spite of the fact that method<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(85,136,170); text-decoration: none" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Method.html#isBridge%28%29">Method#isBridge()</a><span class="Apple-converted-space">&nbsp;</span>is part of public reflection API since Java1.5 and bridge flag is part of<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(85,136,170); text-decoration: none" href="http://java.sun.com/docs/books/jvms/second_edition/ClassFileFormat-Java5.pdf">class file format</a>, JVM and JLS specifications do not have any information what exactly is that and do not provide any rules when and how it should be used by compiler. All I could find is just reference in "Discussion" area<span class="Apple-converted-space">&nbsp;</span><a style="color: rgb(85,136,170); text-decoration: none" href="http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.4.5">here</a>.</span><img src ="http://www.blogjava.net/happyenjoylife/aggbug/356919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-08-20 10:19 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/08/20/356919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jvm 学习——异常处理</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/05/27/351175.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Fri, 27 May 2011 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/05/27/351175.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/351175.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/05/27/351175.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/351175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/351175.html</trackback:ping><description><![CDATA[<h2><span>异常表</span></h2>
<p><span style="font-family: 宋体">每一个</span>try<span style="font-family: 宋体">语句块</span>catch<span style="font-family: 宋体">的异常都与异常表中的一项相对应，异常表中的每一项都包括：</span></p>
<ol><li>
<div style="text-indent: -21pt; margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">起点</span></div></li><li>
<div style="text-indent: -21pt; margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">终点，始终把</span>catch<span style="font-family: 宋体">异常位置的</span>pc<span style="font-family: 宋体">指针偏移量的最大值大１</span></div></li><li>
<div style="text-indent: -21pt; margin: 0cm 0cm 0pt 21pt"><span style="font: 7pt 'Times New Roman'">&nbsp;</span><span style="font-family: 宋体">处理异常时跳转到的字节码序列中的</span>pc<span style="font-family: 宋体">指针偏移量</span></div></li><li>
<div style="text-indent: -21pt; margin: 0cm 0cm 0pt 21pt"><span style="font: 7pt 'Times New Roman'">&nbsp;</span><span style="font-family: 宋体">被</span>catch<span style="font-family: 宋体">的异常类的常量池索引</span></div></li></ol>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">例如：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_18_180_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_180_Open_Text.style.display='none'; Codehighlighter1_18_180_Closed_Image.style.display='inline'; Codehighlighter1_18_180_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_18_180_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_18_180_Closed_Text.style.display='none'; Codehighlighter1_18_180_Open_Image.style.display='inline'; Codehighlighter1_18_180_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_18_180_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_180_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_60_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_178_Open_Text.style.display='none'; Codehighlighter1_60_178_Closed_Image.style.display='inline'; Codehighlighter1_60_178_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_60_178_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_60_178_Closed_Text.style.display='none'; Codehighlighter1_60_178_Open_Image.style.display='inline'; Codehighlighter1_60_178_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_60_178_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_60_178_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_69_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_69_111_Open_Text.style.display='none'; Codehighlighter1_69_111_Closed_Image.style.display='inline'; Codehighlighter1_69_111_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_69_111_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_69_111_Closed_Text.style.display='none'; Codehighlighter1_69_111_Open_Image.style.display='inline'; Codehighlighter1_69_111_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_69_111_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_69_111_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(</span><span style="color: #000000">"</span><span style="color: #000000">java.lang.String</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img id="Codehighlighter1_146_174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_146_174_Open_Text.style.display='none'; Codehighlighter1_146_174_Closed_Image.style.display='inline'; Codehighlighter1_146_174_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_146_174_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_146_174_Closed_Text.style.display='none'; Codehighlighter1_146_174_Open_Image.style.display='inline'; Codehighlighter1_146_174_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_146_174_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_146_174_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">用</span><span lang="EN-US"><font face="Calibri">javap &#8211;c</font></span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">查看字节码如下：</span><span lang="EN-US"><o:p></o:p></span></p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">Compiled&nbsp;from&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Test.java</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img id="Codehighlighter1_68_632_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_632_Open_Text.style.display='none'; Codehighlighter1_68_632_Closed_Image.style.display='inline'; Codehighlighter1_68_632_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_68_632_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_68_632_Closed_Text.style.display='none'; Codehighlighter1_68_632_Open_Image.style.display='inline'; Codehighlighter1_68_632_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;java.lang.Object</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_68_632_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_68_632_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Test();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;Code:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;aload_0<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;invokespecial&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Method&nbsp;java/lang/Object."&lt;init&gt;":()V</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(java.lang.String[]);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;Code:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;ldc&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">String&nbsp;java.lang.String</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;invokestatic&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Method&nbsp;java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">goto</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;astore_1<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;aload_1<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;invokevirtual&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000">5</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Method&nbsp;java/lang/ClassNotFoundException.printStackTrace:()V</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;Exception&nbsp;table:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;target&nbsp;type<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;Class&nbsp;java</span><span style="color: #000000">/</span><span style="color: #000000">lang</span><span style="color: #000000">/</span><span style="color: #000000">ClassNotFoundException<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">可见</span>ClassNotFoundException<span style="font-family: 宋体">异常可能会在</span>0~6<span style="font-family: 宋体">之间抛出，</span>9<span style="font-family: 宋体">开始处的代码处理此异常。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">当产生异常的时候，</span>jvm<span style="font-family: 宋体">将会在整个异常表中搜索与之匹配的项，如果当前</span>pc<span style="font-family: 宋体">在异常表入口所指的范围内，并且所抛出的异常是此入口所指向的类或者其子类，则跳转到对应的处理代码继续执行。</span></p>
<p>&nbsp;</p>
<h2><span style="font-family: 宋体">方法可能会抛出哪些已检查异常</span></h2>
<p>Class<span style="font-family: 宋体">文件的</span>attribute_info<span style="font-family: 宋体">中保存有</span>Exceptions<span style="font-family: 宋体">属性，记录着每个方法</span>throws<span style="font-family: 宋体">的异常信息。具体的可以查看</span>class<span style="font-family: 宋体">类文件格式相关的文章。</span></p>
<p>&nbsp;</p>
<p>athrow<span style="font-family: 宋体">指令从栈顶弹出</span>Throwable<span style="font-family: 宋体">对象引用，抛出异常。</span></p>
<p>&nbsp;</p>
<h2>finally<span style="font-family: 宋体">语句</span></h2>
<p><span style="font-family: 宋体">在</span>jvm<span style="font-family: 宋体">规范中，</span>finally<span style="font-family: 宋体">语句是通过</span>jsr/jsr_w<span style="font-family: 宋体">与</span>ret<span style="font-family: 宋体">指令实现的。当执行</span>jsr/jsr_w<span style="font-family: 宋体">的时候将</span>finally<span style="font-family: 宋体">执行完成后的返回地址压入栈中，进入</span>finally<span style="font-family: 宋体">后会马上将此地址保存到一个局部变量中，执行完成后，</span>ret<span style="font-family: 宋体">从此局部变量中取出返回地址。？？？为什么会先把返回地址保存到局部变量中呢？？？因为，当从</span>finally<span style="font-family: 宋体">语句返回的时候需要将返回地址成栈中弹出，当</span>finally<span style="font-family: 宋体">语句非正常结束</span>(break,continue,return, <span style="font-family: 宋体">抛异常</span>)<span style="font-family: 宋体">的时候就不用再考虑这个问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 10.5pt">以下是</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt">jvm</span><span style="font-family: 宋体; font-size: 10.5pt">规范中</span><span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt">Compiling&nbsp;finally</span><span style="font-family: 宋体; font-size: 10.5pt">的一段：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_18_92_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_92_Open_Text.style.display='none'; Codehighlighter1_18_92_Closed_Image.style.display='inline'; Codehighlighter1_18_92_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_18_92_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_18_92_Closed_Text.style.display='none'; Codehighlighter1_18_92_Open_Image.style.display='inline'; Codehighlighter1_18_92_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tryFinally()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_18_92_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_92_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_28_54_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_54_Open_Text.style.display='none'; Codehighlighter1_28_54_Closed_Image.style.display='inline'; Codehighlighter1_28_54_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_28_54_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_28_54_Closed_Text.style.display='none'; Codehighlighter1_28_54_Open_Image.style.display='inline'; Codehighlighter1_28_54_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_28_54_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_28_54_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tryItOut();<br /><img id="Codehighlighter1_64_90_Open_Image" onclick="this.style.display='none'; Codehighlighter1_64_90_Open_Text.style.display='none'; Codehighlighter1_64_90_Closed_Image.style.display='inline'; Codehighlighter1_64_90_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_64_90_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_64_90_Closed_Text.style.display='none'; Codehighlighter1_64_90_Open_Image.style.display='inline'; Codehighlighter1_64_90_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_64_90_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_64_90_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wrapItUp();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />the&nbsp;compiled&nbsp;code&nbsp;is<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />Method&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tryFinally()<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aload_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Beginning&nbsp;of&nbsp;try&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;invokevirtual&nbsp;#</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Method&nbsp;Example.tryItOut()V</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsr&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Call&nbsp;finally&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;End&nbsp;of&nbsp;try&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;astore_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Beginning&nbsp;of&nbsp;handler&nbsp;for&nbsp;any&nbsp;throw</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsr&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Call&nbsp;finally&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aload_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Push&nbsp;thrown&nbsp;value</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;athrow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />and&nbsp;rethrow&nbsp;the&nbsp;value&nbsp;to&nbsp;the&nbsp;invoker</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;astore_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Beginning&nbsp;of&nbsp;finally&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">15</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aload_0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Push&nbsp;this</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invokevirtual&nbsp;#</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Method&nbsp;Example.wrapItUp()V</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">19</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Return&nbsp;from&nbsp;finally&nbsp;block</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">Exception&nbsp;table:<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;From&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;To&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;any<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p></span>&nbsp;</p>
<p><span style="font-family: 宋体">当</span>tryItOut<span style="font-family: 宋体">排除任何异常后都将会被异常表中的</span>any<span style="font-family: 宋体">项捕获，执行完</span>finally<span style="font-family: 宋体">后，会执行</span>athrow<span style="font-family: 宋体">指令将异常抛出。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">从</span>jdk<span style="font-family: 宋体">的某一个版本开始就不会编译出编译出含</span>jsr/jsr_w<span style="font-family: 宋体">、</span>ret<span style="font-family: 宋体">的字节码了，因为有指令上的缺陷，导致</span>jvm<span style="font-family: 宋体">的检验和分析系统出现漏洞。</span></p>
<p>&nbsp;</p>
<h2><span style="font-family: 宋体">再说</span>finally<span style="font-family: 宋体">的非正常退出</span></h2>
<p><span style="font-family: 宋体">在</span>finally<span style="font-family: 宋体">中使用</span>break<span style="font-family: 宋体">、</span>continue<span style="font-family: 宋体">、</span>return<span style="font-family: 宋体">、抛出异常等认为是</span>finally<span style="font-family: 宋体">的非正常结束。非正常结束的时候，</span>ret<span style="font-family: 宋体">指令不会被执行，很可能会出现意想不到的结果。如：</span></p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_18_428_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_428_Open_Text.style.display='none'; Codehighlighter1_18_428_Closed_Image.style.display='inline'; Codehighlighter1_18_428_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_18_428_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_18_428_Closed_Text.style.display='none'; Codehighlighter1_18_428_Open_Image.style.display='inline'; Codehighlighter1_18_428_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_18_428_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_428_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_59_346_Open_Image" onclick="this.style.display='none'; Codehighlighter1_59_346_Open_Text.style.display='none'; Codehighlighter1_59_346_Closed_Image.style.display='inline'; Codehighlighter1_59_346_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_59_346_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_59_346_Closed_Text.style.display='none'; Codehighlighter1_59_346_Open_Image.style.display='inline'; Codehighlighter1_59_346_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;test(</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;b)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_59_346_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_59_346_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_73_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_326_Open_Text.style.display='none'; Codehighlighter1_73_326_Closed_Image.style.display='inline'; Codehighlighter1_73_326_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_73_326_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_73_326_Closed_Text.style.display='none'; Codehighlighter1_73_326_Open_Image.style.display='inline'; Codehighlighter1_73_326_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(b)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_73_326_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_326_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_82_104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_104_Open_Text.style.display='none'; Codehighlighter1_82_104_Closed_Image.style.display='inline'; Codehighlighter1_82_104_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_82_104_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_82_104_Closed_Text.style.display='none'; Codehighlighter1_82_104_Open_Image.style.display='inline'; Codehighlighter1_82_104_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_82_104_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_82_104_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img id="Codehighlighter1_114_322_Open_Image" onclick="this.style.display='none'; Codehighlighter1_114_322_Open_Text.style.display='none'; Codehighlighter1_114_322_Closed_Image.style.display='inline'; Codehighlighter1_114_322_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_114_322_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_114_322_Closed_Text.style.display='none'; Codehighlighter1_114_322_Open_Image.style.display='inline'; Codehighlighter1_114_322_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_114_322_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_114_322_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_120_317_Open_Image" onclick="this.style.display='none'; Codehighlighter1_120_317_Open_Text.style.display='none'; Codehighlighter1_120_317_Closed_Image.style.display='inline'; Codehighlighter1_120_317_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_120_317_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_120_317_Closed_Text.style.display='none'; Codehighlighter1_120_317_Open_Image.style.display='inline'; Codehighlighter1_120_317_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_120_317_Closed_Text">/**/</span><span id="Codehighlighter1_120_317_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;始终返回false<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javac编译再java执行会出现死循环<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在eclipse中甚至会出现报错：提示找到不main&nbsp;class<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;始终返回false<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException("");&nbsp;&nbsp;&nbsp;&nbsp;抛出异常<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_389_426_Open_Image" onclick="this.style.display='none'; Codehighlighter1_389_426_Open_Text.style.display='none'; Codehighlighter1_389_426_Closed_Image.style.display='inline'; Codehighlighter1_389_426_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_389_426_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_389_426_Closed_Text.style.display='none'; Codehighlighter1_389_426_Open_Image.style.display='inline'; Codehighlighter1_389_426_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_389_426_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_389_426_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(test(</span><span style="color: #0000ff">true</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br /><span style="font-family: 宋体; color: black; font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt">建议：在写</span><span style="font-family: 'Courier New'; color: black; font-size: 10pt; mso-font-kerning: 0pt" lang="EN-US">finally</span><span style="font-family: 宋体; color: black; font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt">语句的时候，尽量避免非正常结束！</span><span style="font-family: 'Courier New'; color: black; font-size: 10pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p><br /></span>&nbsp;</p> <img src ="http://www.blogjava.net/happyenjoylife/aggbug/351175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-05-27 14:39 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/05/27/351175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分库分表总结</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/05/13/350177.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Fri, 13 May 2011 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/05/13/350177.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/350177.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/05/13/350177.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/350177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/350177.html</trackback:ping><description><![CDATA[<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; "><a name="OLE_LINK1" style="color: #108ac6; ">单库单表</a></h2>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">单库单表是最常见的数据库设计，例如，有一张用户<span lang="EN-US">(user)</span>表放在数据库<span lang="EN-US">db</span>中，所有的用户都可以在<span lang="EN-US">db</span>库中的<span lang="EN-US">user</span>表中查到。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">单库多表</h2>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">随着用户数量的增加，<span lang="EN-US">user</span>表的数据量会越来越大，当数据量达到一定程度的时候对<span lang="EN-US">user</span>表的查询会渐渐的变慢，从而影响整个<span lang="EN-US">DB</span>的性能。如果使用<span lang="EN-US">mysql,&nbsp;</span>还有一个更严重的问题是，当需要添加一列的时候，<span lang="EN-US">mysql</span>会锁表，期间所有的读写操作只能等待。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">可以通过某种方式将<span lang="EN-US">user</span>进行水平的切分，产生两个表结构完全一样的<span lang="EN-US">user_0000,user_0001</span>等表，<span lang="EN-US">user_0000 + user_0001 + &#8230;</span>的数据刚好是一份完整的数据。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">多库多表</h2>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>随着数据量增加也许单台<span lang="EN-US">DB</span>的存储空间不够，随着查询量的增加单台数据库服务器已经没办法支撑。这个时候可以再对数据库进行水平区分。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">分库分表规则</h2>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>设计表的时候需要确定此表按照什么样的规则进行分库分表。例如，当有新用户时，程序得确定将此用户信息添加到哪个表中；同理，当登录的时候我们得通过用户的账号找到数据库中对应的记录，所有的这些都需要按照某一规则进行。</p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">路由</h2>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>通过分库分表规则查找到对应的表和库的过程。如分库分表的规则是<span lang="EN-US">user_id mod 4</span>的方式，当用户新注册了一个账号，账号<span lang="EN-US">id</span>的<span lang="EN-US">123,</span>我们可以通过<span lang="EN-US">id mod 4</span>的方式确定此账号应该保存到<span lang="EN-US">User_0003</span>表中。当用户<span lang="EN-US">123</span>登录的时候，我们通过<span lang="EN-US">123 mod 4</span>后确定记录在<span lang="EN-US">User_0003</span>中。</p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">分库分表产生的问题，及注意事项</h2>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">1. &nbsp; 分库分表维度的问题</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">假如用户购买了商品<span lang="EN-US">,</span>需要将交易记录保存取来，如果按照用户的纬度分表，则每个用户的交易记录都保存在同一表中，所以很快很方便的查找到某用户的购买情况，但是某商品被购买的情况则很有可能分布在多张表中，查找起来比较麻烦。反之，按照商品维度分表，可以很方便的查找到此商品的购买情况，但要查找到买人的交易记录比较麻烦。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">所以常见的解决方式有：</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp; &nbsp; a.通过扫表的方式解决，此方法基本不可能，效率太低了。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp; &nbsp; b.记录两份数据，一份按照用户纬度分表，一份按照商品维度分表。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp; &nbsp; c.通过搜索引擎解决，但如果实时性要求很高，又得关系到实时搜索。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">2. &nbsp; 联合查询的问题</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">联合查询基本不可能，因为关联的表有可能不在同一数据库中。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">3. &nbsp;&nbsp;避免跨库事务</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">避免在一个事务中修改<span lang="EN-US">db0</span>中的表的时候同时修改<span lang="EN-US">db1</span>中的表，一个是操作起来更复杂，效率也会有一定影响。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">4. &nbsp; 尽量把同一组数据放到同一<span lang="EN-US">DB</span>服务器上</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">例如将卖家<span lang="EN-US">a</span>的商品和交易信息都放到<span lang="EN-US">db0</span>中，当<span lang="EN-US">db1</span>挂了的时候，卖家<span lang="EN-US">a</span>相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。</p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 18pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNoSpacing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<h2 style="font-size: 1.5em; line-height: 1.5em; margin-top: 0px; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: black; font-family: Arial, sans-serif, Helvetica, Tahoma; ">一主多备</h2>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">在实际的应用中，绝大部分情况都是读远大于写。<span lang="EN-US">Mysql</span>提供了读写分离的机制，所有的写操作都必须对应到<span lang="EN-US">Master</span>，读操作可以在<span lang="EN-US">Master</span>和<span lang="EN-US">Slave</span>机器上进行，<span lang="EN-US">Slave</span>与<span lang="EN-US">Master</span>的结构完全一样，一个<span lang="EN-US">Master</span>可以有多个<span lang="EN-US">Slave,</span>甚至<span lang="EN-US">Slave</span>下还可以挂<span lang="EN-US">Slave,</span>通过此方式可以有效的提高<span lang="EN-US">DB</span>集群的<span lang="EN-US">QPS.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">所有的写操作都是先在<span lang="EN-US">Master</span>上操作，然后同步更新到<span lang="EN-US">Slave</span>上，所以从<span lang="EN-US">Master</span>同步到<span lang="EN-US">Slave</span>机器有一定的延迟，当系统很繁忙的时候，延迟问题会更加严重，<span lang="EN-US">Slave</span>机器数量的增加也会使这个问题更加严重。</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">此外，可以看出<span lang="EN-US">Master</span>是集群的瓶颈，当写操作过多，会严重影响到<span lang="EN-US">Master</span>的稳定性，如果<span lang="EN-US">Master</span>挂掉，整个集群都将不能正常工作。</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">所以，<span lang="EN-US">1.&nbsp;</span>当读压力很大的时候，可以考虑添加<span lang="EN-US">Slave</span>机器的分式解决，但是当<span lang="EN-US">Slave</span>机器达到一定的数量就得考虑分库了。<span lang="EN-US">&nbsp;2.&nbsp;</span>当写压力很大的时候，就必须得进行分库操作。</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>另外，可能会因为种种原因，集群中的数据库硬件配置等会不一样，某些性能高，某些性能低，这个时候可以通过程序控制每台机器读写的比重，达到负载均衡。</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</p>
<p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">备份地址：<span  style="font-family: Simsun; line-height: normal; font-size: medium; "><a href="http://happyenjoylife.iteye.com/admin/blogs/1042538">http://happyenjoylife.iteye.com/admin/blogs/1042538</a></span></p>
<img src ="http://www.blogjava.net/happyenjoylife/aggbug/350177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-05-13 15:31 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/05/13/350177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE下修改hosts不用重启的方法</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342223.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Mon, 03 Jan 2011 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342223.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/342223.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/342223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/342223.html</trackback:ping><description><![CDATA[XP下试过，保存起来怕将来忘了 <br />
<br />
HKeyCurrentUser"SOFTWARE"Microsoft"Windows"CurrentVersion"Internet Settings <br />
增加：<br />
DnsCacheEnabled&nbsp; 0x0 (REG_DWORD) <br />
DnsCacheTimeout 0x0 (REG_DWORD) <br />
ServerInfoTimeOut 0x0 (REG_DWORD)
<img src ="http://www.blogjava.net/happyenjoylife/aggbug/342223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-01-03 20:21 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu10.04下build OpenJDK7 的过程</title><link>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342218.html</link><dc:creator>happyenjoylife</dc:creator><author>happyenjoylife</author><pubDate>Mon, 03 Jan 2011 11:46:00 GMT</pubDate><guid>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342218.html</guid><wfw:comment>http://www.blogjava.net/happyenjoylife/comments/342218.html</wfw:comment><comments>http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyenjoylife/comments/commentRss/342218.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyenjoylife/services/trackbacks/342218.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>mercurial</p>
<p style="margin-left: 18pt; text-indent: 0cm;">Mercurial<span style="font-family: 宋体;">是一个版本管理工具。</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;">sudo apt-get install mercurial</p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">安装</span>mercurial<span style="font-family: 宋体;">的扩展，添加</span>fclone<span style="font-family: 宋体;">在支持</span></p>
<p style="text-indent: 18pt;"><span>hg clone
http://bitbucket.org/pmezard/hgforest-crew</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">将以下内容添加到</span>$HOME/.hgrc<span style="font-family: 宋体;">文件中，如果没有则自己创建一个：</span></p>
<p style="margin-left: 10.5pt;">[extensions]</p>
<p style="margin-left: 10.5pt;">forest=/home/daren/hgforest-crew/forest.py</p>
<p style="margin-left: 28.5pt; text-indent: 3pt;">fetch=</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">下载</span>jdk7<span style="font-family: 宋体;">源码</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;">hg fclone <a href="http://hg.openjdk.java.net/jdk7/jdk7">http://hg.openjdk.java.net/jdk7/jdk7</a></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>3.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>gcc<span style="font-family: 宋体;">、</span>g++<span style="font-family: 宋体;">、</span>make<span style="font-family: 宋体;">等</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">sudo apt-get
install build-essential</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>4.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>XRender</p>
<p style="margin-left: 18pt; text-indent: 0cm;">sudo apt-get install libxrender-dev</p>
<p style="margin-left: 18pt; text-indent: 0cm;">sudo apt-get install xorg-dev</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>5.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>alsa</p>
<p style="margin-left: 18pt; text-indent: 0cm;">sudo apt-get install libasound2-dev</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>6.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Cups</p>
<p style="margin-left: 18pt; text-indent: 0cm;">sudo apt-get install libcups2-dev</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>7.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>jdk6</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>8.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>ant</p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">设置</span>ANT_HOME</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>9.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">安装</span>findbugs</p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">编译需要这玩意儿有点奇怪。需要设置</span>FINDBUGS_HOME</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>10.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">测试编译</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;">export LANG=C ALT_BOOTDIR=/opt/jdk1.6.0_22/</p>
<p style="margin-left: 18pt; text-indent: 0cm;">#<span style="font-family: 宋体;">删除</span>JAVA_HOME</p>
<p style="margin-left: 18pt; text-indent: 0cm;">export -n JAVA_HOME</p>
<p style="margin-left: 18pt; text-indent: 0cm;">export ALT_JDK_IMPORT_PATH=/opt/jdk1.6.0_22/</p>
<p style="margin-left: 18pt; text-indent: 0cm;">make sanity BUILD_JAXWS=false BUILD_JAXP =false</p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">在</span>build BUILD_JAXWS<span style="font-family: 宋体;">和</span>BUILD_JAXP<span style="font-family: 宋体;">总是提示找不到源文件，而我又暂时对只对</span>JDK<span style="font-family: 宋体;">、</span>Hotspot<span style="font-family: 宋体;">感兴趣，所以索性把这两个给去掉。</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">如果出现</span>:Sanity check passed.<span style="font-family: 宋体;">则表示测试编译通过了，不过也别开心得太早，真正</span>make<span style="font-family: 宋体;">的时候不保证一定没问题，也许还会缺少某些依赖。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>11.<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">编译</span></p>
<p style="text-indent: 18pt;"><span>export LANG=C
ALT_BOOTDIR=/opt/jdk1.6.0_22/</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;">#<span style="font-family: 宋体;">删除</span>JAVA_HOME</p>
<p style="text-indent: 18pt;"><span>export -n
JAVA_HOME</span></p>
<p style="text-indent: 18pt;"><span>export
ALT_JDK_IMPORT_PATH=/opt/jdk1.6.0_22/</span></p>
<p style="text-indent: 18pt;"><span>#make
BUILD_JAXWS=false BUILD_JAXP=false</span></p>
<p style="text-indent: 18pt;"><span>#make
DEBUG_NAME=fastdebug BUILD_JAXWS=false BUILD_JAXP=false</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span>make DEBUG_NAME=all_fastdebug BUILD_JAXWS=false
BUILD_JAXP=false</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">如果一切正常的话在</span>$HOME/jdk7/build/linux-i586/<span style="font-family: 宋体;">下就有</span>build<span style="font-family: 宋体;">出来的</span>jdk<span style="font-family: 宋体;">等了。</span></p>
<img src ="http://www.blogjava.net/happyenjoylife/aggbug/342218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyenjoylife/" target="_blank">happyenjoylife</a> 2011-01-03 19:46 <a href="http://www.blogjava.net/happyenjoylife/archive/2011/01/03/342218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>