﻿<?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-相互学习、共同进步</title><link>http://www.blogjava.net/sunjavaer/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 15 Apr 2026 09:23:25 GMT</lastBuildDate><pubDate>Wed, 15 Apr 2026 09:23:25 GMT</pubDate><ttl>60</ttl><item><title>CyclicBarrier 简单举例</title><link>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432663.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Thu, 13 Jul 2017 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432663.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/432663.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/432663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/432663.html</trackback:ping><description><![CDATA[一句话解释：预备~~~开始<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.BrokenBarrierException;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.CyclicBarrier;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CyclicBarrierLearn&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Logger&nbsp;log&nbsp;=&nbsp;LoggerFactory.getLogger(CyclicBarrierLearn.<span style="color: #0000FF; ">class</span>);<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Work&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Thread&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;CyclicBarrier&nbsp;cyclicBarrier;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Work(String&nbsp;name,&nbsp;CyclicBarrier&nbsp;cyclicBarrier)&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cyclicBarrier&nbsp;=&nbsp;cyclicBarrier;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("thread&nbsp;name:&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;"&nbsp;waiting&nbsp;work");<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyclicBarrier.await();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("thread&nbsp;name:&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;"&nbsp;working");<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(BrokenBarrierException&nbsp;e)&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;cyclicBarrier()&nbsp;{<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CyclicBarrier&nbsp;cyclicBarrier&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CyclicBarrier(50,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Runnable()&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("let's&nbsp;begin&nbsp;work");<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;cyclicBarrier.getParties();&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Work&nbsp;work&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Work(String.valueOf(i),&nbsp;cyclicBarrier);<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work.start();<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CyclicBarrierLearn&nbsp;cyclicBarrierLearn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CyclicBarrierLearn();<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyclicBarrierLearn.cyclicBarrier();<br /><span style="color: #008080; ">55</span>&nbsp;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;</div><img src ="http://www.blogjava.net/sunjavaer/aggbug/432663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2017-07-13 11:39 <a href="http://www.blogjava.net/sunjavaer/archive/2017/07/13/432663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CountDownLatch 简单举例</title><link>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432662.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Thu, 13 Jul 2017 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432662.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/432662.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2017/07/13/432662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/432662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/432662.html</trackback:ping><description><![CDATA[一句话解释：主线程阻塞，其他线程完成后，主线程被唤醒后继续执行<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.Random;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.CountDownLatch;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CountDownLatchLearn&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Logger&nbsp;log&nbsp;=&nbsp;LoggerFactory.getLogger(CountDownLatchLearn.<span style="color: #0000FF; ">class</span>);<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;CountDownLatch&nbsp;countDownLatch;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CountDownLatchLearn()&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countDownLatch&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CountDownLatch(50);<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;countDown()&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;count&nbsp;=&nbsp;countDownLatch.getCount();<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("countDownLatch&nbsp;count&nbsp;is:"&nbsp;+&nbsp;count.toString());<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;count;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Work&nbsp;work&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Work(String.valueOf(i),&nbsp;countDownLatch);<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work.start();<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countDownLatch.await();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("work&nbsp;finish!!!");<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Work&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Thread&nbsp;{<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;CountDownLatch&nbsp;countDownLatch;<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Work(String&nbsp;name,&nbsp;CountDownLatch&nbsp;countDownLatch)&nbsp;{<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.countDownLatch&nbsp;=&nbsp;countDownLatch;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random&nbsp;r&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Random();<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sleep&nbsp;=&nbsp;r.nextInt(2000);<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("thread&nbsp;sleep:&nbsp;"+&nbsp;sleep);<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(sleep);<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug("thread:&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;":&nbsp;do&nbsp;work");<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countDownLatch.countDown();<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("main&nbsp;start!!!");<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountDownLatchLearn&nbsp;countDownLatchLearn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CountDownLatchLearn();<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countDownLatchLearn.countDown();<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("main&nbsp;end!!!");<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;<br /><span style="color: #008080; ">66</span>&nbsp;}</div><img src ="http://www.blogjava.net/sunjavaer/aggbug/432662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2017-07-13 11:18 <a href="http://www.blogjava.net/sunjavaer/archive/2017/07/13/432662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 5.7 for windows安装过程</title><link>http://www.blogjava.net/sunjavaer/archive/2017/07/10/432652.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Sun, 09 Jul 2017 16:53:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2017/07/10/432652.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/432652.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2017/07/10/432652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/432652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/432652.html</trackback:ping><description><![CDATA[<p><span style="font-family:宋体;">环境说明：</span></p>  <p>OS<span style="font-family:宋体;">：</span>windows 7 64bit Database<span style="font-family:宋体;">：</span>mysql-5.7.18-winx64 Noinstall<span style="font-family:宋体;">版本</span></p>  <p>&nbsp;</p>  <p>1. <span style="font-family:宋体;">解压</span>Mysql<span style="font-family:宋体;">安装目录</span></p>  <p>2. <span style="font-family:宋体;">编写</span>my.ini<span style="font-family:宋体;">配置文件</span></p>  <p>3. mysqld --defaults-file=../my.ini --initialize</p>  <p>4. ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';</p>  <p>5. mysql &#8211;u root &#8211;p</p>  <p>6. <span style="font-family:宋体;">密码在</span>logs/*.err<span style="font-family:宋体;">日志中<br /></span></p>  <p>&nbsp;<br />my.ini文件内容</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;# my.ini文件内容<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#&nbsp;<span style="color: #0000FF; ">For</span>&nbsp;advice&nbsp;<span style="color: #0000FF; ">on</span>&nbsp;how&nbsp;<span style="color: #0000FF; ">to</span>&nbsp;change&nbsp;settings&nbsp;please&nbsp;see<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#&nbsp;http:<span style="color: #808080; ">//</span>dev.mysql.com<span style="color: #808080; ">/</span>doc<span style="color: #808080; ">/</span>refman<span style="color: #808080; ">/</span><span style="color: #800000; font-weight: bold; ">5.7</span><span style="color: #808080; ">/</span>en<span style="color: #808080; ">/</span>server<span style="color: #808080; ">-</span>configuration<span style="color: #808080; ">-</span>defaults.html<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#&nbsp;<span style="color: #808080; ">***</span>&nbsp;DO&nbsp;<span style="color: #808080; ">NOT</span>&nbsp;EDIT&nbsp;THIS&nbsp;<span style="color: #0000FF; ">FILE</span>.&nbsp;It<span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">s&nbsp;a&nbsp;template&nbsp;which&nbsp;will&nbsp;be&nbsp;copied&nbsp;to&nbsp;the<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;***&nbsp;default&nbsp;location&nbsp;during&nbsp;install,&nbsp;and&nbsp;will&nbsp;be&nbsp;replaced&nbsp;if&nbsp;you<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;***&nbsp;upgrade&nbsp;to&nbsp;a&nbsp;newer&nbsp;version&nbsp;of&nbsp;MySQL.<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #FF0000; ">[mysqld]<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;Remove&nbsp;leading&nbsp;#&nbsp;and&nbsp;set&nbsp;to&nbsp;the&nbsp;amount&nbsp;of&nbsp;RAM&nbsp;for&nbsp;the&nbsp;most&nbsp;important&nbsp;data<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;cache&nbsp;in&nbsp;MySQL.&nbsp;Start&nbsp;at&nbsp;70%&nbsp;of&nbsp;total&nbsp;RAM&nbsp;for&nbsp;dedicated&nbsp;server,&nbsp;else&nbsp;10%.<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;innodb_buffer_pool_size&nbsp;=&nbsp;128M<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;Remove&nbsp;leading&nbsp;#&nbsp;to&nbsp;turn&nbsp;on&nbsp;a&nbsp;very&nbsp;important&nbsp;data&nbsp;integrity&nbsp;option:&nbsp;logging<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;changes&nbsp;to&nbsp;the&nbsp;binary&nbsp;log&nbsp;between&nbsp;backups.<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;log_bin<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;These&nbsp;are&nbsp;commonly&nbsp;set,&nbsp;remove&nbsp;the&nbsp;#&nbsp;and&nbsp;set&nbsp;as&nbsp;required.<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #FF0000; ">basedir=D:\\mysql-5.7.18-winx64<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #FF0000; ">datadir=D:\\mysql-5.7.18-winx64\\data<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;port&nbsp;=&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;server_id&nbsp;=&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;Remove&nbsp;leading&nbsp;#&nbsp;to&nbsp;set&nbsp;options&nbsp;mainly&nbsp;useful&nbsp;for&nbsp;reporting&nbsp;servers.<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;The&nbsp;server&nbsp;defaults&nbsp;are&nbsp;faster&nbsp;for&nbsp;transactions&nbsp;and&nbsp;fast&nbsp;SELECTs.<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;Adjust&nbsp;sizes&nbsp;as&nbsp;needed,&nbsp;experiment&nbsp;to&nbsp;find&nbsp;the&nbsp;optimal&nbsp;values.<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;join_buffer_size&nbsp;=&nbsp;128M<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;sort_buffer_size&nbsp;=&nbsp;2M<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #FF0000; ">#&nbsp;read_rnd_buffer_size&nbsp;=&nbsp;2M&nbsp;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #FF0000; ">sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #FF0000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #FF0000; ">long_query_time=0.1<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #FF0000; ">slow_query_log=on<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #FF0000; ">slow_query_log_file=D:\\mysql-5.7.18-winx64\\logs\\mysqlslow.log<br /></span><span style="color: #008080; ">37</span>&nbsp;</div><img src ="http://www.blogjava.net/sunjavaer/aggbug/432652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2017-07-10 00:53 <a href="http://www.blogjava.net/sunjavaer/archive/2017/07/10/432652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>添加用户【备份】</title><link>http://www.blogjava.net/sunjavaer/archive/2013/05/06/398872.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Mon, 06 May 2013 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2013/05/06/398872.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/398872.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2013/05/06/398872.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/398872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/398872.html</trackback:ping><description><![CDATA[<p><span style="font-size:10pt">useradd -g 501 -s /sbin/nologin builder
</span></p><img src ="http://www.blogjava.net/sunjavaer/aggbug/398872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2013-05-06 17:25 <a href="http://www.blogjava.net/sunjavaer/archive/2013/05/06/398872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ZT]Java虚拟机JVM的调优参数选择</title><link>http://www.blogjava.net/sunjavaer/archive/2009/04/29/268210.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Wed, 29 Apr 2009 11:24:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2009/04/29/268210.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/268210.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2009/04/29/268210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/268210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/268210.html</trackback:ping><description><![CDATA[<p>在任何一个的生产系统上线前，系统性能调优(Tuning)都是很重要的一步。通常，应用系统的软硬件的缺省值都是给开发平台(或小规模系统)设计的，用来跑生产系统几乎都无法发挥出软硬件的最佳性能。有时，系统调优前后的性能会差好几倍。另一方面，由于应用程序的开发人员通常都是针对功能作开发的，因此，开发硬件都是比生产环境要小的机器。例如，生产系统是一台8个<a title="CPU" style="color: #000000;" href="http://product.it168.com/list/b/0217_1.shtml" target="_blank">CPU</a>，64GB<a title="内存" style="color: #000000;" href="http://product.it168.com/list/b/0205_1.shtml" target="_blank">内存</a>的<a title="服务器" style="color: #000000;" href="http://server.it168.com/" target="_blank">服务器</a>，而开发<a title="服务器" style="color: #000000;" href="http://product.it168.com/files/0402search.shtml" target="_blank">服务器</a>可能只有1个CPU和4GB内存。所以，在开发人员中常常不具备做性能方面测试的软硬件环境。另外，有的程序员甚至在开发时都没有考虑到多用户并发的环境，程序中存在单点瓶颈等问题。在做压力测试和调优时，往往就会发现这些关键点。</p>
<p>　　由于应用系统是个软硬件的完整统一体，系统调优往往需要涉及硬件、<a title="网络" style="color: #000000;" href="http://net.it168.com/" target="_blank">网络</a>、<a title="操作系统" style="color: #000000;" href="http://product.it168.com/list/b/0501_1.shtml" target="_blank">操作系统</a>、中间件，应用程序和数据库等方面。在调优的过程中，往往需要发现存在瓶颈的地方(也就是导致系统变慢的部分)，分析原因，从而改进和确定较优的参数。</p>
<p>　　我们在作JVM的调优前，通常先要了解运行的硬件平台，操作系统和中间件，然后针对这些情况配置相应的系统参数，在测试中不断完善参数。由于性能调优需要对系统非常了解，并且需要丰富的经验，因此不是一件容易的事情。这里介绍一些很好的参考资料，就是SPEC.org的网站。这是硬件厂商公布benchmark测试结果的地方，通常硬件厂商会把系统调到最优化才公布结果的，因此很有借鉴意义。常见和JVM有关的benchmark值主要有SPECjAppServer2004和SPECjbb2005。前者是J2EE应用服务器的性能指标，后者是服务器端Java虚拟机的性能指标。给大家介绍这个网站的目的是说大家可以参考硬件厂商给出的JVM配置，在根据自己应用环境的特点，较快的得出较好的参数。例如，这个网页给出了SUN公司T5120服务器+应用服务器9.1
+JDK1.5的SPECjAppServer2004值是8,439.36：</p>
<p>　　http://www.spec.org/jAppServer2004/results/res2007q4/jAppServer2004-20071106-00092.html</p>
<p>　　我们现在要关心的不是Benchmark的值(注：实际上,Sun公司的这个值是个很不错的结果)，而是留意在这种环境下JVM的参数配置，可以找到一个栏目&#8220;Notes
/ Tuning Information&#8221;：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">　　JVM Options: </span><span style="color: #000000;">-</span><span style="color: #000000;">server </span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">AggressiveHeap<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">Xmx2560m
</span><span style="color: #000000;">-</span><span style="color: #000000;">Xms2560m </span><span style="color: #000000;">-</span><span style="color: #000000;">Xmn1024m
</span><span style="color: #000000;">-</span><span style="color: #000000;">Xss128k<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:PermSize</span><span style="color: #000000;">=</span><span style="color: #000000;">256m<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">DisableExplicitGC<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:ParallelGCThreads</span><span style="color: #000000;">=</span><span style="color: #000000;">24</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:LargePageSizeInBytes</span><span style="color: #000000;">=</span><span style="color: #000000;">256m<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">UseParallelOldGC<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">AggressiveOpts<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">DAllowManagedFieldsInDefaultFetchGroup</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">DAllowMediatedWriteInDefaultFetchGroup</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">-</span><span style="color: #000000;">UseBiasedLocking<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">Dcom.sun.ejb.containers.readonly.relative.refresh.mode</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">Dcom.sun.jts.dblogging.insertquery</span><span style="color: #000000;">=</span><span style="color: #000000;">insert
into<br />
<br />
txn_log_table_0 values ( </span><span style="color: #000000;">?</span><span style="color: #000000;"> , </span><span style="color: #000000;">?</span><span style="color: #000000;"> , </span><span style="color: #000000;">?</span><span style="color: #000000;">
)<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">Dcom.sun.jts.dblogging.deletequery</span><span style="color: #000000;">=</span><span style="color: #000000;">delete
from<br />
<br />
txn_log_table_0 where localtid </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;"> and servername
</span><span style="color: #000000;">=</span><span style="color: #000000;">
</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">Dcom.sun.jdo.spi.persistence.support.sqlstore.<br />
<br />
MULTILEVEL_PREFETCH</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span></div>
</div>
<p>　　那么上面那些参数是什么意思呢?上述段落中&#8220;-XX&#8221;的参数是SUN JVM的扩展选项，其中以下的这些都是和垃圾回收(GC)有关：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">　　</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:PermSize</span><span style="color: #000000;">=</span><span style="color: #000000;">256m<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">DisableExplicitGC<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:ParallelGCThreads</span><span style="color: #000000;">=</span><span style="color: #000000;">24</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">UseParallelOldGC<br />
<br />
</span><span style="color: #000000;">-</span><span style="color: #000000;">XX:</span><span style="color: #000000;">+</span><span style="color: #000000;">AggressiveHeap</span></div>
</div>
<p>　　下面这个选项是选择大的内存页面:</p>
<p>　　-XX:LargePageSizeInBytes=256m</p>
<p>　　"-XX:+AggressiveOpts"是一些试验性优化参数，&#8220;-XX:-UseBiasedLocking&#8221;是非竞争性的同步选项。</p>
<p>　　而选项&#8220;-Xmx2560m -Xms2560m -Xmn1024m
-Xss128k&#8221;则是初始堆栈的内存值，注意-Xmx和-Xms的值是一样的，这样系统性能会较平稳些。</p>
<p>　　至于这些参数详细代表什么意义，大家可以google一下就很容易了解。这是Sun网站上的说明,有兴趣的可以读一下：
http://java.sun.com/performance/reference/whitepapers/tuning.html</p>
<p>　　如果你的应用系统是JDK1.5，硬件是T5120，操作系统是Solaris，那么这些参数就很有借鉴意义。如果你的硬件系统不是T5120，但是使用SUN的JDK1.5
，这些参数也是有一定参考作用。当然，最理想的是选择一个和自己的环境最近似的结果来参考。大多数软硬件的测试结果都可以在SPEC.org上找到，如果你的系统是J2EE的3层架构，可以用jAppServer2004指标，如果是纯JAVA的应用，可用jbb2005的结果:</p>
<p>　　http://www.spec.org/jAppServer2004/</p>
<p>　　http://www.spec.org/jbb2005/</p>
<p>　　需要注意的是，这些调优参数只是提供了一个思路，具体是否合适你的应用还要看实测结果。</p>
<img src ="http://www.blogjava.net/sunjavaer/aggbug/268210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2009-04-29 19:24 <a href="http://www.blogjava.net/sunjavaer/archive/2009/04/29/268210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]Hibernate常用保存</title><link>http://www.blogjava.net/sunjavaer/archive/2008/08/23/223899.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Sat, 23 Aug 2008 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2008/08/23/223899.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/223899.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2008/08/23/223899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/223899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/223899.html</trackback:ping><description><![CDATA[hibernate对于对象的保存提供了太多的方法，他们之间有很多不同，这里细说一下，以便区别： <br />
<strong>一、预备知识：</strong> <br />
在所有之前，说明一下，对于hibernate，它的对象有三种状态，transient、persistent、detached <br />
下边是常见的翻译办法： <br />
transient：瞬态或者自由态 <br />
persistent：持久化状态 <br />
detached：脱管状态或者游离态 <br />
脱管状态的实例可以通过调用save（）、persist（）或者saveOrUpdate（）方法进行持久化。 <br />
持久化实例可以通过调用 delete（）变成脱管状态。通过get（）或load（）方法得到的实例都是持久化状态的。 <br />
脱管状态的实例可以通过调用 update（）、0saveOrUpdate（）、lock（）或者replicate（）进行持久化。 <br />
save（）
和persist（）将会引发SQL的INSERT，delete（）会引发SQLDELETE，而update（）或merge（）会引发
SQLUPDATE.对持久化（persistent）实例的修改在刷新提交的时候会被检测到，它也会引起
SQLUPDATE.saveOrUpdate（）或者replicate（）会引发SQLINSERT或者UPDATE <br />
<strong>二、save 和update区别</strong> <br />
把这一对放在第一位的原因是因为这一对是最常用的。 <br />
save的作用是把一个新的对象保存 <br />
update是把一个脱管状态的对象保存 <br />
<strong>三、update 和saveOrUpdate区别</strong> <br />
这个是比较好理解的，顾名思义，saveOrUpdate基本上就是合成了save和update引用hibernate reference中的一段话来解释他们的使用场合和区别。 <br />
通常下面的场景会使用update（）或saveOrUpdate（）： <br />
程序在第一个session中加载对象 <br />
该对象被传递到表现层 <br />
对象发生了一些改动 <br />
该对象被返回到业务逻辑层 <br />
程序调用第二个session的update（）方法持久这些改动 <br />
saveOrUpdate（）做下面的事： <br />
如果对象已经在本session中持久化了，不做任何事 <br />
如果另一个与本session关联的对象拥有相同的持久化标识（identifier），抛出一个异常 <br />
如果对象没有持久化标识（identifier）属性，对其调用save（） <br />
如果对象的持久标识（identifier）表明其是一个新实例化的对象，对其调用save（） <br />
如果对象是附带版本信息的（通过或） 并且版本属性的值表明其是一个新实例化的对象，save（）它。 <br />
<strong>四、persist和save区别</strong> <br />
这个是最迷离的一对，表面上看起来使用哪个都行，在hibernate reference文档中也没有明确的区分他们。 <br />
这里给出一个明确的区分。（可以跟进src看一下，虽然实现步骤类似，但是还是有细微的差别） <br />
1.persist把一个瞬态的实例持久化，但是并"不保证"标识符被立刻填入到持久化实例中，标识符的填入可能被推迟到flush的时间。 <br />
2.persist"
保证"，当它在一个transaction外部被调用的时候并不触发一个Sql
Insert，这个功能是很有用的，当我们通过继承Session/persistence
context来封装一个长会话流程的时候，一个persist这样的函数是需要的。 <br />
3.save"不保证"第2条，它要返回标识符，所以它会立即执行Sql insert，不管是不是在transaction内部。 <br />
<strong>五、saveOrUpdateCopy，merge和update区别</strong> <br />
首先说明merge是用来代替saveOrUpdateCopy的,然后比较update和merge，update的作用上边说了，这里说一下merge的作用。 <br />
如果session中存在相同持久化标识（identifier）的实例，用用户给出的对象的状态覆盖旧有的持久实例 <br />
如果session没有相应的持久实例，则尝试从数据库中加载，或创建新的持久化实例，最后返回该持久实例 <br />
用户给出的这个对象没有被关联到session上，它依旧是脱管的 <br />
重点是最后一句： <br />
当我们使用update的时候，执行完成后，我们提供的对象A的状态变成持久化状态 <br />
但当我们使用merge的时候，执行完成，我们提供的对象A还是脱管状态，hibernate或者new了一个B，或者检索到一个持久对象，并把我们提供的对象A的所有的值拷贝到这个B，执行完成后B是持久状态，而我们提供的A还是托管状态。 <br />
<strong>六、flush和update区别</strong> <br />
这两个的区别好理解 <br />
update操作的是在脱管状态的对象，而flush是操作的在持久状态的对象。 <br />
默认情况下，一个持久状态的对象是不需要update的，只要你更改了对象的值，等待hibernate flush就自动保存到数据库了。hibernate flush发生再几种情况下： <br />
1.调用某些查询的时候 <br />
2.transaction commit的时候 <br />
3.手动调用flush的时候 <br />
<strong>七、lock和update区别</strong> <br />
update是把一个已经更改过的脱管状态的对象变成持久状态 <br />
lock是把一个没有更改过的脱管状态的对象变成持久状态 <br />
对应更改一个记录的内容，两个的操作不同： <br />
update的操作步骤是： <br />
更改脱管的对象-&gt;调用update <br />
lock的操作步骤是： <br />
调用lock把对象从脱管状态变成持久状态——&gt;更改持久状态的对象的内容——&gt;等待flush或者手动flush
<img src ="http://www.blogjava.net/sunjavaer/aggbug/223899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2008-08-23 21:22 <a href="http://www.blogjava.net/sunjavaer/archive/2008/08/23/223899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转帖]Oracle执行计划解释</title><link>http://www.blogjava.net/sunjavaer/archive/2008/08/22/223793.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Fri, 22 Aug 2008 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2008/08/22/223793.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/223793.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2008/08/22/223793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/223793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/223793.html</trackback:ping><description><![CDATA[<font color="#330000">
<p><font face="Arial"><strong>一．相关的概念</strong></font></p>
<p><font face="Arial"><font face="Arial"><strong>&nbsp;</strong></font></font><font face="宋体">&nbsp;&nbsp; Rowid的概念：rowid是一个伪列，既然是伪列，那么这个列就不是用户定义，而是系统自己给加上的。 对每个表都有一个rowid的伪列，但是表中并不物理</font><font color="#0000ff" face="宋体">存储</font><font face="宋体">ROWID列的值。不过你可以像使用其它列那样使用它，但是不能删除改列，也不能对该列的值进行 修改、插入。一旦一行数据插入数据库，则rowid在该行的生命周期内是唯一的，即即使该行产生行迁移，行的rowid也不会改变。</font></p>
<p>&nbsp;&nbsp;&nbsp; Recursive SQL概念：有时为了执行用户发出的一个sql语句，<font color="#0000ff"><a title="oracle" href="http://www.google.cn/search?sbi=%E8%82%A1%E7%A5%A8&amp;amp;amp;q=%E8%82%A1%E7%A5%A8&amp;amp;amp;sbb=%E6%90%9C%E7%B4%A2&amp;amp;amp;sa=%E6%90%9C%E7%B4%A2&amp;amp;amp;client=pub-6430022987645146&amp;amp;amp;forid=1&amp;amp;amp;prog=aff&amp;amp;amp;ie=GB2312&amp;amp;amp;oe=GB2312&amp;amp;amp;hl=zh-CN" target="_blank">oracle</a></font>必须执行一些额外的语句，我们将这些额外的语句称之为''recursive calls''或''recursive <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>
statements''.如当一个DDL语句发出后，ORACLE总是隐含的发出一些recursive
SQL语句，来修改数据字典信息，以便用户可以成功的执行该DDL语句。当需要的数据字典信息没有在共享内存中时，经常会发生Recursive
calls，这些Recursive calls会将数据字典信息从硬盘读入内存中。用户不比关心这些recursive
SQL语句的执行情况，在需要的时候，ORACLE会自动的在内部执行这些语句。当然DML语句与SELECT都可能引起recursive <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>.简单的说，我们可以将触发器视为recursive <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>.</p>
<p>&nbsp;&nbsp;&nbsp; Row Source（行源）：用在查询中，由上一操作返回的符合条件的行的集合，即可以是表的全部行数据的集合；也可以是表的部分行数据的集合；也可以为对上2个row source进行连接操作（如join连接）后得到的行数据集合。</p>
<p>&nbsp;&nbsp;&nbsp; Predicate（谓词）：一个查询中的WHERE限制条件</p>
<p>&nbsp;&nbsp;&nbsp; Driving <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a>（驱动表）：该表又称为外层表（OUTER <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a>）。
这个概念用于嵌套与HASH连接中。如果该row
source返回较多的行数据，则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表，但实际上翻译为驱动行源（driving row
source）更为确切。一般说来，是应用查询的限制条件后，返回较少行源的表作为驱动表，所以如果一个大表在WHERE条件有有限制条件（如等值限
制），则该大表作为驱动表也是合适的，所以并不是只有较小的表可以作为驱动表，正确说法应该为应用查询的限制条件后，返回较少行源的表作为驱动表。在执行
计划中，应该为靠上的那个row source，后面会给出具体说明。在我们后面的描述中，一般将该表称为连接操作的row source 1.</p>
<p>&nbsp;&nbsp;&nbsp; Probed <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a>（被探查表）：该表又称为内层表（INNER <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a>）。在我们从驱动表中得到具体一行的数据后，在该表中寻找符合连接条件的行。所以该表应当为大表（实际上应该为返回较大row source的表）且相应的列上应该有索引。在我们后面的描述中，一般将该表称为连接操作的row source 2.</p>
<p>&nbsp;&nbsp;&nbsp; 组合索引（concatenated index）：由多个列构成的索引，如create index idx_emp on
emp（col1， col2， col3， &#8230;&#8230;），则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念：引导列（leading
column），在上面的例子中，col1列为引导列。当我们进行查询时可以使用&#8220;where col1 = ？ &#8221;，也可以使用&#8220;where
col1 = ？ and col2 = ？&#8221;，这样的限制条件都会使用索引，但是&#8220;where col2 = ？
&#8221;查询就不会使用该索引。所以限制条件中包含先导列时，该限制条件才会使用该组合索引。</p>
<p>&nbsp;&nbsp;&nbsp; 可选择性（selectivity）：比较一下列中唯一键的数量和表中的行数，就可以判断该列的可选择性。
如果该列的&#8220;唯一键的数量/表中的行数&#8221;的比值越接近1，则该列的可选择性越高，该列就越适合创建索引，同样索引的可选择性也越高。在可选择性高的列上进
行查询时，返回的数据就较少，比较适合使用索引查询。</p>
</font>
<div><font color="#ff0000" size="3">欢迎进入Oracle社区论坛，与200万技术人员互动交流 &gt;&gt;进入</font></div>
<font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">
<font face="Arial"><font face="Arial"><strong>二．oracle访问数据的存取方法</strong>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 1） 全表扫描（Full <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> Scans， FTS）</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 为实现全表扫描，<font color="#0000ff" face="宋体"><a title="oracle" href="http://www.google.cn/search?sbi=%E8%82%A1%E7%A5%A8&amp;amp;amp;q=%E8%82%A1%E7%A5%A8&amp;amp;amp;sbb=%E6%90%9C%E7%B4%A2&amp;amp;amp;sa=%E6%90%9C%E7%B4%A2&amp;amp;amp;client=pub-6430022987645146&amp;amp;amp;forid=1&amp;amp;amp;prog=aff&amp;amp;amp;ie=GB2312&amp;amp;amp;oe=GB2312&amp;amp;amp;hl=zh-CN" target="_blank">oracle</a></font>读
取表中所有的行，并检查每一行是否满足语句的WHERE限制条件一个多块读
操作可以使一次I/O能读取多块数据块（db_block_multiblock_read_count参数设定），而不是只读取一个数据块，这极大的减
少了I/O总次数，提高了系统的吞吐量，所以利用多块读的方法可以十分高效地实现全表扫描，而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模
式下，每个数据块只被读一次。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 使用FTS的前提条件：在较大的表上不建议使用全表扫描，除非取出数据的比较多，超过总量的5% —— 10%，或你想使用并行查询功能时。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 使用全表扫描的例子：</font></p>
<font face="Arial"><font face="Arial"><font face="Arial">
<p><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; ~~~~~~~~~~~~~~~~~~~~~~~~ <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select * from dual;</font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; Query Plan</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; -----------------------------------------</font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=</font></font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL DUAL</font></font></font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; 2） 通过ROWID的表存取（Table Access by ROWID或rowid lookup）</font></font></font></font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; 行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置，所以通过ROWID来存取数据可以快速定位到目标数据上，是Oracle存取单行数据的最快方法。</font></font></font></font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; 这种存取方法不会用到多块读操作，一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法，如通过索引查询数据。</font></font></font></font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; 使用ROWID存取的方法： <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select * from dept where rowid = ''AAAAyGAADAAAAATAAF''；</font></font></font></font></font></font></font></p>
<font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">
<p><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; Query Plan</font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; ------------------------------------</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=1</font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS BY ROWID DEPT [ANALYZED]</font></font></font></font></font></p>
<font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">
<p><br />
&nbsp;&nbsp;&nbsp; 3）索引扫描（Index Scan或index lookup）</p>
<p>&nbsp;&nbsp;&nbsp;
我们先通过index查找到数据对应的rowid值（对于非唯一索引可能返回多个rowid值），然后根据rowid直接从表中得到具体的数据，这
种查找方式称为索引扫描或索引查找（index
lookup）。一个rowid唯一的表示一行数据，该行对应的数据块是通过一次i/o得到的，在此情况下该次i/o只会读取一个数据库块。</p>
<p>&nbsp;&nbsp;&nbsp; 在索引中，除了<font color="#0000ff" face="宋体">存储</font>每个索引的值外，索引还存储具有此值
的行对应的ROWID值。索引扫描可以由2步组成：（1） 扫描索引得到对应的rowid值。 （2）
通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O，但是对于索引，由于经常使用，绝大多数都已经CACHE到内存中，所以第1步的
I/O经常是逻辑I/O，即数据可以从内存中得到。但是对于第2步来说，如果表比较大，则其数据不可能全在内存中，所以其I/O很有可能是物理I/O，这
是一个机械操作，相对逻辑I/O来说，是极其费时间的。所以如果多大表进行索引扫描，取出的数据如果大于总量的5% ——
10%，使用索引扫描会效率下降很多。如下列所示：SQL&gt; explain plan for select empno， ename
from emp where empno=10；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>&nbsp;&nbsp;&nbsp; ------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS BY ROWID EMP [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN EMP_I1</p>
<p><br />
&nbsp;&nbsp;&nbsp; 但是如果查询的数据能全在索引中找到，就可以避免进行第2步操作，避免了不必要的I/O，此时即使通过索引扫描取出的数据比较多，效率还是很高的</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select empno from emp where empno=10;-- 只查询empno列值</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>&nbsp;&nbsp;&nbsp; ------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN EMP_I1</p>
<p>&nbsp;&nbsp;&nbsp; 进一步讲，如果sql语句中对索引列进行排序，因为索引已经预先排序好了，所以在执行计划中不需要再对索引列进行排序<br />
&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select empno, ename from emp</p>
<p>&nbsp;&nbsp;&nbsp; where empno &gt; 7876 order by empno;</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>&nbsp;&nbsp;&nbsp; --------------------------------------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS BY ROWID EMP [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; INDEX RANGE SCAN EMP_I1 [ANALYZED]</p>
<p><br />
&nbsp;&nbsp;&nbsp; 从这个例子中可以看到：因为索引是已经排序了的，所以将按照索引的顺序查询出符合条件的行，因此避免了进一步排序操作。</p>
<p>根据索引的类型与where限制条件的不同，有4种类型的索引扫描：</p>
<p>&nbsp;&nbsp;&nbsp; 索引唯一扫描（index unique scan）</p>
<p>&nbsp;&nbsp;&nbsp; 索引范围扫描（index range scan）</p>
<p>&nbsp;&nbsp;&nbsp; 索引全扫描（index full scan）</p>
<p>&nbsp;&nbsp;&nbsp; 索引快速扫描（index fast full scan）</p>
<p>&nbsp;&nbsp;&nbsp; （1） 索引唯一扫描（index unique scan）</p>
<p>&nbsp;&nbsp;&nbsp; 通过唯一索引查找一个数值经常返回单个ROWID.如果存在UNIQUE 或PRIMARY KEY 约束（它保证了语句只存取单行）的话，Oracle经常实现唯一性扫描。</p>
<p>&nbsp;&nbsp;&nbsp; 使用唯一性约束的例子：</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for</p>
<p>&nbsp;&nbsp;&nbsp; select empno，ename from emp where empno=10；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS BY ROWID EMP [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN EMP_I1</p>
<p>&nbsp;&nbsp;&nbsp; （2） 索引范围扫描（index range scan）</p>
<p>&nbsp;&nbsp;&nbsp; 使用一个索引存取多行数据，在唯一索引上使用索引范围扫描的典型情况下是在谓词（where限制条件）中使用了范围操作符（如&gt;、&lt;、&lt;&gt;、&gt;=、&lt;=、between）</p>
<p>&nbsp;&nbsp;&nbsp; 使用索引范围扫描的例子：</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select empno，ename from emp</p>
<p>&nbsp;&nbsp;&nbsp; where empno &gt; 7876 order by empno；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>--------------------------------------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS BY ROWID EMP [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; INDEX RANGE SCAN EMP_I1 [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; 在非唯一索引上，谓词col = 5可能返回多行数据，所以在非唯一索引上都使用索引范围扫描。</p>
<p>&nbsp;&nbsp;&nbsp; 使用index rang scan的3种情况：</p>
<p>&nbsp;&nbsp;&nbsp; （a） 在唯一索引列上使用了range操作符（&gt; &lt; &lt;&gt; &gt;= &lt;= between）</p>
<p>&nbsp;&nbsp;&nbsp; （b） 在组合索引上，只使用部分列进行查询，导致查询出多行</p>
<p>&nbsp;&nbsp;&nbsp; （c） 对非唯一索引列上进行的任何查询。</p>
<p>&nbsp;&nbsp;&nbsp; （3） 索引全扫描（index full scan）</p>
<p>&nbsp;&nbsp;&nbsp; 与全表扫描对应，也有相应的全索引扫描。而且此时查询出的数据都必须从索引中可以直接得到。</p>
<p>&nbsp;&nbsp;&nbsp; 全索引扫描的例子：</p>
<p>&nbsp;&nbsp;&nbsp; An Index full scan will not perform single block i/o''s and so it may prove to be inefficient.</p>
<p>&nbsp;&nbsp;&nbsp; e.g.</p>
<p>&nbsp;&nbsp;&nbsp; Index BE_IX is a concatenated index on big_emp （empno， ename）</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select empno， ename from big_emp order by empno，ename；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>--------------------------------------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=26</p>
<p>&nbsp;&nbsp;&nbsp; INDEX FULL SCAN BE_IX [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; （4） 索引快速扫描（index fast full scan）</p>
<p>&nbsp;&nbsp;&nbsp; 扫描索引中的所有的数据块，与 index full scan很类似，但是一个显著的区别就是它不对查询出的数据进行排序，即数据不是以排序顺序被返回。在这种存取方法中，可以使用多块读功能，也可以使用并行读入，以便获得最大吞吐量与缩短执行时间。</p>
<p>&nbsp;&nbsp;&nbsp; 索引快速扫描的例子：</p>
<p>&nbsp;&nbsp;&nbsp; BE_IX索引是一个多列索引： big_emp （empno，ename）</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select empno，ename from big_emp；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; INDEX FAST FULL SCAN BE_IX [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; 只选择多列索引的第2列：</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for select ename from big_emp；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=1</p>
<p>&nbsp;&nbsp;&nbsp; INDEX FAST FULL SCAN BE_IX [ANALYZED]</p>
<p>&nbsp;&nbsp; <strong>三、表之间的连接</strong></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;
Join是一种试图将两个表结合在一起的谓词，一次只能连接2个表，表连接也可以被称为表关联。在后面的叙 述中，我们将会使用&#8220;row
source&#8221;来代替&#8220;表&#8221;，因为使用row source更严谨一些，并且将参与连接的2个row source分别称为row
source1和row source 2.Join过程的各个步骤经常是串行操作，即使相关的row
source可以被并行访问，即可以并行的读取做join连接的两个row source的数据，但是在将表中符合限制条件的数据读入到内存形成row
source后，join的其它步骤一般是串行的。有多种方法可以将2个表连接起来，当然每种方法都有自己的优缺点，每种连接类型只有在特定的条件下才会
发挥出其最大优势。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; row
source（表）之间的连接顺序对于查询的效率有非常大的影响。通过首先存取特定的表，即将该表作为驱动表，这样可以先应用某些限制条件，从而得到一个
较小的row
source，使连接的效率较高，这也就是我们常说的要先执行限制条件的原因。一般是在将表读入内存时，应用where子句中对该表的限制条件。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 根据2个row
source的连接条件的中操作符的不同，可以将连接分为等值连接（如WHERE A.COL3 = B.COL4）、非等值连接（WHERE
A.COL3 &gt; B.COL4）、外连接（WHERE A.COL3 =
B.COL4（+））。上面的各个连接的连接原理都基本一样，所以为了简单期间，下面以等值连接为例进行介绍。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 在后面的介绍中，都已：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SELECT A.COL1， B.COL2</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; FROM A， B</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; WHERE A.COL3 = B.COL4；</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 为例进行说明，假设A表为Row Soruce1，则其对应的连接操作关联列为COL 3；B表为Row Soruce2，则其对应的连接操作关联列为COL 4；</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 连接类型：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 目前为止，无论连接操作符如何，典型的连接类型共有3种：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 排序 - - 合并连接（Sort Merge Join （SMJ） ）</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 嵌套循环（Nested Loops （NL） ）</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 哈希连接（Hash Join）</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 排序 - - 合并连接（Sort Merge Join， SMJ）</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 内部连接过程：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 1） 首先生成row source1需要的数据，然后对这些数据按照连接操作关联列（如A.col3）进行排序。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 2） 随后生成row source2需要的数据，然后对这些数据按照与sort source1对应的连接操作关联列（如B.col4）进行排序。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 3） 最后两边已排序的行被放在一起执行合并操作，即将2个row source按照连接条件连接起来</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 下面是连接步骤的图形表示：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; MERGE</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; /"</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SORTSORT</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; ||</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Row Source 1Row Source 2</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 如果row
source已经在连接关联列上被排序，则该连接操作就不需要再进行sort操作，这样可以大大提高这种连接操作的连接速度，因为排序是个极其费资源的操
作，特别是对于较大的表。预先排序的row source包括已经被索引的列（如a.col3或b.col4上有索引）或row
source已经在前面的步骤中被排序了。尽管合并两个row source的过程是串行的，但是可以并行访问这两个row
source（如并行读入数据，并行排序）。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SMJ连接的例子：SQL&gt; explain plan for</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; select /*+ ordered */ e.deptno， d.deptno</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; from emp e， dept d</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; where e.deptno = d.deptno</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; order by e.deptno， d.deptno；</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Query Plan</font></p>
<p><font face="Arial">-------------------------------------</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=17</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; MERGE JOIN</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SORT JOIN</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL EMP [ANALYZED]</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; SORT JOIN</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL DEPT [ANALYZED]</font></p>
<font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">
<p><br />
&nbsp;&nbsp;&nbsp; 排序是一个费时、费资源的操作，特别对于大表。基于这个原因，SMJ经常不是一个特别有效的连接方法，但是如果2个row source都已经预先排序，则这种连接方法的效率也是蛮高的。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>嵌套循环（Nested Loops， NL）</strong></p>
<p>&nbsp;&nbsp;&nbsp;
这个连接方法有驱动表（外部表）的概念。其实，该连接过程就是一个2层嵌套循环，所以外层循环的次数越少越好，这也就是我们为什么将小表或返回较小
row
source的表作为驱动表（用于外层循环）的理论依据。但是这个理论只是一般指导原则，因为遵循这个理论并不能总保证使语句产生的I/O次数最少。有时
不遵守这个理论依据，反而会获得更好的效率。如果使用这种方法，决定使用哪个表作为驱动表很重要。有时如果驱动表选择不正确，将会导致语句的性能很差、很
差。</p>
<p>&nbsp;&nbsp;&nbsp; 内部连接过程：</p>
<p>&nbsp;&nbsp;&nbsp; Row source1的Row 1 —— Probe -&gt;Row source 2</p>
<p>&nbsp;&nbsp;&nbsp; Row source1的Row 2 —— Probe -&gt;Row source 2</p>
<p>&nbsp;&nbsp;&nbsp; Row source1的Row 3 —— Probe -&gt;Row source 2</p>
<p>&nbsp;&nbsp;&nbsp; &#8230;&#8230;。</p>
<p>&nbsp;&nbsp;&nbsp; Row source1的Row n —— Probe -&gt;Row source 2</p>
<p>&nbsp;&nbsp;&nbsp; 从内部连接过程来看，需要用row source1中的每一行，去匹配row source2中的所有行，所以此时保持row
source1尽可能的小与高效的访问row
source2（一般通过索引实现）是影响这个连接效率的关键问题。这只是理论指导原则，目的是使整个连接操作产生最少的物理I/O次数，而且如果遵守这
个原则，一般也会使总的物理I/O数最少。但是如果不遵从这个指导原则，反而能用更少的物理I/O实现连接操作，那尽管违反指导原则吧！因为最少的物理
I/O次数才是我们应该遵从的真正的指导原则，在后面的具体案例分析中就给出这样的例子。</p>
<p>&nbsp;&nbsp;&nbsp; 在上面的连接过程中，我们称Row source1为驱动表或外部表。Row Source2被称为被探查表或内部表。</p>
<p>&nbsp;&nbsp;&nbsp; 在NESTED LOOPS连接中，Oracle读取row source1中的每一行，然后在row
sourc2中检查是否有匹配的行，所有被匹配的行都被放到结果集中，然后处理row source1中的下一行。这个过程一直继续，直到row
source1中的所有行都被处理。这是从连接操作中可以得到第一个匹配行的最快的方法之一，这种类型的连接可以用在需要快速响应的语句中，以响应速度为
主要目标。</p>
<p>&nbsp;&nbsp;&nbsp; 如果driving row source（外部表）比较小，并且在inner row
source（内部表）上有唯一索引，或有高选择性非唯一索引时，使用这种方法可以得到较好的效率。NESTED
LOOPS有其它连接方法没有的的一个优点是：可以先返回已经连接的行，而不必等待所有的连接操作处理完才返回数据，这可以实现快速的响应时间。</p>
<p>&nbsp;&nbsp;&nbsp; 如果不使用并行操作，最好的驱动表是那些应用了where
限制条件后，可以返回较少行数据的的表，所以大表也可能称为驱动表，关键看限制条件。对于并行查询，我们经常选择大表作为驱动表，因为大表可以充分利用并
行功能。当然，有时对查询使用并行操作并不一定会比查询不使用并行操作效率高，因为最后可能每个表只有很少的行符合限制条件，而且还要看你的硬件配置是否
可以支持并行（如是否有多个CPU，多个硬盘控制器），所以要具体问题具体对待。</p>
<p>&nbsp;&nbsp;&nbsp; NL连接的例子：</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for</p>
<p>&nbsp;&nbsp;&nbsp; select a.dname，b.sql</p>
<p>&nbsp;&nbsp;&nbsp; from dept a，emp b</p>
<p>&nbsp;&nbsp;&nbsp; where a.deptno = b.deptno；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>-------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT [CHOOSE] Cost=5</p>
<p>&nbsp;&nbsp;&nbsp; NESTED LOOPS</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL DEPT [ANALYZED]</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL EMP [ANALYZED]</p>
<p><br />
&nbsp;&nbsp;&nbsp;<strong> 哈希连接（Hash Join， HJ）</strong></p>
<p>&nbsp;&nbsp;&nbsp; 这种连接是在oracle 7.3以后引入的，从理论上来说比NL与SMJ更高效，而且只用在CBO优化器中。</p>
<p>&nbsp;&nbsp;&nbsp; 较小的row source被用来构建hash table与bitmap，第2个row
source被用来被hansed，并与第一个row source生成的hash
table进行匹配，以便进行进一步的连接。Bitmap被用来作为一种比较快的查找方法，来检查在hash
table中是否有匹配的行。特别的，当hash
table比较大而不能全部容纳在内存中时，这种查找方法更为有用。这种连接方法也有NL连接中所谓的驱动表的概念，被构建为hash
table与bitmap的表为驱动表，当被构建的hash table与bitmap能被容纳在内存中时，这种连接方式的效率极高。</p>
<p>&nbsp;&nbsp;&nbsp; HASH连接的例子：</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for</p>
<p>&nbsp;&nbsp;&nbsp; select /*+ use_hash（emp） */ empno</p>
<p>&nbsp;&nbsp;&nbsp; from emp， dept</p>
<p>&nbsp;&nbsp;&nbsp; where emp.deptno = dept.deptno；</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>----------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SELECT STATEMENT[CHOOSE] Cost=3</p>
<p>&nbsp;&nbsp;&nbsp; HASH JOIN</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL DEPT</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL EMP</p>
<p><br />
&nbsp;&nbsp;&nbsp;
要使哈希连接有效，需要设置HASH_JOIN_ENABLED=TRUE，缺省情况下该参数为TRUE，另外，不要忘了还要设置
hash_area_size参数，以使哈希连接高效运行，因为哈希连接会在该参数指定大小的内存中运行，过小的参数会使哈希连接的性能比其他连接方式还
要低。</p>
<p>&nbsp;&nbsp;&nbsp; 总结一下，在哪种情况下用哪种连接方法比较好：</p>
<p>&nbsp;&nbsp;&nbsp; 排序 - - 合并连接（Sort Merge Join， SMJ）：</p>
<p>&nbsp;&nbsp;&nbsp; a） 对于非等值连接，这种连接方式的效率是比较高的。</p>
<p>&nbsp;&nbsp;&nbsp; b） 如果在关联的列上都有索引，效果更好。</p>
<p>&nbsp;&nbsp;&nbsp; c） 对于将2个较大的row source做连接，该连接方法比NL连接要好一些。</p>
<p>&nbsp;&nbsp;&nbsp; d） 但是如果sort merge返回的row source过大，则又会导致使用过多的rowid在表中查询数据时，数据库性能下降，因为过多的I/O.</p>
<p>&nbsp;&nbsp;&nbsp; 嵌套循环（Nested Loops， NL）：</p>
<p>&nbsp;&nbsp;&nbsp; a） 如果driving row source（外部表）比较小，并且在inner row source（内部表）上有唯一索引，或有高选择性非唯一索引时，使用这种方法可以得到较好的效率。</p>
<p>&nbsp;&nbsp;&nbsp; b） NESTED LOOPS有其它连接方法没有的的一个优点是：可以先返回已经连接的行，而不必等待所有的连接操作处理完才返回数据，这可以实现快速的响应时间。</p>
<p>&nbsp;&nbsp;&nbsp; 哈希连接（Hash Join， HJ）：</p>
<p>&nbsp;&nbsp;&nbsp; a） 这种方法是在oracle7后来引入的，使用了比较先进的连接理论，一般来说，其效率应该好于其它2种连接，但是这种连接只能用在CBO优化器中，而且需要设置合适的hash_area_size参数，才能取得较好的性能。</p>
<p>&nbsp;&nbsp;&nbsp; b） 在2个较大的row source之间连接时会取得相对较好的效率，在一个row source较小时则能取得更好的效率。</p>
<p>&nbsp;&nbsp;&nbsp; c） 只能用于等值连接中</p>
<p>&nbsp;&nbsp;&nbsp; 笛卡儿乘积（Cartesian Product）</p>
<p>&nbsp;&nbsp;&nbsp; 当两个row source做连接，但是它们之间没有关联条件时，就会在两个row
source中做笛卡儿乘积，这通常由编写代码疏漏造成（即程序员忘了写关联条件）。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情
况下我们可以使用笛卡儿乘积，如在星形连接中，除此之外，我们要尽量使用笛卡儿乘积，否则，自己想结果是什么吧！</p>
<p>&nbsp;&nbsp;&nbsp; 注意在下面的语句中，在2个表之间没有连接。</p>
<p>&nbsp;&nbsp;&nbsp; <a title="sql" href="http://www.google.cn/search?sbi=sql&amp;q=sql&amp;sbb=%E6%90%9C%E7%B4%A2&amp;sa=%E6%90%9C%E7%B4%A2&amp;client=pub-6430022987645146&amp;forid=1&amp;prog=aff&amp;ie=GB2312&amp;oe=GB2312&amp;hl=zh-CN" target="_blank">sql</a>&gt; explain plan for</p>
<p>&nbsp;&nbsp;&nbsp; select emp.deptno，dept，deptno</p>
<p>&nbsp;&nbsp;&nbsp; from emp，dept</p>
<p>&nbsp;&nbsp;&nbsp; Query Plan</p>
<p>------------------------</p>
<p>&nbsp;&nbsp;&nbsp; SLECT STATEMENT [CHOOSE] Cost=5</p>
<p>&nbsp;&nbsp;&nbsp; MERGE JOIN CARTESIAN</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL DEPT</p>
<p>&nbsp;&nbsp;&nbsp; SORT JOIN</p>
<p>&nbsp;&nbsp;&nbsp; <a title="table" href="http://www.alimama.com/membersvc/buyadzone/buy_ad_zone.htm?adzoneid=892989" target="_blank">table</a> ACCESS FULL EMP</p>
<p>&nbsp;&nbsp;&nbsp; CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行，dept表有m行，笛卡尔乘积的结果就是得到n * m行结果。</p>
</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font>
<img src ="http://www.blogjava.net/sunjavaer/aggbug/223793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2008-08-22 22:33 <a href="http://www.blogjava.net/sunjavaer/archive/2008/08/22/223793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora 7 安装 nvidia显卡驱动</title><link>http://www.blogjava.net/sunjavaer/archive/2007/07/29/133114.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Sun, 29 Jul 2007 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2007/07/29/133114.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/133114.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2007/07/29/133114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/133114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/133114.html</trackback:ping><description><![CDATA[第一步，到nvidia官方下载驱动，根据自己显卡的型号选择，一定要看readme<br>第二步，驱动只能在命令行方式下安装，所以要修改/etc/inittab文件<br>　　　　id:3:initdefault<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3代表文本方式，５代表图形方式<br>　　　　修改后重启系统<br>第三步，执行驱动，不出意外会非常的顺利，之后shutdown -r now就完成了<br><br>本人也是第一次安装，有不对的地方请大家指正，祝好运<br><br> <img src ="http://www.blogjava.net/sunjavaer/aggbug/133114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2007-07-29 13:48 <a href="http://www.blogjava.net/sunjavaer/archive/2007/07/29/133114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache rewrite 简单应用</title><link>http://www.blogjava.net/sunjavaer/archive/2007/07/16/130676.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Mon, 16 Jul 2007 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2007/07/16/130676.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/130676.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2007/07/16/130676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/130676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/130676.html</trackback:ping><description><![CDATA[主要需求，DNS<a href="http://www.mydomain.com/">www.mydomain.com</a>指向<a href="http://www.mydomain.com/app/login.do">www.mydomain.com/app/login.do</a><br><br>目前是DNS指向某一个IP，不能将IP对应到10.11.xxx.xxx/app/login.do<br><br>生产环境WEB服务器是apache server<br><br><br><strong>解决办法<br></strong>利用apache rewriter功能，在httpd.conf中找到<br><br>#LoadModule rewrite_module modules/mod_rewrite.so<br><br>将#号去掉，也就是把mod_rewrite.so模块加载进来<br><br>之后在文件结尾处添加<br><br>rewriteengine on <br>rewriterule ^/$&nbsp;<a href="http://10.11.xxx.xxx/app/login.do">http://10.11.xxx.xxx/app/login.do</a> [R] 
<img src ="http://www.blogjava.net/sunjavaer/aggbug/130676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2007-07-16 21:47 <a href="http://www.blogjava.net/sunjavaer/archive/2007/07/16/130676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]jasperreport可以用Collection做为数据源</title><link>http://www.blogjava.net/sunjavaer/archive/2005/12/11/23371.html</link><dc:creator>丑男</dc:creator><author>丑男</author><pubDate>Sun, 11 Dec 2005 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/sunjavaer/archive/2005/12/11/23371.html</guid><wfw:comment>http://www.blogjava.net/sunjavaer/comments/23371.html</wfw:comment><comments>http://www.blogjava.net/sunjavaer/archive/2005/12/11/23371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunjavaer/comments/commentRss/23371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunjavaer/services/trackbacks/23371.html</trackback:ping><description><![CDATA[<SPAN style="COLOR: #000000">
<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=Code_Closed_Image onclick="this.style.display='none'; Code_Closed_Text.style.display='none'; Code_Open_Image.style.display='inline'; Code_Open_Text.style.display='inline';" height=16 src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><IMG id=Code_Open_Image style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text.style.display='none'; Code_Closed_Image.style.display='inline'; Code_Closed_Text.style.display='inline';" height=16 src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><SPAN id=Code_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Code_Open_Text style="DISPLAY: none"><BR><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;contentType</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">text/html;charset=GBK</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">dori.jasper.engine.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.util.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.io.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">java.sql.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.zx.report.util.CarUse</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">@&nbsp;page&nbsp;</SPAN><SPAN style="COLOR: #0000ff">import</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">dori.jasper.engine.data.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">&lt;%</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9<SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></SPAN><SPAN style="COLOR: #000000">Connection&nbsp;conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Statement&nbsp;st&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>ResultSet&nbsp;rs&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">byte</SPAN><SPAN style="COLOR: #000000">[]&nbsp;bytes&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>List&nbsp;carUseList</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArrayList();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_420_2737_Open_Image onclick="this.style.display='none'; Codehighlighter1_420_2737_Open_Text.style.display='none'; Codehighlighter1_420_2737_Closed_Image.style.display='inline'; Codehighlighter1_420_2737_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_420_2737_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_420_2737_Closed_Text.style.display='none'; Codehighlighter1_420_2737_Open_Image.style.display='inline'; Codehighlighter1_420_2737_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN id=Codehighlighter1_420_2737_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"></SPAN><SPAN id=Codehighlighter1_420_2737_Open_Text><SPAN style="COLOR: #000000">{&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.microsoft.jdbc.sqlserver.SQLServerDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">18</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">DriverManager.getConnection(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:microsoft:sqlserver://10.10.10.207:1433;DatabaseName=report;user=sa;password=111111</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">19</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">20</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">以输入流方式&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">21</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;InputStream&nbsp;reportFile&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;getClass().getClassLoader().getResourceAsStream(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">carUserBd.jasper</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">22</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">23</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">以reportFile方式&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">24</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">File&nbsp;reportFile&nbsp;=new&nbsp;File(request.getRealPath("/report/carUserBd.jasper"));&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">25</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">26</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Map&nbsp;parameters&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;HashMap();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">27</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">28</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">29</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>String&nbsp;sqlCarUser</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">SELECT&nbsp;car.carNo,&nbsp;dept.Name&nbsp;,&nbsp;people.peopleName,carUse.useDescription&nbsp;,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">30</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;carUse.beginTime&nbsp;,&nbsp;carUse.planEndTime&nbsp;,&nbsp;carUse.comment&nbsp;,&nbsp;carUse.driver,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">31</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;carUse.peopleNumber&nbsp;,OneWay=&nbsp;case&nbsp;carUse.isOneWay&nbsp;&nbsp;when&nbsp;0&nbsp;then&nbsp;'双程'&nbsp;&nbsp;else&nbsp;'单程'&nbsp;&nbsp;end,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">32</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">isFirst=&nbsp;case&nbsp;carUse.priority&nbsp;when&nbsp;0&nbsp;&nbsp;then&nbsp;'低'&nbsp;when&nbsp;&nbsp;1&nbsp;&nbsp;then&nbsp;&nbsp;'中'&nbsp;&nbsp;else&nbsp;&nbsp;'高'&nbsp;&nbsp;end,&nbsp;carUse.start&nbsp;,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">33</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">carUse.destination&nbsp;,&nbsp;people.peopleName&nbsp;as&nbsp;ratifier&nbsp;FROM&nbsp;DEPT_CARUSELOG&nbsp;carUse&nbsp;,&nbsp;DEPT_CARINFO&nbsp;car&nbsp;,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">34</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ADMIN_ORGANIZATION&nbsp;dept&nbsp;,&nbsp;PUBLIC_PEOPLEINFO&nbsp;people&nbsp;WHERE&nbsp;carUse.id=290&nbsp;and&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">35</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">caruse.carId=car.carId&nbsp;and&nbsp;carUse.departId=dept.id&nbsp;and&nbsp;carUse.peopleId=people.peopleId</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">36</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">37</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>st&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;conn.createStatement();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">38</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>rs&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;st.executeQuery(sqlCarUser);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">39</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">40</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_1595_2192_Open_Image onclick="this.style.display='none'; Codehighlighter1_1595_2192_Open_Text.style.display='none'; Codehighlighter1_1595_2192_Closed_Image.style.display='inline'; Codehighlighter1_1595_2192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1595_2192_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1595_2192_Closed_Text.style.display='none'; Codehighlighter1_1595_2192_Open_Image.style.display='inline'; Codehighlighter1_1595_2192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(rs.next())</SPAN><SPAN id=Codehighlighter1_1595_2192_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"></SPAN><SPAN id=Codehighlighter1_1595_2192_Open_Text><SPAN style="COLOR: #000000">{&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">41</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>CarUse&nbsp;carUse</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CarUse();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">42</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setCarNo(rs.getString(</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">43</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setName(rs.getString(</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">44</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setPeopleName(rs.getString(</SPAN><SPAN style="COLOR: #000000">3</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">45</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setUseDescription(rs.getString(</SPAN><SPAN style="COLOR: #000000">4</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">46</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setBeginTime(rs.getDate(</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">47</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setPlanEndTime(rs.getDate(</SPAN><SPAN style="COLOR: #000000">6</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">48</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setComment(rs.getString(</SPAN><SPAN style="COLOR: #000000">7</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">49</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setDriver(rs.getString(</SPAN><SPAN style="COLOR: #000000">8</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">50</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setPeopleNumber(rs.getString(</SPAN><SPAN style="COLOR: #000000">9</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">51</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setOneWay(rs.getString(</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">52</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setIsFirst(rs.getString(</SPAN><SPAN style="COLOR: #000000">11</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">53</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setStart(rs.getString(</SPAN><SPAN style="COLOR: #000000">12</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">54</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setDestination(rs.getString(</SPAN><SPAN style="COLOR: #000000">13</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">55</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUse.setRatifier(rs.getString(</SPAN><SPAN style="COLOR: #000000">14</SPAN><SPAN style="COLOR: #000000">));&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">56</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">57</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>carUseList.add(carUse);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">58</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">59</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">60</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">61</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>JRBeanCollectionDataSource&nbsp;ds&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;JRBeanCollectionDataSource(carUseList);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">62</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">63</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>bytes&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">64</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>JasperRunManager.runReportToPdf(&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">65</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>reportFile,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">66</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>parameters,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">67</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ds);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">68</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>String&nbsp;fileName&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test.pdf</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">69</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.setContentType(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">application/pdf</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">70</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.addHeader(&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">71</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Content-Disposition</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">72</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">attachment;filename=\</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">&nbsp;+&nbsp;fileName);&nbsp;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">73</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">74</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>response.setContentLength(bytes.length);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">75</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ServletOutputStream&nbsp;ouputStream&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;response.getOutputStream();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">76</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">77</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">78</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ouputStream.write(bytes,&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">,&nbsp;bytes.length);&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">79</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ouputStream.flush();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">80</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>ouputStream.close();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">81</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">82</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2765_2830_Open_Image onclick="this.style.display='none'; Codehighlighter1_2765_2830_Open_Text.style.display='none'; Codehighlighter1_2765_2830_Closed_Image.style.display='inline'; Codehighlighter1_2765_2830_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2765_2830_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2765_2830_Closed_Text.style.display='none'; Codehighlighter1_2765_2830_Open_Image.style.display='inline'; Codehighlighter1_2765_2830_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(SQLException&nbsp;sqle)&nbsp;</SPAN><SPAN id=Codehighlighter1_2765_2830_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"></SPAN><SPAN id=Codehighlighter1_2765_2830_Open_Text><SPAN style="COLOR: #000000">{&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">83</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">84</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">SQLException:</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;sqle.getMessage());&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">85</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">86</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2854_2879_Open_Image onclick="this.style.display='none'; Codehighlighter1_2854_2879_Open_Text.style.display='none'; Codehighlighter1_2854_2879_Closed_Image.style.display='inline'; Codehighlighter1_2854_2879_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2854_2879_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2854_2879_Closed_Text.style.display='none'; Codehighlighter1_2854_2879_Open_Image.style.display='inline'; Codehighlighter1_2854_2879_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(JRException&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_2854_2879_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"></SPAN><SPAN id=Codehighlighter1_2854_2879_Open_Text><SPAN style="COLOR: #000000">{&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">87</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>e.printStackTrace();&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">88</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_2914_2921_Open_Image onclick="this.style.display='none'; Codehighlighter1_2914_2921_Open_Text.style.display='none'; Codehighlighter1_2914_2921_Closed_Image.style.display='inline'; Codehighlighter1_2914_2921_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_2914_2921_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2914_2921_Closed_Text.style.display='none'; Codehighlighter1_2914_2921_Open_Image.style.display='inline'; Codehighlighter1_2914_2921_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(ClassNotFoundException&nbsp;cnfe)</SPAN><SPAN id=Codehighlighter1_2914_2921_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"></SPAN><SPAN id=Codehighlighter1_2914_2921_Open_Text><SPAN style="COLOR: #000000">{&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">89</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">90</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">91</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">92</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">93</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">%&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">94</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">95</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN></SPAN></DIV><BR><BR>jasperreport可以用Collection做为数据源，这种方式比用Connection方式更为灵活方便 <BR><IMG height=16 src="http://sgsoft.cnblogs.com/Images/OutliningIndicators/None.gif" width=11 align=top></SPAN>&nbsp;<img src ="http://www.blogjava.net/sunjavaer/aggbug/23371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunjavaer/" target="_blank">丑男</a> 2005-12-11 18:12 <a href="http://www.blogjava.net/sunjavaer/archive/2005/12/11/23371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>