﻿<?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-csusky</title><link>http://www.blogjava.net/csusky/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 10:49:10 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 10:49:10 GMT</pubDate><ttl>60</ttl><item><title>异步IO的关闭事件</title><link>http://www.blogjava.net/csusky/archive/2009/11/10/301900.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 10 Nov 2009 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2009/11/10/301900.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/301900.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2009/11/10/301900.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/301900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/301900.html</trackback:ping><description><![CDATA[<p>JAVA SOCKET只定义了四种事件<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><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">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OP_READ&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OP_WRITE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OP_CONNECT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OP_ACCEPT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">;</span></div>
<br />
是没有关闭事件的，我们怎么判断一个连接是否关闭呢？<br />
如果你的selector注册了一个OP_READ事件，那么在连接关闭的时候将会产生一个OP_READ事件<br />
也就是说本来阻塞的selector此时将会被唤醒，但是如果试图在此事件的通道中读取数据将会返回-1<br />
如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">SelectionKey</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;readyKeys&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;selector.selectedKeys();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;readyKeys.iterator()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />SelectionKey&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(SelectionKey)i.next();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(operation&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;SelectionKey.OP_READ&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  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;key.isReadable())<br />
<img id="Codehighlighter1_226_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_226_377_Open_Text.style.display='none'; Codehighlighter1_226_377_Closed_Image.style.display='inline'; Codehighlighter1_226_377_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_226_377_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_226_377_Closed_Text.style.display='none'; Codehighlighter1_226_377_Open_Image.style.display='inline'; Codehighlighter1_226_377_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_226_377_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_226_377_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadableByteChannel&nbsp;incomingChannel&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(ReadableByteChannel)key.channel();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">此时将会得到-1，表明该链接已关闭</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;incomingChannel.read(readBuffer);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
此时我们需要取消该KEY 如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_25_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_133_Open_Text.style.display='none'; Codehighlighter1_25_133_Closed_Image.style.display='inline'; Codehighlighter1_25_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_25_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_133_Closed_Text.style.display='none'; Codehighlighter1_25_133_Open_Image.style.display='inline'; Codehighlighter1_25_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_25_133_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_25_133_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key.cancel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭输入输出&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sc.socket().shutdownOutput();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sc.socket().shutdownInput();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭SOCKET<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sc.socket().close();<br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关闭通道<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; incomingChannel.close();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<img src ="http://www.blogjava.net/csusky/aggbug/301900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2009-11-10 22:28 <a href="http://www.blogjava.net/csusky/archive/2009/11/10/301900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ExecutorFilter</title><link>http://www.blogjava.net/csusky/archive/2008/12/12/245891.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 12 Dec 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/12/12/245891.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/245891.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/12/12/245891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/245891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/245891.html</trackback:ping><description><![CDATA[1 . 用Executors构造一个新的线程池<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ExecutorService&nbsp;executor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Executors.newCachedThreadPool();</span></div>
<br />
方法 newCachedThreadPool(); <br />
创建一个可根据需要创建新线程的线程池，但是在以前构造的线程可用时将重用它们，并在需要时使用提供的 ThreadFactory 创建新线程。 <br />
2. 用构造的线程池创建ExecutorFilter<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ExecutorFilter&nbsp;es</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ExecutorFilter(executor));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
在ExecutorFilter内部:<br />
只需要将相应的事件分发到到线程池的相应线程即可，但是SessionCreated事件只能在主线程中，不能分发<br />
触发方法<br />
1 .<br />
首先构造一个IoFilterEvent，这个IoFilterEvent包含1、事件的类型，2、下一个过滤器<br />
然后触发该时间的处理方法。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_54_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_181_Open_Text.style.display='none'; Codehighlighter1_54_181_Closed_Image.style.display='inline'; Codehighlighter1_54_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_181_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_181_Closed_Text.style.display='none'; Codehighlighter1_54_181_Open_Image.style.display='inline'; Codehighlighter1_54_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(eventTypes.contains(IoEventType.SESSION_OPENED))&nbsp;</span><span id="Codehighlighter1_54_181_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_181_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireEvent(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IoFilterEvent(nextFilter,&nbsp;IoEventType.SESSION_OPENED,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
2 .<br />
从线程池中取出一个线程执行事件处理<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_46_90_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_90_Open_Text.style.display='none'; Codehighlighter1_46_90_Closed_Image.style.display='inline'; Codehighlighter1_46_90_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_46_90_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_90_Closed_Text.style.display='none'; Codehighlighter1_46_90_Open_Image.style.display='inline'; Codehighlighter1_46_90_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;fireEvent(IoFilterEvent&nbsp;event)&nbsp;</span><span id="Codehighlighter1_46_90_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_90_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getExecutor().execute(event);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<br />
在构造ExecutorFilter 时如果没有传入IoEventType则默认只对如下几种几件感兴趣<br />
EXCEPTION_CAUGHT<br />
MESSAGE_RECEIVED<br />
MESSAGE_SENT<br />
SESSION_CLOSED<br />
SESSION_IDLE<br />
SESSION_OPENED<br />
当然还需要覆盖相应的事件处理方法 如上所示
<img src ="http://www.blogjava.net/csusky/aggbug/245891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-12-12 11:33 <a href="http://www.blogjava.net/csusky/archive/2008/12/12/245891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE的块大小</title><link>http://www.blogjava.net/csusky/archive/2008/11/25/242570.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 25 Nov 2008 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/11/25/242570.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/242570.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/11/25/242570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/242570.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/242570.html</trackback:ping><description><![CDATA[<p>参数db_block_size；<br />
这个参数只能设置成底层操作系统物理块大小的整数倍，最好是2的n次方倍。<br />
如WINDOWS下4KB，8KB,16KB<br />
且该参数需要在建库的时候指定，一旦指定不能更改。<br />
虽然在ORACLE9I以上可以指定表空间的数据库大小，允许同时使用包括非默认大小在内的数据库块大小。不过需要设置指定大小数据块的buffer_cache.<br />
</p>
<p>小的块：<br />
小的块降低块竞争，因为每个块中的行较少.<br />
小的块对于小的行有益.<br />
小的块对于随意的访问较好.如果一个块不太可能在读入内存后被修改，那么块的大小越小使用buffer cache越有效率。当内存资源很珍贵时尤为重要，因为数据库的buffer cache是被限制大小的。<br />
劣势：<br />
小块的管理消费相对大.<br />
因为行的大小你可能只在块中存储很小数目的行，这可能导致额外的I/O。<br />
小块可能导致更多的索引块被读取</p>
<p>大的块<br />
好处：<br />
更少的管理消费和更多存储数据的空间.<br />
大块对于有顺序的读取较好.&nbsp; 譬如说全表扫描<br />
大块对很大的行较好<br />
大块改进了索引读取的性能.大的块可以在一个块中容纳更多的索引条目,降低了大的索引级的数量.越少的index level意味着在遍历索引分支的时候越少的I/O。<br />
劣势：<br />
大块不适合在OLTP中用作索引块,因为它们增加了在索引叶块上的块竞争。<br />
如果你是随意的访问小的行并有大的块，buffer cache就被浪费了。例如，8 KB的block size 和50 byte row size,你浪费了7,950 </p>
<p><br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/csusky/aggbug/242570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-11-25 15:45 <a href="http://www.blogjava.net/csusky/archive/2008/11/25/242570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIPS</title><link>http://www.blogjava.net/csusky/archive/2008/11/10/239696.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Mon, 10 Nov 2008 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/11/10/239696.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/239696.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/11/10/239696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/239696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/239696.html</trackback:ping><description><![CDATA[<p>将进酒&nbsp; 杯莫停&nbsp; -------&gt; 亭名：&nbsp; 悲默亭<br />
<br />
全球通史<br />
<br />
《诗经&#183;采薇》<br />
<br />
<strong>昔我往矣,杨柳依依 今我来思,雨雪霏霏</strong></p>
<img src ="http://www.blogjava.net/csusky/aggbug/239696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-11-10 16:31 <a href="http://www.blogjava.net/csusky/archive/2008/11/10/239696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING整合IBMMQ实现全局事物</title><link>http://www.blogjava.net/csusky/archive/2008/10/27/236912.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Mon, 27 Oct 2008 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/10/27/236912.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/236912.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/10/27/236912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/236912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/236912.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&lt;beans&nbsp;xmlns="http://www.springframework.org/schema/beans"&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance...&nbsp;&nbsp;<a href='http://www.blogjava.net/csusky/archive/2008/10/27/236912.html'>阅读全文</a><img src ="http://www.blogjava.net/csusky/aggbug/236912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-10-27 17:01 <a href="http://www.blogjava.net/csusky/archive/2008/10/27/236912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene的切词 analysis包</title><link>http://www.blogjava.net/csusky/archive/2008/05/30/204087.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 30 May 2008 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/05/30/204087.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/204087.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/05/30/204087.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/204087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/204087.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt">在搜索引擎中，切词语是一个重要的部分，其中包括专有名词的提取、词的分割、词的格式化等等。<br />
TokenStream 类几乎是所有这些类的基类<br />
有两个需要被子类实现的方法Token next()&nbsp;和&nbsp;close()<br />
首先来看analysis包，这个包主要是提供一些简单的词汇化处理<br />
以<span style="color: #339966">Tokenizer结尾的类</span>是将要处理的字符串进行分割成Token流，而根据分割的依据的又产生了以下几个Tokenizer类<br />
首先Tokenizer类是所有<span style="color: #000000"><span style="color: #008080">以Tokenizer结尾的类</span>的基<span style="color: #000000">类<br />
然后是CharTokenizer，所有的以<span style="color: #339966">Tokenizer结尾的类都是从这个类继承的<br />
<span style="color: #000000">这个类中有一个抽象方法<br />
<span style="color: #ff0000">&nbsp; protected abstract boolean isTokenChar(char c);</span><br />
另外一个需要被子类覆写的方法<br />
&nbsp;<span style="color: #ff0000">&nbsp;protected char normalize(char c) {}；</span><br />
是对单个字符进行处理的方法譬如说将英文字母全部转化为小写<br />
<br />
还有一个变量<br />
<span style="color: #ff0000">protected Reader input;<br />
</span><span style="color: #0000ff">这个读取器是这些类所处理的数据的&nbsp;&nbsp; 数据源<br />
输入一个Reader ，产生一个Token流</span><br />
<br />
这个方法是是否进行切分的依据，依次读取char流，然后用这个方法对每个char进行检测，如果返回false则将预先存储在<br />
词汇缓冲区中的char数组作为一个Token返回<br />
<span style="color: #ff0000">LetterTokenizer ：</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff99cc">&nbsp;<span style="color: #333399">&nbsp;protected boolean isTokenChar(char c) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Character.isLetter(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
</span></span><span style="color: #ff0000">WhitespaceTokenizer：</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #333399">&nbsp;protected boolean isTokenChar(char c) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return !Character.isWhitespace(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}&nbsp;<br />
</span><span style="color: #ff0000">LowerCaseTokenizer extends LetterTokenizer：</span><br />
<span style="color: #333399">protected char normalize(char c) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Character.toLowerCase(c);<br />
&nbsp;&nbsp; }</span><br />
&nbsp;&nbsp;&nbsp;在构造函数中调用super(in);进行和&nbsp;LetterTokenizer同样的操作，但是在词汇化之前所有的词都转化为小写了<br />
&nbsp;<br />
然后是以Filter结尾的类，这个类簇主要是对已经词汇化的Token流进行进一步的处理<br />
&nbsp;输入是Token流 , 输出仍然是Token流。<br />
TokenFilter extends TokenStream&nbsp; 是所有这些类的父类<br />
protected TokenStream input;<br />
在TokenFilter 中有一个TokenStream 变量，是Filter类簇处理的数据源，而Filter类簇又是继承了TokenStream 类的<br />
有一个public final Token next()方法,这个方法以TokenStream.next()产生的Token流 为处理源，产生的仍然是Token流<br />
只不过中间有一些处理的过程<br />
<span style="color: #ff0000">LowerCaseFilter：将所有的Token流的转化为小写<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #333399">&nbsp;t.termText = t.termText.toLowerCase();</span><br />
<span style="color: #ff0000">StopFilter：过滤掉一些停止词，这些停止词由构造函数指定</span><br />
&nbsp;<span style="color: #333399">&nbsp;&nbsp;&nbsp; for (Token token = input.next(); token != null; token = input.next())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!stopWords.contains(token.termText))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return token;<br />
</span><br />
<br />
<span style="color: #800080">比较一下Tokenizer类簇和Filter类簇，可以知道<br />
Tokenizer类簇主要是对输入的Reader流，实际上是字符流按照一定的规则进行分割，产生出Token流<br />
其输入是字符串的Reader流形式，输出是Token流<br />
<br />
Filter类簇主要是对输入的Token流进行更进一步的处理，如去除停止词，转化为小写<br />
主要为一些格式化操作。<br />
由于Filter类簇的输入输出相同，所以可以嵌套几个不同的Filter类，以达到预期的处理目的。<br />
前一个Filter类的输出作为后一个Filter类的输入<br />
而Tokenizer类簇由于输入输出不同，所以不能嵌套<br />
<br />
<br />
</span><br />
<br />
<br />
<br />
<br />
</span></span></span></span></p>
<img src ="http://www.blogjava.net/csusky/aggbug/204087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-05-30 14:47 <a href="http://www.blogjava.net/csusky/archive/2008/05/30/204087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5的自动装箱功能</title><link>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 16 May 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/200842.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/200842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/200842.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">在JAVA JDK1.5以后具有的自动装箱与拆箱的功能，所谓的自动装箱<br clear="all" />
与拆箱也就是把基本的数据类型自动的转为封装类型。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">如：自动装箱，它可以直接把基本类型赋值给封装类型</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer num = 10 ;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Double d = 2d ;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">自动拆箱，它可以把封装类型赋值给基本类型</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">int num = new Integer(10);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">double d = new Double(2d);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">自动装箱与拆箱的功能事实上是编译器来帮您的忙，编译器在编译时期依您所编写的语法，决定是否进行装箱或拆箱动作。在自动装箱时对于值从-128到127之间的值，它们被装箱为Integer对象后，会存在内存中被重用，所以范例4.6中使用==进行比较时，i1 与 i2实际上参考至同一个对象。如果超过了从-128到127之间的值，被装箱后的Integer对象并不会被重用，即相当于每次装箱时都新建一个Integer对象，所以范例4.7使用==进行比较时，i1与i2参考的是不同的对象。所以不要过分依赖自动装箱与拆箱，您还是必须知道基本数据类型与对象的差异。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">public void testBoxingUnboxing() {</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 10;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer inta = i;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inta++;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inta += 1;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = inta;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(j == inta);</span><span style="color: blue">结果是：</span><span style="color: blue">true</span><span style="color: red">//junit</span><span style="color: red">里面的方法</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(j == new Integer(j)); </span><span style="color: blue">结果是：</span><span style="color: blue">true</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(10000 == new Integer(10000)); </span><span style="color: blue">结果是：</span><span style="color: blue">true</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = 100.相当于编译器自动为您作以下的语法编译：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = new Integer(100).所以自动装箱与拆箱的功能是所谓的&#8220;编译器蜜糖&#8221;(Compiler Sugar)，虽然使用这个功能很方便，但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = null.int j = i.这样的语法在编译时期是合法的，但是在运行时期会有错误，因为这种写法相当于：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = null.int j = i.intValue().null表示i没有参考至任何的对象实体，它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象，所以也就不可能操作intValue()方法，这样上面的写法在运行时会出现NullPointerException错误。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">自动装箱、拆箱的功能提供了方便性，但隐藏了一些细节，所以必须小心。再来看范例4.6，您认为结果是什么呢？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">&#220;. </span><span style="color: red">范例</span><span style="color: red">4.6 AutoBoxDemo2.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo2 { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public static void main(String[] args) { <br />
Integer i1 = 100;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 100; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1 == i2) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2");</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"). </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">从自动装箱与拆箱的机制来看，可能会觉得结果是显示i1 == i2，您是对的。那么范例4.7的这个程序，您觉得结果是什么？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">&#220;. </span><span style="color: #ff6600">范例</span><span style="color: #ff6600">4.7 AutoBoxDemo3.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo3 { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public static void main(String[] args) { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i1 = 200;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1 == i2) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2");</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><strong><span style="color: red">结果是显示</span><span style="color: red">i1 != i2</span></strong><strong><span style="color: red">，</span></strong>这有些令人惊讶，两个范例语法完全一样，只不过改个数值而已，结果却相反。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">其实这与==运算符的比较有关，在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等，事实上==也用于判断两个对象引用名称是否参考至同一个对象。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">在自动装箱时对于值从</span><span style="color: #ff6600">&#8211;128</span><span style="color: #ff6600">到</span><span style="color: #ff6600">127</span><span style="color: #ff6600">之间的值，它们被装箱为</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象后，会存在内存中被重用，所以范例</span><span style="color: #ff6600">4.6</span><span style="color: #ff6600">中使用</span><span style="color: #ff6600">==</span><span style="color: #ff6600">进行比较时，</span><span style="color: #ff6600">i1 </span><span style="color: #ff6600">与</span><span style="color: #ff6600"> i2</span><span style="color: #ff6600">实际上参考至同一个对象。如果超过了从</span><span style="color: #ff6600">&#8211;128</span><span style="color: #ff6600">到</span><span style="color: #ff6600">127</span><span style="color: #ff6600">之间的值，被装箱后的</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象并不会被重用，即相当于每次装箱时都新建一个</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象，所以范例</span><span style="color: #ff6600">4.7</span><span style="color: #ff6600">使用</span><span style="color: #ff6600">==</span><span style="color: #ff6600">进行比较时，</span><span style="color: #ff6600">i1</span><span style="color: #ff6600">与</span><span style="color: #ff6600">i2</span><span style="color: #ff6600">参考的是不同的对象。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">所以不要过分依赖自动装箱与拆箱，您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写，而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">&#220;. </span><span style="color: red">范例</span><span style="color: red">4.8 AutoBoxDemo4.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo4 { <br />
public static void main(String[] args) { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i1 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1.equals(i2)) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><strong>结果这次是显示<span style="color: red">i1 == i2</span></strong><strong>。</strong>使用这样的写法，相信也会比较放心一些，对于这些方便但隐藏细节的功能到底要不要用呢？基本上只有一个原则：如果您不确定就不要用。</span></p>
<img src ="http://www.blogjava.net/csusky/aggbug/200842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-05-16 11:33 <a href="http://www.blogjava.net/csusky/archive/2008/05/16/200842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于IndexWriter中的3个性能参数</title><link>http://www.blogjava.net/csusky/archive/2008/05/15/200706.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Thu, 15 May 2008 11:27:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/05/15/200706.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/200706.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/05/15/200706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/200706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/200706.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">在<font size="2">IndexWriter</font>中有3个重要的性能参数<br />
mergeFactor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认为10<br />
minMergeDocs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认为10<br />
maxMergeDocs&nbsp;&nbsp;&nbsp;&nbsp; 默认为Integer.maxValue<br />
<br />
maxMergeDocs&nbsp;&nbsp;&nbsp;&nbsp; 一个段中所能包含的最大的doc数，达到这个数目即不再将段进行合并 一般不改变这个值<br />
minMergeDocs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是指在RAMDirectory中保存的Doc的个数，达到minMergeDocs&nbsp;个即要合并到硬盘上去（在硬盘上新建一个段）<br />
mergeFactor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 合并因子，是控制硬盘上的段的合并的，每次在硬盘上新建一个段之后即执行<br />
&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; <font size="2">targetMergeDocs</font>*=mergeFactor（一开始<font size="2">targetMergeDocs</font>=minMergeDocs）&nbsp;如果硬盘上的doc数目大于等于<font size="2">&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; targetMergeDocs则将硬盘上最后建立的mergeFactor个段进行合并成一个段<br />
</font><br />
拿默认的参数举例：<br />
如果硬盘上面已经有9个段&nbsp; 每个段分别存储了10个Document,共（90个DOC），这时候如果程序再向硬盘合并一个新的段（含10个DOC），合并完之后<font size="2">targetMergeDocs</font>=10*10&nbsp; 程序检查已经合并的最后（按照创建的时间先后顺序）mergeFactor个段的document的总和100是否大于等于<font size="2">targetMergeDocs（这里是100，刚好满足要求）</font>于是程序又将硬盘上面的后10个段合并为一个新的段。<br />
<br />
另外一个例子：<br />
doc数目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 段数目<br />
&nbsp; 1000---------------9个<br />
&nbsp; 100-----------------9个<br />
&nbsp; 10&nbsp;&nbsp; ----------------9个<br />
这时如果再象硬盘中新建一个新的包含了10个doc的段<br />
&nbsp;&nbsp;&nbsp; doc数目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 段数目<br />
&nbsp; (1) 1000----------------9个<br />
<br />
&nbsp; (2)&nbsp; 100-----------------9个<br />
<br />
&nbsp; (3)&nbsp;&nbsp; 10&nbsp;&nbsp;----------------9个<br />
&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; <br />
&nbsp; (4)&nbsp;&nbsp;&nbsp; 10&nbsp;----------------1个<br />
这时候(3)(4)首先合并成一个新的段(3-4)包含100个doc<br />
&nbsp;然后(2)(3-4)和并成一个新段（2-3-4）包含1000个doc<br />
然后(1)(2-3-4)合并成一个新的段&nbsp; 包含10000个doc<br />
最后合并成一个段 <br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_59_793_Open_Image" onclick="this.style.display='none'; Codehighlighter1_59_793_Open_Text.style.display='none'; Codehighlighter1_59_793_Closed_Image.style.display='inline'; Codehighlighter1_59_793_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_59_793_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_59_793_Closed_Text.style.display='none'; Codehighlighter1_59_793_Open_Image.style.display='inline'; Codehighlighter1_59_793_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;maybeMergeSegments()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_59_793_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_59_793_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;targetMergeDocs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;minMergeDocs;<br />
<img id="Codehighlighter1_146_789_Open_Image" onclick="this.style.display='none'; Codehighlighter1_146_789_Open_Text.style.display='none'; Codehighlighter1_146_789_Closed_Image.style.display='inline'; Codehighlighter1_146_789_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_146_789_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_146_789_Closed_Text.style.display='none'; Codehighlighter1_146_789_Open_Image.style.display='inline'; Codehighlighter1_146_789_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(targetMergeDocs&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;maxMergeDocs)&nbsp;</span><span id="Codehighlighter1_146_789_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_146_789_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;find&nbsp;segments&nbsp;smaller&nbsp;than&nbsp;current&nbsp;target&nbsp;size</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;minSegment&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;segmentInfos.size();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mergeDocs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_305_464_Open_Image" onclick="this.style.display='none'; Codehighlighter1_305_464_Open_Text.style.display='none'; Codehighlighter1_305_464_Closed_Image.style.display='inline'; Codehighlighter1_305_464_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_305_464_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_305_464_Closed_Text.style.display='none'; Codehighlighter1_305_464_Open_Image.style.display='inline'; Codehighlighter1_305_464_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">--</span><span style="color: #000000">minSegment&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_305_464_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_305_464_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SegmentInfo&nbsp;si&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;segmentInfos.info(minSegment);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(si.docCount&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;targetMergeDocs)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mergeDocs&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;si.docCount;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(mergeDocs&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;targetMergeDocs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;found&nbsp;a&nbsp;merge&nbsp;to&nbsp;do</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mergeSegments(minSegment</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetMergeDocs&nbsp;</span><span style="color: #000000">*=</span><span style="color: #000000">&nbsp;mergeFactor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;increase&nbsp;target&nbsp;size</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">-&nbsp;--&nbsp;-&nbsp;-targetMergeDocs:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">targetMergeDocs);<br />
<img id="Codehighlighter1_740_760_Open_Image" onclick="this.style.display='none'; Codehighlighter1_740_760_Open_Text.style.display='none'; Codehighlighter1_740_760_Closed_Image.style.display='inline'; Codehighlighter1_740_760_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_740_760_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_740_760_Closed_Text.style.display='none'; Codehighlighter1_740_760_Open_Image.style.display='inline'; Codehighlighter1_740_760_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_740_760_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_740_760_Open_Text"><span style="color: #000000">{Thread.sleep(</span><span style="color: #000000">5000</span><span style="color: #000000">);}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_781_782_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_781_782_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span></div>
</span>
<img src ="http://www.blogjava.net/csusky/aggbug/200706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-05-15 19:27 <a href="http://www.blogjava.net/csusky/archive/2008/05/15/200706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HIBERNATE的一对多和多对一关联</title><link>http://www.blogjava.net/csusky/archive/2008/05/14/200363.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Wed, 14 May 2008 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/05/14/200363.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/200363.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/05/14/200363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/200363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/200363.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt">HIBERNATE一多对关联中&nbsp; 要求在持久化类中定义集合类属性时，必须把属性声明为接口，因为HIBERNATE在调用持久化类的SET/GET方法时传递的是HIBERNATE自己定义的集合类。<br />
在定义集合时，一般先初始化为集合实现类的一个实例 ： private Set orders=new HashSet()，这样可以避免访问空集合出现NullPointerException.</p>
<img src ="http://www.blogjava.net/csusky/aggbug/200363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-05-14 11:01 <a href="http://www.blogjava.net/csusky/archive/2008/05/14/200363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene索引文件的格式</title><link>http://www.blogjava.net/csusky/archive/2008/04/21/194564.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Mon, 21 Apr 2008 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/04/21/194564.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/194564.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/04/21/194564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/194564.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/194564.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="color: #ccffcc"><span style="color: #ccffcc"><span style="color: #99ccff"><span style="color: #3366ff">segments文件的格式： （段的信息）<br />
int:&nbsp; =-1&nbsp;&nbsp;&nbsp; 查看文件是否是Lucene合法的文件格式<br />
long:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 版本号，每更新一次该文件将会将版本号加1<br />
int:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来命名新段<br />
int:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 段的数目<br />
String + int 段的信息 String是段的名称&nbsp; int是段中所含的doc数目<br />
String + int 同上</span></span></span></span></span></p>
<p><br />
<span style="font-size: 10pt"><span style="color: #99cc00"><span style="color: #ccffcc"><span style="color: #ccffcc"><span style="color: #99ccff"><span style="color: #3366ff">.fnm的文件格式：&nbsp;&nbsp; （Field的信息）<br />
int:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field的个数，最少为1，最少有一个Field("",false)，在初始化的时候写入(暂时不知道原因); 名称为空字符串，未索引，&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; 量化。readVInt()读取<br />
String: byte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String是&nbsp;Field的名称&nbsp; byte指示该Field&nbsp;是否被索引，是否向量化 （值有：11，10，01）第一个1代表被索引，第二个代表被向量化<br />
String: byte Field 同上</span></span></span></span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><span style="color: #3366ff">&nbsp;<br />
</span></p>
<p><span style="font-size: 10pt"><span style="color: #3366ff">.fdx的文件格式：主要是提供对.fdt中存储的document的随即读取<br />
long :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一个document在.fdt文件中的位置<br />
long:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二个document在.fdt文件中的位置</span></span><span style="color: #3366ff">
<p><span style="color: #3366ff"><br />
</span></p>
</span></p>
<p><span style="font-size: 10pt"><span style="color: #3366ff">.fdt的文件格式：&nbsp; .fdt文件存储了一系列document的信息<br />
VInt:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该document中的isStored属性为true的域的个数<br />
(VInt:)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果该field的isStored属性为true则得到该field的fieldNumber，暂时不知道这个fieldNumber是怎么产生的，有什么用，初步估计是按照field创建的顺序产生的，每次再上一个field的fieldNumber基础上加1。<br />
byte:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果该field的isTokenized属性为true写入1否则写入false。<br />
String:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该field的stringValue()值。<br />
一个document结束，下面的数据将会开始一个新的document，每个新的document的开始点的文件位置都会在.fdx中有记载，便于随即访问</span></span></p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/csusky/aggbug/194564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-04-21 17:52 <a href="http://www.blogjava.net/csusky/archive/2008/04/21/194564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>