﻿<?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-paulwong-随笔分类-性能优化</title><link>http://www.blogjava.net/paulwong/category/49903.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 02 Dec 2020 14:18:27 GMT</lastBuildDate><pubDate>Wed, 02 Dec 2020 14:18:27 GMT</pubDate><ttl>60</ttl><item><title>Java的BIO和NIO很难懂？用代码实践给你看，再不懂我转行！</title><link>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 02 Dec 2020 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435737.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435737.html</trackback:ping><description><![CDATA[<a href="http://www.52im.net/thread-2846-1-1.html" target="_blank">http://www.52im.net/thread-2846-1-1.html</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-12-02 08:52 <a href="http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种获取JVM DUMP的方法</title><link>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 24 Feb 2020 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435157.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435157.html</trackback:ping><description><![CDATA[<p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">JVM 的线程堆栈 dump 也称 core dump，内容为文本，主要包含当时 JVM 的线程堆栈，堆 dump 也称 heap dump，内容为二进制格式，主要包含当时 JVM 堆内存中的内容。由于各个操作系统、各个 JVM 实现不同，即使同一 JVM 实现，各个版本也有差异，本文描述的方法都基于 64 位 Linux 操作系统环境，Java 8 Oracle HotSpot JVM 实现。</p><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">堆栈和堆的内容在定位问题的时候，都是非常重要的信息。线程堆栈 dump 可以了解当时 JVM 中所有线程的运行情况，比如线程的状态和当前正在运行的代码行。堆 dump 可以了解当时堆的使用情况，各个类实例的数量及各个实例所占用的空间大小。</p><h1>线程堆栈</h1><h2>使用 jstack</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jstack 是 JDK 自带的工具，用于 dump 指定进程 ID(PID)的 JVM 的线程堆栈信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;打印堆栈信息到标准输出&nbsp;jstack&nbsp;PID&nbsp;&nbsp;<br />#&nbsp;打印堆栈信息到标准输出，会打印关于锁的信息&nbsp;jstack&nbsp;-l&nbsp;PID&nbsp;&nbsp;<br />强制打印堆栈信息到标准输出，如果使用&nbsp;jstack&nbsp;PID&nbsp;没有响应的情况下(此时&nbsp;JVM&nbsp;进程可能挂起)，<br />加&nbsp;-F&nbsp;参数&nbsp;jstack&nbsp;-F&nbsp;PID&nbsp;</div></pre></div><h2>使用 jcmd</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jcmd 是 JDK 自带的工具，用于向 JVM 进程发送命令，根据命令的不同，可以代替或部分代替 jstack、jmap 等。可以发送命令&nbsp;<code>Thread.print</code>&nbsp;来打印出 JVM 的线程堆栈信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;下面的命令同等于&nbsp;jstack&nbsp;PID&nbsp;<br />jcmd&nbsp;PID&nbsp;Thread.print&nbsp;&nbsp;<br /><br />#&nbsp;同等于&nbsp;jstack&nbsp;-l&nbsp;PID&nbsp;<br />jcmd&nbsp;PID&nbsp;Thread.print&nbsp;-l&nbsp;</div></pre></div><h2>使用 kill -3</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">kill 可以向特定的进程发送信号(SIGNAL)，缺省情况是发送终止(TERM) 的信号 ，即 kill PID 与 kill -15 PID 或 kill -TERM PID 是等价的。JVM 进程会监听 QUIT 信号(其值为 3)，当收到这个信号时，会打印出当时的线程堆栈和堆内存使用概要，相比 jstack，此时多了堆内存的使用概要情况。但 jstack 可以指定 -l 参数，打印锁的信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->kill&nbsp;-3&nbsp;PID&nbsp;<br />#&nbsp;或&nbsp;kill&nbsp;-QUIT&nbsp;PID&nbsp;</div></pre></div><h1>堆</h1><h2>-XX:+HeapDumpOnOutOfMemoryError</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">添加 JVM 参数 -XX:+HeapDumpOnOutOfMemoryError 后，当发生 OOM(OutOfMemory)时，自动堆 dump。缺省情况下，JVM 会创建一个名称为 java_pidPID.hprof 的堆 dump 文件在 JVM 的工作目录下。但可以使用参数 -XX:HeapDumpPath=PATH 来指定 dump 文件的保存位置。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;JVM&nbsp;发生&nbsp;OOM&nbsp;时，会自动在&nbsp;/var/log/abc&nbsp;目录下产生堆&nbsp;dump&nbsp;文件&nbsp;java_pidPID.hprof&nbsp;<br />java&nbsp;-XX:+HeapDumpOnOutOfMemoryError&nbsp;-XX:HeapDumpPath=/var/log/abc/&nbsp;</div></pre></div><h2>jmap</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jmap 也是 JDK 自带的工具，主要用于获取堆相关的信息。</p><h3>堆 dump</h3><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;将&nbsp;JVM&nbsp;的堆&nbsp;dump&nbsp;到指定文件，如果堆中对象较多，需要的时间会较长，子参数&nbsp;format&nbsp;只支持&nbsp;b，<br />即二进制格式<br />jmap&nbsp;-dump:format=b,file=FILE_WITH_PATH<br /><br />#&nbsp;如果&nbsp;JVM&nbsp;进程未响应命令，可以加上参数&nbsp;-F&nbsp;尝试<br />jmap&nbsp;-F&nbsp;-dump:format=b,file=FILE_WITH_PATH<br /><br />#&nbsp;可以只&nbsp;dump&nbsp;堆中的存活对象，加上&nbsp;live&nbsp;子参数，但使用&nbsp;-F&nbsp;时不支持&nbsp;live<br />jmap&nbsp;-dump:live,format=b,file=FILE_WITH_PATH</div></pre></div><h3>获取堆概要信息</h3><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;-heap&nbsp;参数用于查看指定&nbsp;JVM&nbsp;进程的堆的信息，包括堆的各个参数的值，堆中新生代、年老代的内存大小、使用率等&nbsp;<br />jmap&nbsp;-heap&nbsp;PID&nbsp;&nbsp;<br /><br />#&nbsp;同样，如果&nbsp;JVM&nbsp;进程未响应命令，可以加上参数&nbsp;-F&nbsp;尝试&nbsp;<br />jmap&nbsp;-F&nbsp;-heap&nbsp;PID&nbsp;</div></pre></div><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">一个实例输出如下：</p><div style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->Attaching&nbsp;to&nbsp;process&nbsp;ID&nbsp;68322,&nbsp;please&nbsp;wait<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />Debugger&nbsp;attached&nbsp;successfully.<br />Server&nbsp;compiler&nbsp;detected.<br />JVM&nbsp;version&nbsp;is&nbsp;25.112-b16<br /><br />using&nbsp;thread-local&nbsp;object&nbsp;allocation.<br />Parallel&nbsp;GC&nbsp;with&nbsp;4&nbsp;thread(s)<br /><br />Heap&nbsp;Configuration:<br />&nbsp;&nbsp;&nbsp;MinHeapFreeRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;MaxHeapFreeRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;100<br />&nbsp;&nbsp;&nbsp;MaxHeapSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;268435456&nbsp;(256.0MB)<br />&nbsp;&nbsp;&nbsp;NewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;8388608&nbsp;(8.0MB)<br />&nbsp;&nbsp;&nbsp;MaxNewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;89128960&nbsp;(85.0MB)<br />&nbsp;&nbsp;&nbsp;OldSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;16777216&nbsp;(16.0MB)<br />&nbsp;&nbsp;&nbsp;NewRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2<br />&nbsp;&nbsp;&nbsp;SurvivorRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;8<br />&nbsp;&nbsp;&nbsp;MetaspaceSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;21807104&nbsp;(20.796875MB)<br />&nbsp;&nbsp;&nbsp;CompressedClassSpaceSize&nbsp;=&nbsp;1073741824&nbsp;(1024.0MB)<br />&nbsp;&nbsp;&nbsp;MaxMetaspaceSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;17592186044415&nbsp;MB<br />&nbsp;&nbsp;&nbsp;G1HeapRegionSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br /><br />Heap&nbsp;Usage:<br />PS&nbsp;Young&nbsp;Generation<br />Eden&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;41943040&nbsp;(40.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1701504&nbsp;(1.6226806640625MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;40241536&nbsp;(38.3773193359375MB)<br />&nbsp;&nbsp;&nbsp;4.05670166015625%&nbsp;used<br />From&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;4194304&nbsp;(4.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;4194304&nbsp;(4.0MB)<br />&nbsp;&nbsp;&nbsp;0.0%&nbsp;used<br />To&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;5242880&nbsp;(5.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;5242880&nbsp;(5.0MB)<br />&nbsp;&nbsp;&nbsp;0.0%&nbsp;used<br />PS&nbsp;Old&nbsp;Generation<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;30408704&nbsp;(29.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;12129856&nbsp;(11.56793212890625MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;18278848&nbsp;(17.43206787109375MB)<br />&nbsp;&nbsp;&nbsp;39.889421134159484%&nbsp;used<br /><br />16658&nbsp;interned&nbsp;Strings&nbsp;occupying&nbsp;1428472&nbsp;bytes.</div><span style="font-family: verdana, &quot;courier new&quot;; font-size: 14px;"><br />获取堆中的类实例统计</span></pre></div><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><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 />-->#&nbsp;打印&nbsp;JVM&nbsp;堆中的类实例统计信息，以占用内存的大小排序，同样，如果&nbsp;JVM&nbsp;未响应命令，也可以使用&nbsp;-F&nbsp;参数&nbsp;<br />jmap&nbsp;-histo&nbsp;PID&nbsp;&nbsp;<br /><br />#&nbsp;也可以只统计堆中的存活对象，加上&nbsp;live&nbsp;子参数，但使用&nbsp;-F&nbsp;时不支持&nbsp;live&nbsp;<br />jmap&nbsp;-histo:live&nbsp;PID&nbsp;</div></pre></div><h2>使用 jcmd</h2><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;等同&nbsp;jmap&nbsp;-dump:live,format=b,file=FILE_WITH_PATH<br />jcmd&nbsp;PID&nbsp;GC.heap_dump&nbsp;FILE_WITH_PATH<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-dump:format=b,file=FILE_WITH_PATH<br />jcmd&nbsp;PID&nbsp;GC.heap_dump&nbsp;-all&nbsp;FILE_WITH_PATH<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-histo:live&nbsp;PID<br />jcmd&nbsp;PID&nbsp;GC.class_histogram<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-histo&nbsp;PID<br />jcmd&nbsp;PID&nbsp;GC.class_histogram&nbsp;-all</div></pre></div><img src ="http://www.blogjava.net/paulwong/aggbug/435157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-24 22:03 <a href="http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用 jstatd 监控服务器</title><link>http://www.blogjava.net/paulwong/archive/2020/02/21/435144.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 21 Feb 2020 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/21/435144.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435144.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/21/435144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435144.html</trackback:ping><description><![CDATA[<br /><a href="https://www.jianshu.com/p/97f09e1648a6" target="_blank">https://www.jianshu.com/p/97f09e1648a6</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-21 17:08 <a href="http://www.blogjava.net/paulwong/archive/2020/02/21/435144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA进程无故退出而没有留下LOG？</title><link>http://www.blogjava.net/paulwong/archive/2020/02/20/435136.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 20 Feb 2020 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/20/435136.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435136.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/20/435136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435136.html</trackback:ping><description><![CDATA[LINUX通常有个OOM KILLER进程，对于他认为吃内存的进程，会根据一定的算分，执行kill -9杀掉，查看日志如下：<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 />-->#less /tmp/messages<br />Feb&nbsp;20&nbsp;03:55:09&nbsp;ip kernel:&nbsp;Out&nbsp;of&nbsp;memory:&nbsp;Kill&nbsp;process&nbsp;5974&nbsp;(java)&nbsp;score&nbsp;494&nbsp;or&nbsp;sacrifice&nbsp;child<br />Feb&nbsp;20&nbsp;03:55:09&nbsp;ip kernel:&nbsp;Killed&nbsp;process&nbsp;5974&nbsp;(java),&nbsp;UID&nbsp;1001,&nbsp;total-vm:23674020kB,&nbsp;anon-rss:17503912kB,&nbsp;file-rss:0kB,&nbsp;shmem-rss:0kB</div><br />那如何屏蔽呢？<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"><div>#/etc/cron.d/oom_disable</div>*/1****&nbsp;root&nbsp;pgrep&nbsp;-f&nbsp;"java"&nbsp;|&nbsp;while&nbsp;read&nbsp;PID<span style="color: #008000; ">;</span><span style="color: #008000; ">do&nbsp;echo&nbsp;-17&nbsp;&gt;&nbsp;/proc/$PID/oom_adj;done</span></div><br />参考文档：<br />Linux内核OOM机制的详细分析<br /><a href="http://blog.chinaunix.net/uid-29242873-id-3942763.html" target="_blank">http://blog.chinaunix.net/uid-29242873-id-3942763.html</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-20 15:57 <a href="http://www.blogjava.net/paulwong/archive/2020/02/20/435136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>!!21 MOST IMPORTANT JAVA 8 VM OPTIONS FOR SERVERS</title><link>http://www.blogjava.net/paulwong/archive/2020/02/16/435118.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 16 Feb 2020 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/16/435118.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435118.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/16/435118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435118.html</trackback:ping><description><![CDATA[<header style="position: relative; z-index: 1; margin: 0px auto; max-width: 474px; background-color: #ffffff; padding: 0px 30px 12px; color: #2b2b2b; font-family: Lato, sans-serif; font-size: 16px;"><h1><br /></h1><div style="border: 0px; font-family: inherit; font-size: 12px; font-style: inherit; margin: 0px auto 8px; outline: 0px; vertical-align: baseline; clear: both; color: #767676; line-height: 1.33333; text-transform: uppercase; max-width: 474px;"><span style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 10px 0px 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><a href="https://www.maknesium.de/21-most-important-java-8-vm-options-for-servers" rel="bookmark" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #767676; text-decoration-line: none;"><time datetime="2016-03-27T19:23:29+01:00">27/03/2016</time></a></span>&nbsp;<span style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 10px 0px 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><span vcard"="" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><a fn=""  n"="" href="https://www.maknesium.de/author/mak" rel="author" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #767676; text-decoration-line: none;">MAURICE KNOPP</a></span></span>&nbsp;<span style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 10px 0px 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><a href="https://www.maknesium.de/21-most-important-java-8-vm-options-for-servers#comments" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #767676; text-decoration-line: none;">7 KOMMENTARE</a></span></div></header><div style="border: 0px; font-family: Lato, sans-serif; font-size: 16px; margin: 0px auto; outline: 0px; padding-top: 12px; padding-right: 30px; padding-left: 30px; vertical-align: baseline; overflow-wrap: break-word; max-width: 474px; background-color: #ffffff; color: #2b2b2b;"><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">In this video I explain some 21 JVM parameters which are suited for most server applications. If you have any questions, you can read those links below for more information or just ask in the comments section.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;"></p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;"><a href="https://youtu.be/qevqQ2XRxpU" target="_blank" style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #24890d;"><img src="https://www.maknesium.de/wp-content/uploads/2013/10/java_video.jpg" alt="Java server flags video" width="474" height="316" size-full=""  wp-image-1630"="" srcset="https://www.maknesium.de/wp-content/uploads/2013/10/java_video.jpg 474w, https://www.maknesium.de/wp-content/uploads/2013/10/java_video-300x200.jpg 300w" sizes="(max-width: 474px) 100vw, 474px" style="border: 0px; vertical-align: middle; max-width: 100%; height: auto;" /></a></p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">I run several Java enterprise server applications. I often wondered &#8211; what are the best &#8222;default&#8220; JVM settings for a server application to start with in production? I read a lot on the web and tried several things myself and wanted to share what I found out, so far. Links containing more information about JVM optimization can be found here:</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">http://blog.sokolenko.me/2014/11/javavm-options-production.html</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">http://www.petefreitag.com/articles/gctuning/</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">http://stas-blogspot.blogspot.de/2011/07/most-complete-list-of-xx-options-for.html</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">&nbsp;</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">So let&#8217;s start:</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-server</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Use &#8222;-server&#8220;: All 64-bit JVMs use the server VM as default anyway. This setting generally optimizes the JVM for long running server applications instead of startup time. The JVM will collect more data about the Java byte code during program execution and generate the most efficient machine code via JIT.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-Xms=&lt;heap size&gt;[g|m|k] -Xmx=&lt;heap size&gt;[g|m|k]</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The &#8222;-Xmx/-Xms&#8220; settings specify the maximum and minimum values for the JVM heap memory. For servers, both params should have the same value to avoid heap resizing during runtime. I&#8217;ve applications running with 16GB heap sizes without an issue.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Depending on your application, you will have to try out how much memory will be best suited for your use case.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:MaxMetaspaceSize=&lt;metaspace size&gt;[g|m|k]</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Java 8 has no &#8222;Permanent Generation&#8220; (PermGen) anymore but requires additional &#8222;Metaspace&#8220; memory instead. This memory is used, in addition to the heap memory we specified before, for storing class meta data information.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The default size will be unlimited &#8211; I tend to limit MaxMetaspaceSize with a somewhat high value. Just in case something goes wrong with the application, the JVM will not hog all the memory of the server.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">I suggest: Let your application run for a couple of days to get a feeling for how much Metaspace Size it uses normally. Upon next restart of the application set the limit to e.g. double the value.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+CMSClassUnloadingEnabled</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Additionally, you might want to allow the JVM to unload classes which are held in memory but no code is pointing to them any more. If your application generates lots of dynamic classes, this is what you want.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+UseConcMarkSweepGC</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">This option makes the JVM use the ConcurrentMarkSweepGC &#8211; It can do much work in parallel to program execution but in some circumstances a &#8222;full GC&#8220; with a &#8222;STW pause&#8220; might still occur. I&#8217;ve read many articles and came to the conclusion that this GC is still the best one for server workloads.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+CMSParallelRemarkEnabled</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The option CMSParallelRemarkEnabled means the remarking is done in parallel to program execution &#8211; which is what you want if your server has many cores (and most servers do).</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;"> -XX:+UseCMSInitiatingOccupancyOnly  -XX:CMSInitiatingOccupancyFraction=&lt;percent&gt;</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Normally the GC will use heuristics to know when it&#8217;s time to clear memory. GC might kick in too late with default settings (causing full-Gcs).<br />Some sources say it might be a good idea to disable heuristics altogether and just use generation occupancy to start a CMS collection cycle. Setting values around 70% worked fine for all of my applications and use cases.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+ScavengeBeforeFullGC</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The first option tells the GC to first free memory by clearing out the &#8222;young generation&#8220; or fairly new objects before doing a full GC.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+CMSScavengeBeforeRemark</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">CMSScavengeBeforeRemark does attempt a minor collection before the CMS remark phase &#8211; thus keeping the remark pause afterwards short.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+CMSClassUnloadingEnabled</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The option &#8222;-XX:+CMSClassUnloadingEnabled&#8220; here tells the JVM to unload classes, which are not needed any more by the running application. If you deploy war files to an application server like wildfly, tomcat or glassfish without restarting the server after the deployment, this flag is for you.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">The option &#8222;-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses&#8220; is especially important if your application uses RMI (remote method invocation). The usage of RMI will cause the JVM to do a FULL-GC EVERY HOUR! This might be a very bad idea for large heap sizes because the FULL-GC pause might take up to several seconds. It would be better to do a concurrent GC and try to unload unused classes to free up more memory &#8211; which is exactly what the second option does.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:"&lt;path to log&gt;"</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">These options shown here will write out all GC related information to a specified log file. You can see how well your GC configuration works by looking into it.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">I personally prefer to use the &#8222;Visual GC&#8220; plug in for the &#8222;Visual VM&#8220; tool to monitor the general JVM and GC behavior.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=&lt;path to dump&gt;`date`.hprof</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">When your JVM runs out of memory, you will want to know why. Since the OOM error might be hard to reproduce and you want to get your production server up and running again &#8211; you should specify a path for a heap dump. When things have settled down, you can analyze the dump afterwards.</p><pre style="border: 1px solid rgba(0, 0, 0, 0.1); font-family: monospace, serif; font-size: 15px; font-style: inherit; font-weight: inherit; margin-top: 0px; margin-bottom: 24px; outline: 0px; padding: 12px; vertical-align: baseline; hyphens: none; line-height: 1.6; box-sizing: border-box; max-width: 100%; overflow: auto; white-space: pre-wrap; overflow-wrap: break-word;">-Djava.rmi.server.hostname=&lt;external IP&gt; -Dcom.sun.management.jmxremote.port=&lt;port&gt;</pre><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">These options will help you to specify an IP and port for JMX &#8211; you will need those ports open to connect remotely to a JVM running on a server for tools like VisualVM. You can gain deep insights over cpu and memory usage, gc behaviour, class loading, thread count and usage of your application this way.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;"><img wp-image-1584"="" src="http://www.maknesium.de/wp-content/uploads/2016/03/Selection_002-300x200.png" alt="Visual VM" width="500" height="333" srcset="https://www.maknesium.de/wp-content/uploads/2016/03/Selection_002-300x200.png 300w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_002-768x512.png 768w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_002-1024x682.png 1024w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_002.png 1061w" sizes="(max-width: 500px) 100vw, 500px" style="border: 0px; vertical-align: middle; display: block; margin: 7px auto; max-width: 100%; height: auto;" /><br />Lastly, I would like to recommend to you the VisualVM tool which is bundled with the Java 8 JDK. You can use it to gain more insights about your specific application behaviour on the JVM &#8211; like cpu and memory usage, thread utilisation and much more.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;"><img wp-image-1585"="" src="http://www.maknesium.de/wp-content/uploads/2016/03/Selection_003-300x172.png" alt="Visual GC" width="500" height="287" srcset="https://www.maknesium.de/wp-content/uploads/2016/03/Selection_003-300x172.png 300w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_003-768x441.png 768w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_003-1024x588.png 1024w, https://www.maknesium.de/wp-content/uploads/2016/03/Selection_003.png 1066w" sizes="(max-width: 500px) 100vw, 500px" style="border: 0px; vertical-align: middle; display: block; margin: 7px auto; max-width: 100%; height: auto;" />VisualVM can be extended with a plug in called &#8222;Visual GC&#8220;. It will briefly show you VERY detailed information about the usage of the young and old generation object spaces. You can easily spot problems with garbage collection simply by analyzing these graphs during application runtime.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Thank you very much for watching! If you liked the video you might consider giving it a &#8222;thumbs up&#8220;. If you have any questions &#8211; just put them in the comments section. I will reply as quickly as possible.<br /><br />-------------------------------------------------------<br /><br /></p><p style="border: 0px; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">-XX:+UseCompressedOops [If Max Heap allocation is less than 32GB]<br />This can save a significant amount of memory and this option should already be enabled by default on recent java 8 versions. This option allowes object references to be stored as 32-bit values instead of 64-bit on 64-bit JVMs. This leads to before mentioned memory savings.</p><p style="border: 0px; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">-XX:+AggressiveOpts<br />This option will enable performance options which are hoped to become enabled by default in upcoming released of the JVM. This option sets some performance settings but is marked as experimental! So you should only enable it, when you have to possibility to test your application thoroughly before enabling this flag on an production server.</p><p style="border: 0px; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">-XX:+UseStringDeduplication<br />Since Java 8 update 20 you can use this option to reduce the memory usage of your application. The JVM will spot identical strings in memory, remove the duplicated and point all references to the remaining, single instance of the string.</p><p style="border: 0px; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">-XX:+UseG1GC<br />Will tell the JVM to use the most recent G1 garbage collector. You are trading better application response times (due to shorter gc times with G1) against lower throughput (compared against good old ConcMarkSweepGC / CMS). If your application can deliver more value through short gc times, then G1 is definately better suited. Otherwise on Java 8, I&#8217;d recommend sticking with CMS.</p><p style="border: 0px; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;">Concerning your Tomcat 8 question, I&#8217;d suggest you have a look into it with the &#8222;VisualVM&#8220; tool. Look at memory usage, GC times (visual GC plugin), pull and analyse stack traces or thread dumps to find the weak spot. You might also consider attaching a debugger to tomcat to find the bug.</p><p style="border: 0px; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px 0px 24px; outline: 0px; padding: 0px; vertical-align: baseline;"><br /><br /><a href="https://www.maknesium.de/21-most-important-java-8-vm-options-for-servers" target="_blank">https://www.maknesium.de/21-most-important-java-8-vm-options-for-servers</a></p></div><img src ="http://www.blogjava.net/paulwong/aggbug/435118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-16 22:30 <a href="http://www.blogjava.net/paulwong/archive/2020/02/16/435118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]巅峰对决 - 框架的性能比较</title><link>http://www.blogjava.net/paulwong/archive/2016/05/03/430327.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 03 May 2016 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/05/03/430327.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/430327.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/05/03/430327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/430327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/430327.html</trackback:ping><description><![CDATA[<p style="color: #2e415c; font-family: Arial, Helvetica, sans-serif; background-color: #fefefe;">转自：<a href="http://colobu.com/2016/04/25/performance-comparison-of-frameworks/" target="_blank">http://colobu.com/2016/04/25/performance-comparison-of-frameworks/</a><br />这句话也可以应用在软件开发上，"无快不破"强调的是软件的性能。我陆陆续续写了多篇各种框架的文章，也在github上开了多个性能比较的开源项目，本文做一个汇总，以备将来的查找。<br /><a target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc; text-decoration: underline;"></a></p><ol style="color: #2e415c; font-family: Arial, Helvetica, sans-serif; background-color: #fefefe;"><li><a href="http://colobu.com/2016/02/26/techempower-benchmarks-round12/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的web服务器</a></li><li><a href="http://colobu.com/2016/02/23/1M-threads-microbenchmark/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的并发框架</a></li><li><a href="http://colobu.com/2015/07/16/rpc-framework-performance-comparison/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的RPC服务器</a></li><li><a href="http://colobu.com/2015/07/14/performance-comparison-of-7-websocket-frameworks/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的websocket框架</a></li><li><a href="http://colobu.com/2015/11/17/Jax-RS-Performance-Comparison/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的RESTful框架</a></li><li><a href="http://colobu.com/2016/03/16/why-is-go-gencode-so-fast/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的Go序列化框架</a></li><li><a href="http://colobu.com/2016/04/06/the-fastest-golang-web-framework/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的Go web框架</a></li><li><a href="http://colobu.com/2014/08/26/java-serializer-comparison/" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">最快的Java序列化框架</a></li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/430327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2016-05-03 14:36 <a href="http://www.blogjava.net/paulwong/archive/2016/05/03/430327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深度技术揭秘，支付宝，财付通，到底每天都是怎样工作的？</title><link>http://www.blogjava.net/paulwong/archive/2015/09/09/427233.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 09 Sep 2015 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/09/09/427233.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/427233.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/09/09/427233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/427233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/427233.html</trackback:ping><description><![CDATA[<div do_not_catch"="" style="word-break: break-all; word-wrap: break-word; font-family: Arial; padding-right: 18.296875px; padding-left: 4.5625px; margin: 0px 0px 18.296875px; line-height: normal; background-color: #f9f9ec;">为了可以更好地解释支付结算系统对账过程，我们先把业务从头到尾串起来描述一下场景，帮助大家理解：一个可能得不能再可能的场景，请大家深刻理解里面每个角色做了什么，获取了哪些信息：　　某日阳光灿烂，支付宝用户小明在淘宝上看中了暖脚器一只，价格100元。犹豫再三后小明使用支付宝网银完成了支付，支付宝显示支付成功，淘宝卖家通知他已发货，最近几日注意查收。<br />　　小明：持卡人，消费者，淘宝和支付宝的注册会员，完成了支付动作，自己的银行账户资金减少，交易成功。<br />　　银行：收单银行，接受来自支付宝的名为&#8220;支付宝BBB&#8221;的100元订单，并引导持卡人小明支付成功，扣除小明银行卡账户余额后返回给支付宝成功通知，并告诉支付宝这笔交易在银行流水号为&#8220;银行CCC&#8221;<br />　　支付宝：支付公司，接收到淘宝发来的订单号为&#8220;淘宝AAA&#8221;的商户订单号，并形成支付系统唯一流水号：&#8220;支付宝BBB&#8221;发往银行系统。然后获得银行回复的支付成功信息，顺带银行流水号&#8220;银行CCC&#8221;<br />　　淘宝：我们支付公司称淘宝这类电商为商户，是支付系统的客户。淘宝向支付系统发送了一笔交易收单请求，金额为100，订单号为:&#8220;淘宝AAA&#8221;，支付系统最后反馈给淘宝这笔支付流水号为&#8220;支付BBB&#8221;<br />　　以上流程貌似大家都达到了预期效果，但实际上仍然还有一个问题：<br />　　对支付公司（支付宝）而言，虽然银行通知了它支付成功，但资金实际还要T+1后结算到它银行账户，所以目前只是一个信息流，资金流还没过来。<br />　　Tips:插一句话，对支付系统内部账务来说，由于资金没有能够实时到账，所以此时小明的这笔100元交易资金并没有直接记入到系统资产类科目下的&#8220;银行存款&#8221;科目中，而是挂在&#8220;应收账款&#8221;或者&#8220;待清算科目&#8221;中。大白话就是，这100元虽然答应给我了，我也记下来了，但还没收到，我挂在那里。<br />　　对商户（淘宝）而言，虽然支付公司通知了它支付成功，他也发货了，但资金按照合同也是T+1到账。如果不对账确认一下，恐怕也会不安。<br />　　倒是对消费者（小明）而言：反正钱付了，你们也显示成功了，等暖脚器呀等暖脚器~<br />　　基于支付公司和商户的困惑，我们的支付结算系统需要进行两件事情：一是资金渠道对账，通称对银行帐；二是商户对账，俗称对客户帐。对客户帐又分为对公客户和对私客户，通常对公客户会对对账文件格式、对账周期、系统对接方案有特殊需求，而对私客户也就是我们一般的消费者只需要可以后台查询交易记录和支付历史流水就可以了。<br />　　我们先聊银行资金渠道对账，由于支付公司的资金真正落地在商业银行，所以资金渠道的对账显得尤为重要。<br />　　在一个银行会计日结束后，银行系统会先进行自己内部扎帐，完成无误后进行数据的清分和资金的结算，将支付公司当日应入账的资金结算到支付公司账户中。于此同时，目前多数银行已经支持直接系统对接的方式发送对账文件。于是，在某日临晨4点，支付宝系统收到来自银行发来的前一会计日对账文件。根据数据格式解析正确后和前日支付宝的所有交易数据进行匹配，理想情况是一一匹配成功无误，然后将这些交易的对账状态勾对为&#8220;已对账&#8221;。<br />　　Tips:此时，对账完成的交易，会将该笔资金从&#8220;应收账款&#8221;或者&#8220;待清算账款&#8221;科目中移动到&#8220;银行存款&#8221;科目中，以示该交易真正资金到账。<br />　　以上太理想了，都那么理想就不要对账了。所以通常都会出一些差错，那么我总结了一下常见的差错情况：<br />　　<span style="color: #ff0000;"><strong>1.支付时提交到银行后没有反馈，但对账时该交易状态为支付成功</strong></span><br />　　这种情况很正常，因为我们在信息传输过程中，难免会出现掉包和信息不通畅。消费者在银行端完成了支付行为，银行的通知信息却被堵塞了，如此支付公司也不知道结果，商户也不知道结果。如果信息一直没法通知到支付公司这边，那么这条支付结果就只能在日终对账文件中体现了。这时支付公司系统需要对这笔交易进行补单操作，将交易置为成功并完成记账规则，有必要还要通知到商户。<br />　　此时的小明：估计急的跳起来了&#8230;&#8230;付了钱怎么不给说支付成功呢！坑爹！<br />　　TIPS：通常银行系统会开放一个支付结果查询接口。支付公司会对提交到银行但没有回复结果的交易进行间隔查询，以确保支付结果信息的实时传达。所以以上情况出现的概率已经很少了。<br />　　<span style="color: #ff0000;"><strong>2.我方支付系统记录银行反馈支付成功，金额为100，银行对账金额不为100</strong></span><br />　　这种情况已经不太常见了，差错不管是长款和短款都不是我们想要的结果。通常双方系统通讯都是可作为纠纷凭证的，如果银行在支付结果返回时确认是100元，对账时金额不一致，可以要求银行进行协调处理。而这笔账在支付系统中通常也会做对应的挂账处理，直到纠纷解决。<br />　　<span style="color: #ff0000;"><strong>3.我方支付系统记录银行反馈支付成功，但对账文件中压根不存在</strong></span><br />　　这种情况也经常见到，因为跨交易会计日的系统时间不同，所以会出现我们认为交易是23点59分完成的，银行认为是第二天凌晨0点1分完成。对于这种情况我们通常会继续挂账，直到再下一日的对账文件送达后进行对账匹配。<br />　　如果这笔交易一直没有找到，那么就和第二种情况一样，是一种短款，需要和银行追究。<br />　　以上情况针对的是一家银行资金渠道所作的流程，实际情况中，支付公司会在不同银行开立不同银行账户，用以收单结算（成本会降低），所以真实情况极有可能是：<br />　　临晨1点，工行对账文件丢过来（支行A）<br />　　临晨1点01分，工行又丢一个文件过来（支行B）<br />　　临晨1点15分，农行对账文件丢过来<br />　　。&nbsp;。&nbsp;。<br />　　临晨5点，兴业银行文件丢过来<br />　　。。。<br />　　不管什么时候，中国银行都必须通过我方业务员下载对账文件再上传的方式进行对账，所以系统接收到中行文件一般都是早上9点05分&#8230;&#8230;<br />　　对系统来说，每天都要处理大量并发的对账数据，如果在交易高峰时段进行，会引起客户交互的延迟和交易的失败，这是万万行不得的所以通常支付公司不会用那么傻的方式处理数据，而是在一个会计日结束后，通常也是临晨时段，将前一日交易增量备份到专用对账服务器中，在物理隔绝环境下进行统一的对账行为，杜绝硬件资源的抢占。<br />　　以上是银行资金渠道入款的对账，出款基本原理一致，不过出款渠道在实际业务过程中还有一些特别之处，由于大家不是要建设系统，我就不赘述了。<br />　　谈完了资金渠道的对账，我们再来看看对客户帐。<br />　　前面提到了，由于资金落在银行，所以对支付公司来说，对银行帐非常重要。那么同理，由于资金落在支付公司，所以对商户来说，对支付公司账也一样重要。能否提供高品质甚至定制化的服务，是目前支付公司走差异化路线的一个主要竞争点。<br />　　之前说过，银行与支付公司之间的通讯都是可以作为纠纷凭证的。原理是对支付报文的关键信息进行密钥加签+md5处理，以确保往来报文&#8220;不可篡改，不可抵赖&#8221;。<br />　　同理，支付公司和商户之间也会有类似机制保证报文的可追溯性，由此我们可以知道，一旦我方支付系统通知商户支付结果，那么我们就要为此承担责任。由此我们再推断一个结论：<br />　　即便某支付订单银行方面出错导致资金未能到账，一旦我们支付系统通知商户该笔交易成功，那么根据协议该结算的资金还是要结算给这个商户。自然，我们回去追究银行的问题，把账款追回。<br />　　没经过排版的小知识点---------------------------------------------------<br />　　一、对支付系统而言，最基本的对账功能是供商户在其后台查询下载某一时间段内的支付数据文件，以供商户自己进行对账。<br />　　这个功能应该是个支付公司就有，如果没有就别混了。<br />　　二、对大多数支付系统而言，目前已经可以做到对账文件的主动投送功能。<br />　　这个功能方便了商户系统和支付系统的对接，商户的结算人员无须登录支付平台后台下载文件进行对账，省去了人工操作的麻烦和风险。<br />　　对大型支付系统而言，商户如果跨时间区域很大，反复查询该区域内的数据并下载，会对服务器造成比较大的压力。各位看官别笑，觉得查个数据怎么就有压力了。实际上为了这个查询，我最早就职的一家支付公司重新优化了所有SQL语句，并且因为查询压力过大服务器瘫痪过好几次。<br />　　现在比较主流的做法是把商户短期内查询过、或者经常要查询的数据做缓存。实在不行就干脆实时备份，两分钟同步一次数据到专用数据库供商户查询，以避免硬件资源占用。甚至&#8230;&#8230;大多数支付公司都会对查询范围跨度和历史事件进行限制，比如最多只能查一个月跨度内，不超过24个月前的数据&#8230;&#8230;以避免服务嗝屁。<br />　　对账这块大致就这样了，再往细的说就说不完了，<br />　　风险控制，在各行各业都尤其重要。<br />　　金融即风险，控制好风险，才有利润。<br />　　虽然第三方支付严格意义上说并非属于金融行业，但由于涉及资金的清分和结算，业务主体又是资金的收付，所以风险控制一样非常重要。<br />　　对支付公司来说，风控主要分为合规政策风控以及交易风控两种。<br />　　前者主要针对特定业务开展，特定产品形态进行法规层面的风险规避，通常由公司法务和风控部门一起合作进行。例如，一家公司要开展第三方支付业务，现在要获得由人民银行颁发的&#8220;支付业务许可证&#8221;。遵守中国对于金融管制的所有条规，帮助人行监控洗钱行为&#8230;&#8230;这些法规合规风险，虽然条条框框，甚至显得文绉绉，但如果没人解读没人公关，业务都会无法开展。<br />　　当然，这块也不是本题所关注的重点，提问者关注的，应当是业务进行过程中的交易风控环节。<br />　　现在随着各支付公司风险控制意识的加强，风控系统渐渐被重视起来。除了上述提到的合规风控相关功能，风控系统最讲技术含量，最讲业务水平，最考究数据分析的业务就是交易风控环节。<br />　　对一笔支付交易而言，在它发生之前、发生过程中及发生过程后，都会被风控系统严密监控，以确保支付及客户资产安全。而所有的所有秘密，都归结到一个词头上：规则。风控系统是一系列规则的集合，任何再智能的风控方案，都绕不开规则二字。<br />　　我们先看看，哪些情况是交易风控需要监控处理的：<br />　　<strong><span style="color: #ff0000;">1.钓鱼网站</span></strong><br />　　什么是钓鱼呢？<br />　　用我的说法，就是利用技术手段蒙蔽消费者，当消费者想付款给A的时候，替换掉A的支付页面，将钱付给B，以达成非法占用资金的目的。<br />　　还有更低级的，直接就是发小广告，里面带一个类似<a target="_blank" href="http://www.viidii.info/?http://tiaobao______com&amp;z" style="text-decoration: none; color: #2f5fa1; cursor: pointer;">http://tiaobao.com</a>的网址，打开后和淘宝页面一摸一样，上当客户直接付款给假冒网站主。<br />　　第一种情况风控系统是可以通过规则进行简单判定的，虽然有误杀，但不会多。<br />　　通常使用的规则是判断提交订单的IP地址和银行实际支付完成的IP地址是否一致，如果不一致，则判断为钓鱼网站风险交易，进入待确认订单。<br />　　但第二种情况，亲爹亲娘了，支付公司真的没办法。当然遇到客户投诉后可能会事后补救，但交易是无法阻止了。<br />　　<span style="color: #ff0000;"><strong>2.盗卡组织利用盗卡进行交易</strong></span><br />　　大家都知道，信用卡信息是不能随便公布给别人的，国内大多信用卡虽然都设置了密码，但银行仍然会开放无磁无密支付接口给到商户进行快速支付之用。<br />　　所谓无磁无密，就是不需要磁道信息，不需要密码就可以进行支付的通道。只需要获取到客户的CVV，有效期，卡号三个核心信息，而这三个信息是在卡上直接有的，所以大家不要随便把卡交给别人哦~<br />　　碰到类似的这种交易，风控系统就不会像钓鱼网站这样简单判断了。<br />　　过去我们所有的历史交易，都会存库，不仅会存支付相关信息，更会利用网页上的控件（对，恶心的activex或者目前用的比较多的flash控件）抓取支付者的硬件信息，存储在数据库中。<br />　　当一笔交易信息带着能够搜集到的硬件信息一同提交给风控系统时，风控系统会进行多种规则判定。<br />　　例如：当天该卡是否交易超过3次<br />　　当天该IP是否交易超过3次<br />　　该主机CPU的序列号是否在黑名单之列<br />　　等等等等，一批规则跑完后，风控系统会给该交易进行加权评分，标示其风险系数，然后根据评分给出处理结果。<br />　　通过硬件信息采集以及历史交易记录回溯，我们可以建立很多交易风控规则来进行监控。所以规则样式的好坏，规则系数的调整，就是非常重要的用以区别风控系统档次高低的标准。<br />　　例如，我听说著名的风控厂商RED，有一个&#8220;神经网络&#8221;机制，灰常牛逼。<br />　　<img src="http://s4.ihostimg.com/s4/20150714011953h58bs.jpeg" style="border: 0px; cursor: pointer;"  alt="" />&nbsp;<br />　　其中有一个规则我到现在还记忆犹新：<br />　　某人早上八点在加利福尼亚进行了信用卡支付，到了下午一点，他在东亚某小国家发起了信用卡支付申请。系统判断两者距离过长，不是短短5小时内能够到达的，故判定交易无效，支付请求拒绝。<br />　　规则非常重要，当然，数据也一样重要。我们不仅需要从自己的历史记录中整合数据，同时还要联合卡组织、银行、风控机构，购买他们的数据和风控服务用来增加自己的风控实力。<br />　　SO，风控是一个不断积累数据、分析数据、运营数据、积累数据的循环过程。<br />　　好的风控规则和参数，需要经过无数次的规则修改和调整，是一个漫长的过程。<br />　　不知道大家做互联网，有没有利用GA做过AB测试，同样的，风控系统也需要反复地做类似AB测试的实验，以保证理论和实际的匹配。<br />　　最后给大家说一个小小的概念：<br />　　所谓风控，是指风险控制，不是风险杜绝。<br />　　风控的目标一定不是把所有风险全部杜绝。<br />　　合理的风控，目标一定是：利润最大化，而不是风险最小化<br />　　过于严格的风控规则，反而会伤害公司利益（看看销售和风控经常打架就知道了）<br />　　不光是交易的风控，我们日常制定规则，法规，公司流程，也一定要秉着这个出发点进行规划。</div><img src ="http://www.blogjava.net/paulwong/aggbug/427233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-09-09 23:09 <a href="http://www.blogjava.net/paulwong/archive/2015/09/09/427233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高并发情况下怎样尽量实现无锁编程</title><link>http://www.blogjava.net/paulwong/archive/2015/07/13/426201.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 13 Jul 2015 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/07/13/426201.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/426201.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/07/13/426201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/426201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/426201.html</trackback:ping><description><![CDATA[<span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　一个在线2k的游戏，每秒钟并发都吓死人。传统的hibernate直接插库基本上是不可行的。我就一步步推导出一个无锁的数据库操作。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　1. 并发中如何无锁。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　一个很简单的思路，把并发转化成为单线程。Java的Disruptor就是一个很好的例子。如果用java的concurrentCollection类去做，原理就是启动一个线程，跑一个Queue，并发的时候，任务压入Queue，线程轮训读取这个Queue，然后一个个顺序执行。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　在这个设计模式下，任何并发都会变成了单线程操作，而且速度非常快。现在的node.js, 或者比较普通的ARPG服务端都是这个设计，&#8220;大循环&#8221;架构。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　这样，我们原来的系统就有了2个环境：并发环境 + &#8221;大循环&#8220;环境</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　并发环境就是我们传统的有锁环境，性能低下。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　&#8221;大循环&#8220;环境是我们使用Disruptor开辟出来的单线程无锁环境，性能强大。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　2. &#8221;大循环&#8220;环境 中如何提升处理性能。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　一旦并发转成单线程，那么其中一个线程一旦出现性能问题，必然整个处理都会放慢。所以在单线程中的任何操作绝对不能涉及到IO处理。那数据库操作怎么办？</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　增加缓存。这个思路很简单，直接从内存读取，必然会快。至于写、更新操作，采用类似的思路，把操作提交给一个Queue，然后单独跑一个Thread去一个个获取插库。这样保证了&#8220;大循环&#8221;中不涉及到IO操作。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　问题再次出现：</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　如果我们的游戏只有个大循环还容易解决，因为里面提供了完美的同步无锁。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　但是实际上的游戏环境是并发和&#8220;大循环&#8221;并存的，即上文的2种环境。那么无论我们怎么设计，必然会发现在缓存这块上要出现锁。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　3. 并发与&#8220;大循环&#8221;如何共处，消除锁？</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　我们知道如果在&#8220;大循环&#8221;中要避免锁操作，那么就用&#8220;异步&#8221;，把操作交给线程处理。结合这2个特点，我稍微改下数据库架构。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　原本的缓存层，必然会存在着锁，例如：</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><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"><span style="color: #0000FF; ">public</span>&nbsp;TableCache<br />{<br />　　<span style="color: #0000FF; ">private</span>&nbsp;HashMap&lt;String,&nbsp;Object&gt;&nbsp;caches&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentHashMap&lt;String,&nbsp;Object&gt;();<br />}</div><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　这个结构是必然的了，保证了在并发的环境下能够准确的操作缓存。但是&#8221;大循环&#8220;却不能直接操作这个缓存进行修改，所以必须启动一个线程去更新缓存，例如：</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><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: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ExecutorService&nbsp;EXECUTOR&nbsp;=&nbsp;Executors.newSingleThreadExecutor();<br /><br />　　EXECUTOR.execute(<span style="color: #0000FF; ">new</span>&nbsp;LatencyProcessor(logs));<br /><br />　　<span style="color: #0000FF; ">class</span>&nbsp;LatencyProcessor&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Runnable<br />　　{<br />&nbsp; &nbsp; 　　<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()<br />　　 &nbsp; {<br />&nbsp; &nbsp; &nbsp;　　<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;这里可以任意的去修改内存数据。采用了异步。</span><span style="color: #008000; "><br /></span>　　 &nbsp;}<br />　　}</div><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　OK，看起来很漂亮。但是又有个问题出现了。在高速存取的过程中，非常有可能缓存还没有被更新，就被其他请求再次获取，得到了旧的数据。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　4. 如何保证并发环境下缓存数据的唯一正确？</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　我们知道，如果只有读操作，没有写操作，那么这个行为是不需要加锁的。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　我使用这个技巧，在缓存的上层，再加一层缓存，成为&#8221;一级缓存&#8220;，原来的就自然成为&#8221;二级缓存&#8220;。有点像CPU了对不？</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　一级缓存只能被&#8221;大循环&#8220;修改，但是可以被并发、&#8221;大循环&#8220;同时获取，所以是不需要锁的。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　当发生数据库变动，分2种情况：</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　1）并发环境下的数据库变动，我们是允许有锁的存在，所以直接操作二级缓存，没有问题。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　2）&#8221;大循环&#8220;环境下数据库变动，首先我们把变动数据存储在一级缓存，然后交给异步修正二级缓存，修正后删除一级缓存。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　这样，无论在哪个环境下读取数据，首先判断一级缓存，没有再判断二级缓存。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　这个架构就保证了内存数据的绝对准确。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　而且重要的是：我们有了一个高效的无锁空间，去实现我们任意的业务逻辑。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　最后，还有一些小技巧提升性能。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　1. 既然我们的数据库操作已经被异步处理，那么某个时间，需要插库的数据可能很多，通过对表、主键、操作类型的排序，我们可以删除一些无效操作。例如：</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　a）同一个表同一个主键的多次UPdate，取最后一次。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　b）同一个表同一个主键，只要出现Delete，前面所有操作无效。</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　2. 既然我们要对操作排序，必然会存在一个根据时间排序，如何保证无锁呢？使用</span><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><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: #0000FF; ">&nbsp; &nbsp; &nbsp;private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;AtomicLong&nbsp;_seq&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;AtomicLong(0);</div><br style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;" /><span style="color: #454545; font-family: arial, 宋体, sans-serif, tahoma, 'Microsoft YaHei'; line-height: 24px; background-color: #ffffff;">　　即可保证无锁又全局唯一自增，作为时间序列。</span><img src ="http://www.blogjava.net/paulwong/aggbug/426201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-07-13 18:20 <a href="http://www.blogjava.net/paulwong/archive/2015/07/13/426201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM监控与调优</title><link>http://www.blogjava.net/paulwong/archive/2015/05/14/425064.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 14 May 2015 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/05/14/425064.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/425064.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/05/14/425064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/425064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/425064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 光说不练假把式，学习Java GC机制的目的是为了实用，也就是为了在JVM出现问题时分析原因并解决之。通过学习，我觉得JVM监控与调优主要的着眼点在于如何配置、如何监控、如何优化3点上。下面就将针对这3点进行学习。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（如果您对Java的内存区域划分和内存回收机制尚不明确，那在阅读本文前，请先阅读我的前一篇博客《Java系列笔记(3) - J...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/05/14/425064.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/425064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-05-14 09:44 <a href="http://www.blogjava.net/paulwong/archive/2015/05/14/425064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING CACHE之ConcurrentMapCacheManager改造</title><link>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 25 Feb 2015 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/423034.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/423034.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/423034.html</trackback:ping><description><![CDATA[ConcurrentMapCacheManager可以作为一种缓存方案，但不能设置过期，最大缓存条目等，需进行改造。<br />
<ol>
     <li>pom.xml中加入依赖包<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 />-->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>com.google.guava<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>guava<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>18.0<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>改造CacheManager，MyConcurrentMapCacheManager<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: #0000FF; ">package</span>&nbsp;com.paul.common.cache;<br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Copyright&nbsp;2002-2014&nbsp;the&nbsp;original&nbsp;author&nbsp;or&nbsp;authors.<br />&nbsp;*<br />&nbsp;*&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br />&nbsp;*&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance&nbsp;with&nbsp;the&nbsp;License.<br />&nbsp;*&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at<br />&nbsp;*<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: #008000; "><br />&nbsp;*<br />&nbsp;*&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software<br />&nbsp;*&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,<br />&nbsp;*&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.<br />&nbsp;*&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and<br />&nbsp;*&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collection;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collections;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ConcurrentHashMap;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.ConcurrentMap;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.TimeUnit;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.Cache;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.CacheManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.concurrent.ConcurrentMapCache;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.google.common.cache.CacheBuilder;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;CacheManager}&nbsp;implementation&nbsp;that&nbsp;lazily&nbsp;builds&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;ConcurrentMapCache}<br />&nbsp;*&nbsp;instances&nbsp;for&nbsp;each&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#getCache}&nbsp;request.&nbsp;Also&nbsp;supports&nbsp;a&nbsp;'static'&nbsp;mode&nbsp;where<br />&nbsp;*&nbsp;the&nbsp;set&nbsp;of&nbsp;cache&nbsp;names&nbsp;is&nbsp;pre-defined&nbsp;through&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#setCacheNames},&nbsp;with&nbsp;no<br />&nbsp;*&nbsp;dynamic&nbsp;creation&nbsp;of&nbsp;further&nbsp;cache&nbsp;regions&nbsp;at&nbsp;runtime.<br />&nbsp;*<br />&nbsp;*&nbsp;&lt;p&gt;Note:&nbsp;This&nbsp;is&nbsp;by&nbsp;no&nbsp;means&nbsp;a&nbsp;sophisticated&nbsp;CacheManager;&nbsp;it&nbsp;comes&nbsp;with&nbsp;no<br />&nbsp;*&nbsp;cache&nbsp;configuration&nbsp;options.&nbsp;However,&nbsp;it&nbsp;may&nbsp;be&nbsp;useful&nbsp;for&nbsp;testing&nbsp;or&nbsp;simple<br />&nbsp;*&nbsp;caching&nbsp;scenarios.&nbsp;For&nbsp;advanced&nbsp;local&nbsp;caching&nbsp;needs,&nbsp;consider<br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;org.springframework.cache.guava.GuavaCacheManager}&nbsp;or<br />&nbsp;*&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;org.springframework.cache.ehcache.EhCacheCacheManager}.<br />&nbsp;*<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Juergen&nbsp;Hoeller<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;3.1<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;ConcurrentMapCache<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyConcurrentMapCacheManager&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CacheManager&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ConcurrentMap&lt;String,&nbsp;Cache&gt;&nbsp;cacheMap&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentHashMap&lt;String,&nbsp;Cache&gt;(16);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;allowNullValues&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;expireTime&nbsp;=&nbsp;30;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;maximumSize&nbsp;=&nbsp;100;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Construct&nbsp;a&nbsp;dynamic&nbsp;ConcurrentMapCacheManager,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;lazily&nbsp;creating&nbsp;cache&nbsp;instances&nbsp;as&nbsp;they&nbsp;are&nbsp;being&nbsp;requested.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyConcurrentMapCacheManager()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Construct&nbsp;a&nbsp;static&nbsp;ConcurrentMapCacheManager,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;managing&nbsp;caches&nbsp;for&nbsp;the&nbsp;specified&nbsp;cache&nbsp;names&nbsp;only.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyConcurrentMapCacheManager(<span style="color: #0000FF; ">long</span>&nbsp;expireTime,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;maximumSize)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(expireTime&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.expireTime&nbsp;=&nbsp;expireTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(maximumSize&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.maximumSize&nbsp;=&nbsp;maximumSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Specify&nbsp;the&nbsp;set&nbsp;of&nbsp;cache&nbsp;names&nbsp;for&nbsp;this&nbsp;CacheManager's&nbsp;'static'&nbsp;mode.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;The&nbsp;number&nbsp;of&nbsp;caches&nbsp;and&nbsp;their&nbsp;names&nbsp;will&nbsp;be&nbsp;fixed&nbsp;after&nbsp;a&nbsp;call&nbsp;to&nbsp;this&nbsp;method,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;with&nbsp;no&nbsp;creation&nbsp;of&nbsp;further&nbsp;cache&nbsp;regions&nbsp;at&nbsp;runtime.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Calling&nbsp;this&nbsp;with&nbsp;a&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;collection&nbsp;argument&nbsp;resets&nbsp;the<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;mode&nbsp;to&nbsp;'dynamic',&nbsp;allowing&nbsp;for&nbsp;further&nbsp;creation&nbsp;of&nbsp;caches&nbsp;again.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setCacheNames(Collection&lt;String&gt;&nbsp;cacheNames)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cacheNames&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(String&nbsp;name&nbsp;:&nbsp;cacheNames)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.put(name,&nbsp;createConcurrentMapCache(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Specify&nbsp;whether&nbsp;to&nbsp;accept&nbsp;and&nbsp;convert&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;values&nbsp;for&nbsp;all&nbsp;caches<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;in&nbsp;this&nbsp;cache&nbsp;manager.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Default&nbsp;is&nbsp;"true",&nbsp;despite&nbsp;ConcurrentHashMap&nbsp;itself&nbsp;not&nbsp;supporting&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;values.&nbsp;An&nbsp;internal&nbsp;holder&nbsp;object&nbsp;will&nbsp;be&nbsp;used&nbsp;to&nbsp;store&nbsp;user-level&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}s.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p&gt;Note:&nbsp;A&nbsp;change&nbsp;of&nbsp;the&nbsp;null-value&nbsp;setting&nbsp;will&nbsp;reset&nbsp;all&nbsp;existing&nbsp;caches,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;if&nbsp;any,&nbsp;to&nbsp;reconfigure&nbsp;them&nbsp;with&nbsp;the&nbsp;new&nbsp;null-value&nbsp;requirement.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setAllowNullValues(<span style="color: #0000FF; ">boolean</span>&nbsp;allowNullValues)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(allowNullValues&nbsp;!=&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues&nbsp;=&nbsp;allowNullValues;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Need&nbsp;to&nbsp;recreate&nbsp;all&nbsp;Cache&nbsp;instances&nbsp;with&nbsp;the&nbsp;new&nbsp;null-value&nbsp;configuration<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Map.Entry&lt;String,&nbsp;Cache&gt;&nbsp;entry&nbsp;:&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.entrySet())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entry.setValue(createConcurrentMapCache(entry.getKey()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Return&nbsp;whether&nbsp;this&nbsp;cache&nbsp;manager&nbsp;accepts&nbsp;and&nbsp;converts&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null}&nbsp;values<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;all&nbsp;of&nbsp;its&nbsp;caches.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isAllowNullValues()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.allowNullValues;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Collection&lt;String&gt;&nbsp;getCacheNames()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Collections.unmodifiableSet(<span style="color: #0000FF; ">this</span>.cacheMap.keySet());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Cache&nbsp;getCache(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache&nbsp;cache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.get(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cache&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">this</span>.dynamic)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(<span style="color: #0000FF; ">this</span>.cacheMap)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.get(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cache&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;=&nbsp;createConcurrentMapCache(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cacheMap.put(name,&nbsp;cache);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cache;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;ConcurrentMapCache&nbsp;instance&nbsp;for&nbsp;the&nbsp;specified&nbsp;cache&nbsp;name.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;name&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;the&nbsp;ConcurrentMapCache&nbsp;(or&nbsp;a&nbsp;decorator&nbsp;thereof)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Cache&nbsp;createConcurrentMapCache(String&nbsp;name)&nbsp;{<br /><span style="color: #008000; ">&nbsp; &nbsp; &nbsp; &nbsp; //</span><span style="color: #008000; ">return&nbsp;new&nbsp;ConcurrentMapCache(name,&nbsp;isAllowNullValues());<br /></span><span style="color: #008000; ">&nbsp; &nbsp; &nbsp; &nbsp; //</span><span style="color: #008000; ">此处改用GOOGLE&nbsp;GUAVA的构造MANAGER方式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcurrentMapCache(name,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheBuilder.newBuilder()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.expireAfterWrite(<span style="color: #0000FF; ">this</span>.expireTime,&nbsp;TimeUnit.MINUTES)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.maximumSize(<span style="color: #0000FF; ">this</span>.maximumSize)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.asMap(),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isAllowNullValues());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />
     <br />
     </li>
     <li>配置想着bean, cache-concurrentmap-applicationcontext.xml<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: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cache</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/cache"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:p</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/p"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:c</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/c"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:jee</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/jee"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:util</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/util"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache/spring-cache.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee/spring-jee.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/util<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/util/spring-util.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cache:annotation-driven&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;bean&nbsp;id="cacheManager"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="org.springframework.cache.concurrent.ConcurrentMapCacheManager"&nbsp;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="cacheNames"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;my-local-cache&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="cacheManager"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="com.paul.common.cache.MyConcurrentMapCacheManager"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">index</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">index</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="5000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     <br />
     </li>
     <li>通过注释进行使用<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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;JBoss,&nbsp;Home&nbsp;of&nbsp;Professional&nbsp;Open&nbsp;Source<br />&nbsp;*&nbsp;Copyright&nbsp;2014,&nbsp;Red&nbsp;Hat,&nbsp;Inc.&nbsp;and/or&nbsp;its&nbsp;affiliates,&nbsp;and&nbsp;individual<br />&nbsp;*&nbsp;contributors&nbsp;by&nbsp;the&nbsp;@authors&nbsp;tag.&nbsp;See&nbsp;the&nbsp;copyright.txt&nbsp;in&nbsp;the<br />&nbsp;*&nbsp;distribution&nbsp;for&nbsp;a&nbsp;full&nbsp;listing&nbsp;of&nbsp;individual&nbsp;contributors.<br />&nbsp;*<br />&nbsp;*&nbsp;Licensed&nbsp;under&nbsp;the&nbsp;Apache&nbsp;License,&nbsp;Version&nbsp;2.0&nbsp;(the&nbsp;"License");<br />&nbsp;*&nbsp;you&nbsp;may&nbsp;not&nbsp;use&nbsp;this&nbsp;file&nbsp;except&nbsp;in&nbsp;compliance&nbsp;with&nbsp;the&nbsp;License.<br />&nbsp;*&nbsp;You&nbsp;may&nbsp;obtain&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;License&nbsp;at<br />&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration: underline; ">http://www.apache.org/licenses/LICENSE-2.0</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Unless&nbsp;required&nbsp;by&nbsp;applicable&nbsp;law&nbsp;or&nbsp;agreed&nbsp;to&nbsp;in&nbsp;writing,&nbsp;software<br />&nbsp;*&nbsp;distributed&nbsp;under&nbsp;the&nbsp;License&nbsp;is&nbsp;distributed&nbsp;on&nbsp;an&nbsp;"AS&nbsp;IS"&nbsp;BASIS,<br />&nbsp;*&nbsp;WITHOUT&nbsp;WARRANTIES&nbsp;OR&nbsp;CONDITIONS&nbsp;OF&nbsp;ANY&nbsp;KIND,&nbsp;either&nbsp;express&nbsp;or&nbsp;implied.<br />&nbsp;*&nbsp;See&nbsp;the&nbsp;License&nbsp;for&nbsp;the&nbsp;specific&nbsp;language&nbsp;governing&nbsp;permissions&nbsp;and<br />&nbsp;*&nbsp;limitations&nbsp;under&nbsp;the&nbsp;License.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">package</span>&nbsp;com.paul.springmvc.data;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.EntityManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.CriteriaBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.CriteriaQuery;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.persistence.criteria.Root;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.annotation.CacheEvict;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.annotation.Cacheable;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Repository;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.transaction.annotation.Transactional;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.springmvc.model.Member;<br /><br />@Repository<br />@Transactional<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MemberDaoImpl&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;MemberDao&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EntityManager&nbsp;em;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Cacheable(value&nbsp;=&nbsp;"my-local-cache",&nbsp;key&nbsp;=&nbsp;"#id")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Member&nbsp;findById(Long&nbsp;id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />MemberDaoImpl&nbsp;NO&nbsp;CACHE<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.find(Member.<span style="color: #0000FF; ">class</span>,&nbsp;id);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Member&nbsp;findByEmail(String&nbsp;email)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaBuilder&nbsp;cb&nbsp;=&nbsp;em.getCriteriaBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaQuery&lt;Member&gt;&nbsp;criteria&nbsp;=&nbsp;cb.createQuery(Member.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root&lt;Member&gt;&nbsp;member&nbsp;=&nbsp;criteria.from(Member.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Swap&nbsp;criteria&nbsp;statements&nbsp;if&nbsp;you&nbsp;would&nbsp;like&nbsp;to&nbsp;try&nbsp;out&nbsp;type-safe&nbsp;criteria&nbsp;queries,&nbsp;a&nbsp;new<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;feature&nbsp;in&nbsp;JPA&nbsp;2.0&nbsp;criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.select(member).where(cb.equal(member.get("email"),&nbsp;email));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.createQuery(criteria).getSingleResult();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;List&lt;Member&gt;&nbsp;findAllOrderedByName()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaBuilder&nbsp;cb&nbsp;=&nbsp;em.getCriteriaBuilder();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CriteriaQuery&lt;Member&gt;&nbsp;criteria&nbsp;=&nbsp;cb.createQuery(Member.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Root&lt;Member&gt;&nbsp;member&nbsp;=&nbsp;criteria.from(Member.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Swap&nbsp;criteria&nbsp;statements&nbsp;if&nbsp;you&nbsp;would&nbsp;like&nbsp;to&nbsp;try&nbsp;out&nbsp;type-safe&nbsp;criteria&nbsp;queries,&nbsp;a&nbsp;new<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;feature&nbsp;in&nbsp;JPA&nbsp;2.0&nbsp;criteria.select(member).orderBy(cb.asc(member.get(Member_.name)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.select(member).orderBy(cb.asc(member.get("name")));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;em.createQuery(criteria).getResultList();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@CacheEvict(value="my-local-cache",allEntries=<span style="color: #0000FF; ">true</span>,beforeInvocation=<span style="color: #0000FF; ">true</span>)<span style="color: #008000; ">//</span><span style="color: #008000; ">清空所有缓存</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;register(Member&nbsp;member)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;em.persist(member);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></li>
</ol><img src ="http://www.blogjava.net/paulwong/aggbug/423034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-25 16:34 <a href="http://www.blogjava.net/paulwong/archive/2015/02/25/423034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING CACHE资源</title><link>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 25 Feb 2015 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/423032.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/423032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/423032.html</trackback:ping><description><![CDATA[SPRING手册<a href="http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#cache" target="_blank"><br />http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/htmlsingle/#cache</a><br /><br />SPRING CONCURRENTMAP MANAGER加过期策略<br /><a href="http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable" target="_blank">http://stackoverflow.com/questions/8181768/can-i-set-a-ttl-for-cacheable</a><br /><br />组合KEY<br /><a href="http://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments" target="_blank">http://stackoverflow.com/questions/14072380/cacheable-key-on-multiple-method-arguments</a><br /><br />Spring Cache抽象详解<br /><a href="http://www.open-open.com/lib/view/open1389575623336.html" target="_blank">http://www.open-open.com/lib/view/open1389575623336.html</a><br /><br />注释驱动的 Spring cache 缓存介绍<br /><a href="https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/" target="_blank">https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/</a><br /><br /><h3><a href="http://jinnianshilongnian.iteye.com/blog/2001040" style="color: #e9650e;" target="_blank">Spring Cache抽象详解</a></h3><img src ="http://www.blogjava.net/paulwong/aggbug/423032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-25 16:04 <a href="http://www.blogjava.net/paulwong/archive/2015/02/25/423032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WILDFLY中的分布式缓存INFISHPAN</title><link>http://www.blogjava.net/paulwong/archive/2015/02/23/422998.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 23 Feb 2015 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/23/422998.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422998.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/23/422998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422998.html</trackback:ping><description><![CDATA[项目部署的应用服务器：WILDFLY
<ol>
     <li>通过http://127.0.0.1:9991/console/App.html#infinispan添加CACHE<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: #0000FF; ">&lt;</span><span style="color: #800000; ">cache-container&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="tickets"</span><span style="color: #FF0000; ">&nbsp;default-cache</span><span style="color: #0000FF; ">="default"</span><span style="color: #FF0000; ">&nbsp;jndi-name</span><span style="color: #0000FF; ">="java:jboss/infinispan/tickets"</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">local-cache&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="default"</span><span style="color: #FF0000; ">&nbsp;batching</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">locking&nbsp;</span><span style="color: #FF0000; ">isolation</span><span style="color: #0000FF; ">="REPEATABLE_READ"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">local-cache</span><span style="color: #0000FF; ">&gt;</span><br />
     <span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cache-container</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>pom.xml添加依赖包<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 />
     -->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.infinispan<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>infinispan-core<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>provided<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.infinispan<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>infinispan-client-hotrod<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>provided<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.jgroups<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>jgroups<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>provided<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.infinispan<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>infinispan-spring<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>6.0.2.Final<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.infinispan<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>infinispan-jcache<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span>6.0.2.Final<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>添加拦截器，WEB-INF/beans.xml<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: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"</span><span style="color: #0000FF; ">?&gt;</span><br />
     <span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/javaee"</span><span style="color: #FF0000; ">&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://java.sun.com/xml/ns/javaee&nbsp;http://jboss.org/schema/cdi/beans_1_0.xsd"</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">interceptors</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.infinispan.jcache.annotation.CacheResultInterceptor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.infinispan.jcache.annotation.CachePutInterceptor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.infinispan.jcache.annotation.CacheRemoveEntryInterceptor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span>org.infinispan.jcache.annotation.CacheRemoveAllInterceptor<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">class</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">interceptors</span><span style="color: #0000FF; ">&gt;</span><br />
     <span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>添加项目的全局依赖，WEB-INF/jboss-deployment-structure.xml<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: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br />
     <span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">jboss-deployment-structure</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">deployment</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.jboss.xnio"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.infinispan"</span><span style="color: #FF0000; ">&nbsp;export</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.infinispan.commons"</span><span style="color: #FF0000; ">&nbsp;export</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.infinispan.client.hotrod"</span><span style="color: #FF0000; ">&nbsp;export</span><span style="color: #0000FF; ">="true"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">deployment</span><span style="color: #0000FF; ">&gt;</span><br />
     <span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">jboss-deployment-structure</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
     <li>在CDI BEAN中使用CACHE<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: #0000FF; ">package</span>&nbsp;com.paul.myejb;<br />
     <br />
     <span style="color: #0000FF; ">import</span>&nbsp;javax.annotation.Resource;<br />
     <span style="color: #0000FF; ">import</span>&nbsp;javax.cache.annotation.CacheResult;<br />
     <span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.Remote;<br />
     <span style="color: #0000FF; ">import</span>&nbsp;javax.ejb.Stateless;<br />
     <span style="color: #0000FF; ">import</span>&nbsp;javax.interceptor.Interceptors;<br />
     <br />
     <span style="color: #0000FF; ">import</span>&nbsp;org.infinispan.Cache;<br />
     <span style="color: #0000FF; ">import</span>&nbsp;org.infinispan.manager.EmbeddedCacheManager;<br />
     <span style="color: #008000; ">//</span><span style="color: #008000; ">import&nbsp;org.springframework.cache.annotation.Cacheable;</span><span style="color: #008000; "><br />
     </span><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;<br />
     <br />
     <span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
     &nbsp;*&nbsp;Session&nbsp;Bean&nbsp;implementation&nbsp;class&nbsp;HelloWorldBean<br />
     &nbsp;</span><span style="color: #008000; ">*/</span><br />
     @Stateless<br />
     <span style="color: #008000; ">//</span><span style="color: #008000; ">@Local(HelloWorld.class)</span><span style="color: #008000; "><br />
     </span>@Remote(HelloWorld.<span style="color: #0000FF; ">class</span>)<br />
     @Interceptors(SpringBeanAutowiringInterceptor.<span style="color: #0000FF; ">class</span>)<br />
     <span style="color: #008000; ">//</span><span style="color: #008000; ">@RolesAllowed({Roles.ADMIN})</span><span style="color: #008000; "><br />
     </span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;HelloWorldBean&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;HelloWorld&nbsp;{<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;@Resource(lookup&nbsp;=&nbsp;"java:jboss/infinispan/tickets")<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;EmbeddedCacheManager&nbsp;container;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Default&nbsp;constructor.&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;HelloWorldBean()&nbsp;{<br />
     &nbsp;&nbsp;&nbsp;&nbsp;}<br />
     <br />
     <span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Transactional<br />
     </span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Cacheable(value&nbsp;=&nbsp;"books",&nbsp;key&nbsp;=&nbsp;"#name")</span><span style="color: #008000; "><br />
     </span>&nbsp;&nbsp;&nbsp;&nbsp;@CacheResult<br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sayHello(String&nbsp;name)&nbsp;{<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />NO&nbsp;CACHE<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"Hello&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;",&nbsp;I&nbsp;am&nbsp;HelloWorldBean.";<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache&lt;String,&nbsp;String&gt;&nbsp;cache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.container.getCache();<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.put(name,&nbsp;result);<br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;}<br />
     <br />
     }</div>
     <br />
     <br />
     </li>
     <li>修改modules/system/layers/base/org/infinispan/client/hotrod/main/modules.xml<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: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br />
     <span style="color: #008000; ">&lt;!--</span><span style="color: #008000; "><br />
     &nbsp;&nbsp;~&nbsp;JBoss,&nbsp;Home&nbsp;of&nbsp;Professional&nbsp;Open&nbsp;Source.<br />
     &nbsp;&nbsp;~&nbsp;Copyright&nbsp;2010,&nbsp;Red&nbsp;Hat,&nbsp;Inc.,&nbsp;and&nbsp;individual&nbsp;contributors<br />
     &nbsp;&nbsp;~&nbsp;as&nbsp;indicated&nbsp;by&nbsp;the&nbsp;@author&nbsp;tags.&nbsp;See&nbsp;the&nbsp;copyright.txt&nbsp;file&nbsp;in&nbsp;the<br />
     &nbsp;&nbsp;~&nbsp;distribution&nbsp;for&nbsp;a&nbsp;full&nbsp;listing&nbsp;of&nbsp;individual&nbsp;contributors.<br />
     &nbsp;&nbsp;~<br />
     &nbsp;&nbsp;~&nbsp;This&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or&nbsp;modify&nbsp;it<br />
     &nbsp;&nbsp;~&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;Lesser&nbsp;General&nbsp;Public&nbsp;License&nbsp;as<br />
     &nbsp;&nbsp;~&nbsp;published&nbsp;by&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2.1&nbsp;of<br />
     &nbsp;&nbsp;~&nbsp;the&nbsp;License,&nbsp;or&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.<br />
     &nbsp;&nbsp;~<br />
     &nbsp;&nbsp;~&nbsp;This&nbsp;software&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,<br />
     &nbsp;&nbsp;~&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of<br />
     &nbsp;&nbsp;~&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;See&nbsp;the&nbsp;GNU<br />
     &nbsp;&nbsp;~&nbsp;Lesser&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.<br />
     &nbsp;&nbsp;~<br />
     &nbsp;&nbsp;~&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;Lesser&nbsp;General&nbsp;Public<br />
     &nbsp;&nbsp;~&nbsp;License&nbsp;along&nbsp;with&nbsp;this&nbsp;software;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free<br />
     &nbsp;&nbsp;~&nbsp;Software&nbsp;Foundation,&nbsp;Inc.,&nbsp;51&nbsp;Franklin&nbsp;St,&nbsp;Fifth&nbsp;Floor,&nbsp;Boston,&nbsp;MA<br />
     &nbsp;&nbsp;~&nbsp;02110-1301&nbsp;USA,&nbsp;or&nbsp;see&nbsp;the&nbsp;FSF&nbsp;site:&nbsp;http://www.fsf.org.<br />
     &nbsp;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />
     <span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="urn:jboss:module:1.3"</span><span style="color: #FF0000; ">&nbsp;name</span><span style="color: #0000FF; ">="org.infinispan.client.hotrod"</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jboss.api"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="private"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">properties</span><span style="color: #0000FF; ">&gt;</span><br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">resources</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">resource-root&nbsp;</span><span style="color: #FF0000; ">path</span><span style="color: #0000FF; ">="infinispan-client-hotrod-6.0.2.Final.jar"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">resources</span><span style="color: #0000FF; ">&gt;</span><br />
     <br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="javax.api"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">下面这一行注释掉</span><span style="color: #008000; ">--&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&lt;module&nbsp;name="com.google.protobuf"/&gt;</span><span style="color: #008000; ">--&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.apache.commons.pool"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.infinispan.commons"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.infinispan.query.dsl"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">module&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="org.jboss.logging"</span><span style="color: #0000FF; ">/&gt;</span><br />
     &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><br />
     <span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">module</span><span style="color: #0000FF; ">&gt;</span></div>
     <br />
     </li>
</ol>
以下是SPRING版本
<ol>
     <li>
     添加依赖的SPRING BEAN<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: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><br /><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; ">&nbsp;xmlns:context</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cache</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/cache"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:p</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/p"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:jee</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/jee"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/context<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/context/spring-context-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/cache/spring-cache.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/jee/spring-jee.xsd"</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cache:annotation-driven&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="cacheManager"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000FF; ">="org.infinispan.spring.provider.ContainerCacheManagerFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">constructor-arg&nbsp;</span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">="cacheContainer"</span><span style="color: #FF0000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">jee:jndi-lookup&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="cacheContainer"</span><span style="color: #FF0000; ">&nbsp;jndi-name</span><span style="color: #0000FF; ">="java:jboss/infinispan/tickets"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">&gt;</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">jee:jndi-lookup</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;&lt;bean&nbsp;id="cacheContainer"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class="com.paul.myejb.common.util.cache.JndiSpringCacheManagerFactoryBean"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p:infinispanJNDI="java:jboss/infinispan/tickets"&nbsp;/&gt;&nbsp;</span><span style="color: #008000; ">--&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans</span><span style="color: #0000FF; ">&gt;</span></div><br />
     </li>
     <li>
     使用CACHE<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: #0000FF; ">package</span>&nbsp;com.paul.myejb.spring;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.CacheManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.cache.annotation.Cacheable;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Component;<br /><br />@Component<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MySpringBean&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;CacheManager&nbsp;cacheManager;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Cacheable(value&nbsp;=&nbsp;"my-local-cache",&nbsp;key&nbsp;=&nbsp;"#name")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sayHello(String&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />MySpringBean&nbsp;NO&nbsp;CACHE<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;"Hi&nbsp;"&nbsp;+&nbsp;name&nbsp;+&nbsp;",&nbsp;I&nbsp;am&nbsp;Spring!";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.cache.Cache&nbsp;springCache&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cacheManager.getCache("my-local-cache");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(springCache.get(name)&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;?&nbsp;"null"&nbsp;:&nbsp;springCache.get(name).get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springCache.put(name,&nbsp;result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />
     </li>
     <li><br /></li>
</ol><img src ="http://www.blogjava.net/paulwong/aggbug/422998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-23 13:40 <a href="http://www.blogjava.net/paulwong/archive/2015/02/23/422998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Infinispan资源</title><link>http://www.blogjava.net/paulwong/archive/2015/02/22/422993.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 22 Feb 2015 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/02/22/422993.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422993.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/02/22/422993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422993.html</trackback:ping><description><![CDATA[Infinispan是一个分布式的缓存，由JBOSS开发。支持JSR-107标准。<br />
使用时最好与SPRING结合，用在DAO层。<br />
以某方法参数作为KEY，返回的对象作为VALUE保存到缓存中。<br />
ADD/EDIT/REMOVE方法被执行时则清除所有的缓存。<br />
<br />
Infinispan的运行模式有两种：<br />
1、嵌入式<br />
先启动一个进程，再在此进程中启动Infinispan的CACHE MANAGER。<br />
2、CLIENT/SERVER<br />
直接运行startserver.sh来启动。<br />
<br />
两者区别<br />
嵌入式：<br />
1、Infinispan和启动进程是在同一个进程里，如JBOSS中的Infinispan<br />
2、要使用Infinispan的CACHE，必须将应用部署到此进程中，如将WAR应用部署到JBOSS中<br />
3、如有多台机以此模式运行，则互相可以通讯<br />
<br />
CLIENT/SERVER：<br />
1、Infinispan单独一个进程<br />
2、通过SDK，以MEMCHAED，RHQ等协议访问CACHE<br />
3、如有多台机以此模式运行，互相不可以通讯<br />
<br />
<span style="color: #ff0000;">JBOSS中的INFINISPAN肯定是嵌入式，要访问INFINISPAN的CACHE必须部署到JBOSS才能访问，没有远程模式。</span><br />
<br />
Infinispan中的CACHE有两种模式：本地缓存和集群缓存。<br />
<br />
本地缓存是单机版。<br />
集群缓存是多机网络版，又分为三种：<br />
1、分布式：网络中的每个节点只保存部份缓存条目，所有的节点合起来保存全部缓存条目<br />
当本机无此条目时，要通过网络去到别的机器上取<br />
2、复制式：网络中的每个节点都保存全部缓存条目，但缓存条目有更新时，所有节点一并更新<br />
当本机无此条目时，不用到别的节点取，但缓存条目有更新时，所有节点都会执行更新本地缓存操作<br />
3、无效式：网络中的每个节点互不通讯，但缓存条目有更新时，节点收到失效通知，各自处理本机的缓存条目<br />
<br />
编程使用方法<br />
1、通过程序使用，即在代码中写cache的存取。<br />
2、通过注释使用，这各注释是通过截面拦截方法方式实现，即如果在缓存中有此缓存条目，则方法不会被执行，直接返回结果。<br />
又细分两种：<br />
通过SPRING实现，通过JAVA EE的CDI实现。<br />
<br />
<a href="http://blog.csdn.net/kylinsoong/article/details/13168511" style="color: #333333; text-decoration: none; font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff;" target="_blank">JBoss 系列三十一：JBoss Data Grid（Infinispan）缓存模式</a><br />
<br />
<a href="http://blog.csdn.net/kylinsoong/article/details/13325629" style="color: #333333; text-decoration: none; font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff;" target="_blank">JBoss 系列三十二：JBoss Data Grid（Infinispan）缓存模式示例</a><br />
<br />
<br />
<h1><strong style="box-sizing: border-box;"><a href="https://github.com/infinispan/infinispan-quickstart" data-pjax="#js-repo-pjax-container" style="box-sizing: border-box; color: #4183c4; text-decoration: none; white-space: nowrap; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">infinispan-quickstart</a></strong></h1>
<br />
<a href="https://docs.jboss.org/infinispan/5.0/apidocs/org/infinispan/spring/provider/package-summary.html" target="_blank">https://docs.jboss.org/infinispan/5.0/apidocs/org/infinispan/spring/provider/package-summary.html</a><br />
<br />
<br />
Infinispan integrate with spring based application<br />
<a href="http://timtang.me/blog/2012/11/04/infinispan-spring-based-application-integration/" target="_blank">http://timtang.me/blog/2012/11/04/infinispan-spring-based-application-integration/</a><br />
<br />
<br />
Java缓存新标准（javax.cache）<br />
<a href="http://www.importnew.com/11723.html" target="_blank">http://www.importnew.com/11723.html</a>
<br /><br /><a href="https://developer.jboss.org/en/infinispan/cn/content?filterID=contentstatus[published]~objecttype~objecttype[document]" target="_blank">https://developer.jboss.org/en/infinispan/cn/content?filterID=contentstatus[published]~objecttype~objecttype[document]</a><img src ="http://www.blogjava.net/paulwong/aggbug/422993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-02-22 14:03 <a href="http://www.blogjava.net/paulwong/archive/2015/02/22/422993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几大NOSQL数据库性能比较</title><link>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 29 Jan 2015 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422565.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422565.html</trackback:ping><description><![CDATA[Apache Cassandra NoSQL Performance Benchmarks<br /><a href="http://planetcassandra.org/nosql-performance-benchmarks" target="_blank">http://planetcassandra.org/nosql-performance-benchmarks</a><br /><br />NoSQL Benchmarking<br /><a href="http://www.cubrid.org/blog/dev-platform/nosql-benchmarking/" target="_blank">http://www.cubrid.org/blog/dev-platform/nosql-benchmarking/</a><br /><br /><br /><a href="http://www.badrit.com/blog/2013/11/18/redis-vs-mongodb-performance#.VMpfW2SUfsg" target="_blank">http://www.badrit.com/blog/2013/11/18/redis-vs-mongodb-performance#.VMpfW2SUfsg</a><br /><br />How many requests per second can I get out of Redis?<br /><a href="http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/" target="_blank">http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/</a><br /><br />redis性能测试，测试并发性能<br /><a href="http://my.oschina.net/pblack/blog/102394" target="_blank">http://my.oschina.net/pblack/blog/102394</a><img src ="http://www.blogjava.net/paulwong/aggbug/422565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-30 00:16 <a href="http://www.blogjava.net/paulwong/archive/2015/01/30/422565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache自带的压力测试工具——ab初体验</title><link>http://www.blogjava.net/paulwong/archive/2015/01/08/422139.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 08 Jan 2015 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/08/422139.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422139.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/08/422139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422139.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 我们知道压力测试的软件确实很多，诸如微软的WAST，惠普的LoadRunner以及等等其他的，但这些软件学习起来还是需要花费些时间，在选择上实在头痛，后来在郭欣的那本《构建高性能WEB站点》上看到了他介绍的这款Apache自带的压力测试工具ab，十分喜爱，于是今天终于有机会体验下ab对网站的压力测试。&nbsp;&nbsp;&nbsp; 实验之前我的apache已经安装了，操作系统：...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/01/08/422139.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/422139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-08 19:02 <a href="http://www.blogjava.net/paulwong/archive/2015/01/08/422139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ab --- apache自带的压力测试工具 (apache benchmark )</title><link>http://www.blogjava.net/paulwong/archive/2015/01/08/422138.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 08 Jan 2015 10:38:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/08/422138.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422138.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/08/422138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422138.html</trackback:ping><description><![CDATA[<div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; text-indent: 28.1pt; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; font-size: 14pt;">简介</span></strong></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; text-indent: 21pt; background-color: #ffffff;"><span style="padding: 0px; margin: 0px;">ab</span><span style="padding: 0px; margin: 0px;">的全称是</span><span style="padding: 0px; margin: 0px;">ApacheBench</span><span style="padding: 0px; margin: 0px;">，</span><span style="padding: 0px; margin: 0px;">是</span><span style="padding: 0px; margin: 0px;">&nbsp;Apache&nbsp;</span><span style="padding: 0px; margin: 0px;">附带的一个小工具</span><span style="padding: 0px; margin: 0px;">，</span><span style="padding: 0px; margin: 0px;">专门用于</span><span style="padding: 0px; margin: 0px;">&nbsp;HTTP Server&nbsp;</span><span style="padding: 0px; margin: 0px;">的</span><span style="padding: 0px; margin: 0px;">benchmark testing</span><span style="padding: 0px; margin: 0px;">，</span><span style="padding: 0px; margin: 0px;">可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试，看起来也不错，很简单，也很容易使用，所以今天花一点时间看了一下。</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; text-indent: 21pt; background-color: #ffffff;"><span style="padding: 0px; margin: 0px;">通过下面的一个简单的例子和注释，相信大家可以更容易理解这个工具的使用。</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; text-indent: 28.1pt; background-color: #ffffff;"><strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; font-size: 14pt;">一个简单的例子</span></strong></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; text-indent: 21pt; background: 0% 50% #d9d9d9;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">在这个例子的一开始，我执行了这样一个命令</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;<strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">ab -n 10 -c 10&nbsp;<a href="http://www.google.com/" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><span style="padding: 0px; margin: 0px; color: red;">http://www.google.com/</span></a></span></strong></span><strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: red;">。</span></strong><span style="padding: 0px; margin: 0px; color: red;">这个命令的意思是启动</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;ab&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">，向&nbsp;<a href="http://www.google.com/" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;">www.google.com</a>&nbsp;发送10个请求(-n 10)</span>&nbsp;<span style="padding: 0px; margin: 0px; color: red;">，并每次发送10个请求</span><span style="padding: 0px; margin: 0px; color: red;">(-c 10)&#8212;&#8212;也就是说一次都发过去了</span><span style="padding: 0px; margin: 0px; color: red;">。跟着下面的是</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;ab&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">输出的测试报告，红色部分是我添加的注释。</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21pt; background: 0% 50% #d9d9d9;"><span style="padding: 0px; margin: 0px;">C:\Program Files\Apache Software Foundation\Apache2.2\bin&gt;<strong style="padding: 0px; margin: 0px;">ab -n 10 -c 10 http</strong></span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21.1pt; background: 0% 50% #d9d9d9;"><strong style="padding: 0px; margin: 0px;">://www.google.com/</strong></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21pt; background: 0% 50% #d9d9d9;"><span style="padding: 0px; margin: 0px;">This is ApacheBench, Version 2.0.40-dev &lt;$Revision: 1.146 $&gt; apache-2.0</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21pt; background: 0% 50% #d9d9d9;"><span style="padding: 0px; margin: 0px;">Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21pt; background: 0% 50% #d9d9d9;"><span style="padding: 0px; margin: 0px;">Copyright 1997-2005 The Apache Software Foundation, http://www.apache.org/</span></div><div style=" color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; text-indent: 21pt; background: 0% 50% #d9d9d9;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Benchmarking www.google.com (be patient).....done</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Server Software:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>GWS/2.1</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Server Hostname:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>www.google.com</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Server Port:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>80</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Document Path:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Document Length:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>230 bytes</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Concurrency Level:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>10</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">整个测试持续的时间</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Time taken for tests:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3.234651 seconds</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">完成的请求数量</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Complete requests:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>10</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">失败的请求数量</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Failed requests:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Write errors:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Non-2xx responses:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>10</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Keep-Alive requests:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>10</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">整个场景中的网络传输量</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Total transferred:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>6020 bytes</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">整个场景中的</span><span style="padding: 0px; margin: 0px; color: red;">HTML</span><span style="padding: 0px; margin: 0px; color: red;">内容传输量</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">HTML transferred:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>2300 bytes</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">大家最关心的指标之一，相当于</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;LR&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">中的</span>&nbsp;<strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: red;">每秒事务数</span></strong>&nbsp;<span style="padding: 0px; margin: 0px; color: red;">，后面括号中的</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;mean&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">表示这是一个平均值</span><span style="padding: 0px; margin: 0px; color: red;">*<a href="http://jackei.cnblogs.com/archive/2006/07/18/454144.html" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;">/</a></span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Requests per second:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>3.09 [#/sec] (mean)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">大家最关心的指标之二，相当于</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;LR&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">中的</span>&nbsp;<strong style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px; color: red;">平均事务响应时间</span></strong>&nbsp;<span style="padding: 0px; margin: 0px; color: red;">，后面括号中的</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;mean&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">表示这是一个平均值</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Time per request:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>3234.651 [ms] (mean)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*每个事物的响应时间</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Time per request:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>323.465 [ms] (mean, across all concurrent requests)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">平均每秒网络上的流量，可以帮助排除是否存在网络流量过大导致响应时间延长的问题</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Transfer rate:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>1.55 [Kbytes/sec] received</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">网络上消耗的时间的分解，各项数据的具体算法还不是很清楚</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Connection Times (ms)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>min&nbsp;mean[+/-sd] median<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>max</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Connect:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>20&nbsp;318 926.1<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>30<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>2954</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Processing:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>40 2160 1462.0<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3034<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>3154</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Waiting:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>40 2160 1462.0<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3034<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>3154</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Total:<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>60 2479 1276.4<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3064<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span>3184</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px; color: red;">/*</span><span style="padding: 0px; margin: 0px; color: red;">下面的内容为整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间，其中</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;50</span><span style="padding: 0px; margin: 0px; color: red;">％</span>&nbsp;<span style="padding: 0px; margin: 0px; color: red;">的用户响应时间小于</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;3064&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">毫秒，</span><span style="padding: 0px; margin: 0px; color: red;">60&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">％</span>&nbsp;<span style="padding: 0px; margin: 0px; color: red;">的用户响应时间小于</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;3094&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">毫秒，最大的响应时间小于</span><span style="padding: 0px; margin: 0px; color: red;">&nbsp;3184&nbsp;</span><span style="padding: 0px; margin: 0px; color: red;">毫秒</span><span style="padding: 0px; margin: 0px; color: red;">*/</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">Percentage of the requests served within a certain time (ms)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">50%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3064</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">66%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3094</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">75%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3124</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">80%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3154</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">90%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3184</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">95%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3184</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">98%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3184</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">99%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3184</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">100%<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span>3184 (longest request)</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">参数详解</span></div><div style=" text-indent: 21pt; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: 0% 50%; background-repeat: initial;"><span style="padding: 0px; margin: 0px;">ab is a tool for benchmarking your Apache Hypertext Transfer Protocol(HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving.<br style="padding: 0px; margin: 0px;" />ab是Apache超文本传输协议(HTTP)的性能测试工具。 其设计意图是描绘当前所<a target="_self" href="http://hi.baidu.com/php_home/blog/item/:;" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><u style="padding: 0px; margin: 0px;"><strong style="padding: 0px; margin: 0px;">安装</strong></u></a>的Apache的执行性能， 主要是显示你安装的Apache每秒可以处理多少个请求。<br style="padding: 0px; margin: 0px;" />OPTIONS<br style="padding: 0px; margin: 0px;" />-A auth-username:password<br style="padding: 0px; margin: 0px;" />Supply BASIC Authentication credentials to the server. The user name and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the server needs it (i.e., has sent an 401 authentication needed).<br style="padding: 0px; margin: 0px;" />对服务器提供BASIC认证信任。 用户名和密码由一个:隔开，并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。<br style="padding: 0px; margin: 0px;" />-c concurrency<br style="padding: 0px; margin: 0px;" />Number of multiple requests to perform at a time. Default is one request at a time.<br style="padding: 0px; margin: 0px;" />一次产生的请求个数。默认是一次一个。<br style="padding: 0px; margin: 0px;" />-C cookie-name=value<br style="padding: 0px; margin: 0px;" />Add a Cookie: line to the request. The argument is typically in the form of a name=value pair. This field is repeatable.<br style="padding: 0px; margin: 0px;" />对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。 此参数可以重复。<br style="padding: 0px; margin: 0px;" />-d Do not display the "percentage served within XX [ms] table".<br style="padding: 0px; margin: 0px;" />(legacy support).<br style="padding: 0px; margin: 0px;" />不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。<br style="padding: 0px; margin: 0px;" />-e csv-file<br style="padding: 0px; margin: 0px;" />Write a Comma separated value (CSV) file which contains for each percentage (from 1% to 100%) the time (in milliseconds) it took to serve that percentage of the requests. This is usually more useful than the 'gnuplot' file; as the results are already 'binned'.<br style="padding: 0px; margin: 0px;" />产生一个以逗号分隔的(CSV)文件， 其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以毫秒为单位)时间。 由于这种格式已经&#8220;二进制化&#8221;，所以比'gnuplot'格式更有用。<br style="padding: 0px; margin: 0px;" />-g gnuplot-file<br style="padding: 0px; margin: 0px;" />Write all measured values out as a 'gnuplot' or TSV (Tab separate values) file. This file can easily be imported into&nbsp;<a target="_self" href="http://hi.baidu.com/php_home/blog/item/:;" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><u style="padding: 0px; margin: 0px;"><strong style="padding: 0px; margin: 0px;">packages</strong></u></a>&nbsp;like Gnuplot, IDL, Mathematica, Igor or even Excel. The labels are on the first line of the file.<br style="padding: 0px; margin: 0px;" />把所有测试结果写入一个'gnuplot'或者TSV (以Tab分隔的)文件。 此文件可以方便地导入到Gnuplot, IDL, Mathematica, Igor甚至Excel中。 其中的第一行为标题。<br style="padding: 0px; margin: 0px;" />-h Display usage information.<br style="padding: 0px; margin: 0px;" />显示<a target="_self" href="http://hi.baidu.com/php_home/blog/item/:;" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><u style="padding: 0px; margin: 0px;"><strong style="padding: 0px; margin: 0px;">使用</strong></u></a>方法。<br style="padding: 0px; margin: 0px;" />-H custom-header<br style="padding: 0px; margin: 0px;" />Append extra headers to the request. The argument is typically in the form of a valid header line, containing a colon-separated field-value pair (i.e., "Accept-Encoding: zip/zop;8bit").<br style="padding: 0px; margin: 0px;" />对请求附加额外的头信息。 此参数的典型形式是一个有效的头信息行，其中包含了以冒号分隔的字段和值的对 (如, "Accept-Encoding: zip/zop;8bit").<br style="padding: 0px; margin: 0px;" />-i Do HEAD requests instead of GET.<br style="padding: 0px; margin: 0px;" />执行HEAD请求，而不是GET。<br style="padding: 0px; margin: 0px;" />-k Enable the HTTP KeepAlive feature, i.e., perform multiple<br style="padding: 0px; margin: 0px;" />requests within one HTTP session. Default is no KeepAlive.<br style="padding: 0px; margin: 0px;" />启用HTTP KeepAlive功能，即, 在一个HTTP会话中执行多个请求。 默认是不启用KeepAlive功能.<br style="padding: 0px; margin: 0px;" />-n requests<br style="padding: 0px; margin: 0px;" />Number of requests to perform for the benchmarking session. The default is to just perform a single request which usually leads to non-representative enchmarking results.<br style="padding: 0px; margin: 0px;" />在测试会话中所执行的请求个数。 默认时，仅执行一个请求，但通常其结果不具有代表意义。<br style="padding: 0px; margin: 0px;" />-p POST-file<br style="padding: 0px; margin: 0px;" />File containing data to POST.<br style="padding: 0px; margin: 0px;" />包含了需要POST的数据的文件.<br style="padding: 0px; margin: 0px;" />-P proxy-auth-username:password<br style="padding: 0px; margin: 0px;" />Supply BASIC Authentication credentials to a proxy en-route. The username and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the proxy needs it (i.e., has sent an 407 proxy authentication needed).<br style="padding: 0px; margin: 0px;" />对一个中转<a target="_self" href="http://hi.baidu.com/php_home/blog/item/:;" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><u style="padding: 0px; margin: 0px;"><strong style="padding: 0px; margin: 0px;">代理</strong></u></a>提供BASIC认证信任。 用户名和密码由一个:隔开，并以base64编码形式发送。 无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。<br style="padding: 0px; margin: 0px;" />-q When processing more than 150 requests, ab outputs a progress count on stderr every 10% or 100 requests or so. The -q flag will suppress these messages.<br style="padding: 0px; margin: 0px;" />如果处理的请求数大于150， ab每处理大约10%或者100个请求时，会在stderr输出一个进度计数。 此-q标记可以抑制这些信息。<br style="padding: 0px; margin: 0px;" />-s When compiled in (ab -h will show you) use the SSL protected https rather than the http protocol. This feature is experimental and very rudimentary. You probably do not want to use it.<br style="padding: 0px; margin: 0px;" />用于编译中(ab -h会显示相关信息)使用了SSL的受保护的https， 而不是http协议的时候。此功能是实验性的，也是很简陋的。最好不要用。<br style="padding: 0px; margin: 0px;" />-S Do not display the median and standard deviation values, nor display the warning/error messages when the average and median are more than one or two times the standard deviation apart. And default to the min/avg/max values. (legacy support).<br style="padding: 0px; margin: 0px;" />不显示中值和标准背离值， 而且在均值和中值为标准背离值的1到2倍时，也不显示警告或出错信息。 默认时，会显示 最小值/均值/最大值等数值。(为以前的版本提供支持).<br style="padding: 0px; margin: 0px;" />-t timelimit<br style="padding: 0px; margin: 0px;" />Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally. Use this to benchmark the server within a fixed total amount of time. Per default there is no timelimit.<br style="padding: 0px; margin: 0px;" />测试所进行的最大秒数。其内部隐含值是-n 50000。 它可以使对服务器的测试限制在一个固定的总时间以内。默认时，没有时间限制。<br style="padding: 0px; margin: 0px;" />-T content-type<br style="padding: 0px; margin: 0px;" />Content-type header to use for POST data.<br style="padding: 0px; margin: 0px;" />POST数据所使用的Content-type头信息。<br style="padding: 0px; margin: 0px;" />-v verbosity<br style="padding: 0px; margin: 0px;" />Set verbosity level - 4 and above prints information on headers, 3 and above prints response codes (404, 200, etc.), 2 and above prints warnings and info.<br style="padding: 0px; margin: 0px;" />设置显示信息的详细程度 - 4或更大值会显示头信息， 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。<br style="padding: 0px; margin: 0px;" />-V Display version number and exit.<br style="padding: 0px; margin: 0px;" />显示版本号并退出。<br style="padding: 0px; margin: 0px;" />-w Print out results in HTML tables. Default table is two columns wide, with a white background.<br style="padding: 0px; margin: 0px;" />以HTML表的格式输出结果。默认时，它是白色背景的两列宽度的一张表。<br style="padding: 0px; margin: 0px;" />-x &lt;table&gt;-attributes<br style="padding: 0px; margin: 0px;" />String to use as attributes for &lt;table&gt;. Attributes are inserted &lt;table here &gt;.<br style="padding: 0px; margin: 0px;" />设置&lt;table&gt;属性的字符串。 此属性被填入&lt;table这里&gt;.<br style="padding: 0px; margin: 0px;" />-X proxy[:port]<br style="padding: 0px; margin: 0px;" />Use a proxy server for the requests.<br style="padding: 0px; margin: 0px;" />对请求使用代理服务器。<br style="padding: 0px; margin: 0px;" />-y &lt;tr&gt;-attributes<br style="padding: 0px; margin: 0px;" />String to use as attributes for &lt;tr&gt;.<br style="padding: 0px; margin: 0px;" />设置&lt;tr&gt;属性的字符串.<br style="padding: 0px; margin: 0px;" />-z &lt;td&gt;-attributes<br style="padding: 0px; margin: 0px;" />String to use as attributes for &lt;td&gt;.<br style="padding: 0px; margin: 0px;" />设置&lt;td&gt;属性的字符串.<br style="padding: 0px; margin: 0px;" />BUGS<br style="padding: 0px; margin: 0px;" />There are various statically declared buffers of fixed length. Combined with the lazy parsing of the command line arguments, the response headers from the server and other external inputs, this might bite you. It does not implement HTTP/1.x fully; only accepts some 'expected' forms of responses. The rather heavy use of strstr(3) shows up&nbsp;<a target="_self" href="http://hi.baidu.com/php_home/blog/item/:;" style="padding: 0px; margin: 0px; color: #386d00; text-decoration: none;"><u style="padding: 0px; margin: 0px;"><strong style="padding: 0px; margin: 0px;">top</strong></u></a>&nbsp;in profile, which might indicate a performance problem; i.e., you would measure the ab performance rather than the server's.<br style="padding: 0px; margin: 0px;" />程序中有各种静态声明的固定长度的缓冲区。另外，对命令行参数、服务器的响应头和其他外部输入的解析也很简单，这可能会有不良后果。它没有完整地实现HTTP/1.x; 仅接受某些'预想'的响应格式。strstr(3)的频繁使用可能会带来性能问题，即, 你可能是在测试ab而不是服务器的性能。</span></div></div></div></div></div></div></div></div></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/422138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-08 18:38 <a href="http://www.blogjava.net/paulwong/archive/2015/01/08/422138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongodb 查询性能的事情</title><link>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422096.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422096.html</trackback:ping><description><![CDATA[上一篇：Mongodb VS Mysql 查询性能，测试了 mongodb 与 mysql 的查询性能。结果说明 mongodb 性能可以， 可以代替 mysql 来使用。<br /><br />但是这个测试都是在百万级别，我的场景在 KW 级别。所以还要对 mongodb 在 kw 级别下测试效果。<br /><br />我测试环境是 4G 内存（有好些内存被其它程序占用），2kw 数据，查询随机生成 id（一次查询 20 个id）。<br /><br />在这样的环境中测试不理想，比较失望。平均一次查询 500ms（比 mysql 还差，特别是在并发查询下，性能较差。很底的吞吐量）。查看其索引大小（用 db.mycoll.stats() 可以查询）：2kw 数据中有 1.1G 左右的索引，存储的数据在 11G 左右。<br /><br />测试过程中发现 iowait 占 50% 左右，看来还是 io 的瓶颈。还看到 mongodb 使用的内存不多（小于索引的大小，看来这机器不足够来测试）。<br /><br />换了个有可用 6G 内存的机器。在 50 个并发下，可以达到平均 100 ms 左右，算比较满意，但是并发好像能力不够强。但这个性能不能由我控制，还由机器的可用内存控制。原因就是 mongodb 没有指定可占用的内存大小，它把所有空闲内存当缓存使用，既是优点也是缺点：优点--可以最大限度提升性能；缺点--容易受其它程序干扰（占用了它的缓存）。由我测试来看，它抢占内存的能力不强。mongodb 是用内存映射文件 vmm，官方的说明：<br /><br />Memory Mapped Storage Engine<br /><br />This is the current storage engine for MongoDB, and it uses memory-mapped files for all disk I/O.  Using this strategy, the operating system's virtual memory manager is in charge of caching.  This has several implications:<br /><br />There is no redundancy between file system cache and database cache: they are one and the same.<br />MongoDB can use all free memory on the server for cache space automatically without any configuration of a cache size.<br />Virtual memory size and resident size will appear to be very large for the mongod process.  This is benign: virtual memory space will be just larger than the size of the datafiles open and mapped; resident size will vary depending on the amount of memory not used by other processes on the machine.<br />Caching behavior (such as LRU'ing out of pages, and laziness of page writes) is controlled by the operating system: quality of the VMM implementation will vary by OS.<br />所以这么来看，我觉得 mongodb 没有指定内存大小来保证正常的缓存是个缺点。应该至少保证索引全部能放到内存中。但这个行为不是由启动程序决定，而是由环境决定（美中不足）。<br /><br />官方也有段内容说到索引放到内存中：<br /><br />If your queries seem sluggish, you should verify that your indexes are small enough to fit in RAM. For instance, if you're running on 4GB RAM and you have 3GB of indexes, then your indexes probably aren't fitting in RAM. You may need to add RAM and/or verify that all the indexes you've created are actually being used.<br /><br />还是希望 mongodb 中可以指定内存大小，确保它有足够内存加载索引。<br /><br />小结：大数据量下（kw级）mongodb 并发查询不够理想（100-200/s）。写数据很快（我的环境，远程提交近 1w/s，估计达到 1.5W/s 是没问题的，基本不受大数据量的影响）。<br /><br />贴个测试数据：<br /><br />1 id(内存使用 &lt;1.5g)	10 id(内存使用 2-3g)	20 id(内存使用 &gt;4g)<br />1	2	3	1	2	3	1	2	3<br />total time	17.136	25.508	17.387	37.138	33.788	25.143	44.75	31.167	30.678<br />1 thread thruput	583.5668	392.0339	575.1423	269.266	295.9631	397.725	223.4637	320.8522	325.9665<br />total time	24.405	22.664	24.115	41.454	41.889	39.749	56.138	53.713	54.666<br />5 thread thruput	2048.76	2206.142	2073.398	1206.156	1193.631	1257.893	890.6623	930.8733	914.6453<br />total time	27.567	26.867	28.349	55.672	54.347	50.93	72.978	81.857	75.925<br />10 thread thruput	3627.526	3722.038	3527.461	1796.235	1840.028	1963.479	1370.276	1221.643	1317.089<br />total time	51.397	57.446	53.81	119.386	118.015	76.405	188.962	188.034	138.839<br />20 thread thruput	3891.278	3481.53	3716.781	1675.238	1694.7	2617.63	1058.414	1063.637	1440.517<br />total time	160.038	160.808	160.346	343.559	352.732	460.678	610.907	609.986	1411.306<br />50 thread thruput	3124.258	3109.298	3118.257	1455.354	1417.507	1085.357	818.4552	819.6909	354.2818<br />total time	2165.408	635.887	592.958	1090.264	1034.057	1060.266	1432.296	1466.971	1475.061<br />100 thread thruput	461.8067	1572.606	1686.46	917.209	967.0647	943.1595	698.1797	681.6767	677.9381<br />上面的测试分别用三种查询（每次 1,10,20 id），在不同并发下测试3次，每次发出 1w 次查询。第一行数据为所有线程累加时间（单位 ms），第二行数据为吞吐量(1w /(total time / thread num))。测试中内存使用慢慢增加，所以后面的数据可能比较高效的（高效的环境）。<br /><br />从上表看，10 - 20线程比较高的吞吐量。看到内存使用，前提就是索引加载到内存中，并有些内存作为缓存。<br /><br />下面有个索引查询优化的 pdf。<br /><br />Indexing and Query Optimizer<br /><br />Indexing and Query Optimizer (Aaron Staple)<br />ps:<br /><br />默认 mongodb 服务器只有10个并发，如果要提高它的连接数，可以用 --maxConns num 来提高它的接收并发的数据。<br /><br />mongodb 的 java 驱动默认最多只有 10 并发连接池。要提高它，可以在 mongo.jar 的环境中加入 MONGO.POOLSIZE 系统参数，如 java -DMONGO.POOLSIZE=50 ...<img src ="http://www.blogjava.net/paulwong/aggbug/422096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-06 23:39 <a href="http://www.blogjava.net/paulwong/archive/2015/01/06/422096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于MongoDB最大连接数的查看与修改</title><link>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422093.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422093.html</trackback:ping><description><![CDATA[在Linux平台下，无论是64位或者32位的MongoDB默认最大连接数都是819，WIN平台不知道，估计也没有人在 WIN平台下使用MongoDB做生产环境<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"><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">root@DELL113&nbsp;mongodb-linux-i686-2.4.1</span><span style="color: #800000; font-weight: bold;">]</span>#&nbsp;mongo admin -u root -p password<br />MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/admin<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;"current"&nbsp;:&nbsp;1,&nbsp;"available"&nbsp;:&nbsp;818,&nbsp;"totalCreated"&nbsp;:&nbsp;NumberLong(1)&nbsp;}</div><br />途中available显示818少了一个，表示空闲的。current表示已经占用了的连接数，两数一加就等于819，如果我现在在连接一个，那么available就是817，current就是2<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 />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;818,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;2,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;817,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(2)&nbsp;}</div><br />819个连接数对于一般的站点我认为已经够用，并且都是现连现取现断。但这个连接数也可以修改，只要在启动的时候加入--maxConns即可<br />服务器启动<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 />-->[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongod&nbsp;--dbpath=/root/db&nbsp;--maxConns=2000</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.905&nbsp;[initandlisten]&nbsp;MongoDB&nbsp;starting&nbsp;:&nbsp;pid=2812&nbsp;port=27017&nbsp;dbpath=/root/db&nbsp;64-bit&nbsp;host=lee<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;db&nbsp;version&nbsp;v2.4.1<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;git&nbsp;version:&nbsp;1560959e9ce11a693be8b4d0d160d633eee75110<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;build&nbsp;info:&nbsp;Linux&nbsp;ip-10-2-29-40&nbsp;2.6.21.7-2.ec2.v1.2.fc8xen&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;SMP&nbsp;Fri&nbsp;Nov&nbsp;20&nbsp;17:48:28&nbsp;EST&nbsp;2009&nbsp;x86_64&nbsp;BOOST_LIB_VERSION=1_49</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;allocator:&nbsp;tcmalloc<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.957&nbsp;[initandlisten]&nbsp;options:&nbsp;{&nbsp;dbpath:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">/root/db</span><span style="color: #800000; ">"</span>,&nbsp;maxConns:&nbsp;2000&nbsp;}<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.982&nbsp;[initandlisten]&nbsp;journal&nbsp;dir=/root/db/journal<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:21.982&nbsp;[initandlisten]&nbsp;recover&nbsp;:&nbsp;no&nbsp;journal&nbsp;files&nbsp;present,&nbsp;no&nbsp;recovery&nbsp;needed<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.297&nbsp;[initandlisten]&nbsp;preallocateIsFaster=true&nbsp;2.62<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.717&nbsp;[initandlisten]&nbsp;--maxConns&nbsp;too&nbsp;high,&nbsp;can&nbsp;only&nbsp;handle&nbsp;819<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.724&nbsp;[initandlisten]&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;27017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:22.725&nbsp;[websvr]&nbsp;admin&nbsp;web&nbsp;console&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;28017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:06:25.126&nbsp;[initandlisten]&nbsp;connection&nbsp;accepted&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;192.168.4.86:53917&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;(1&nbsp;connection&nbsp;now&nbsp;open)</span></div><br />查询最大连接数<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 />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;818,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;</div><br />发现还是819？其实是Linux默认进程能打开最大文件数有关，可以通过ulimit 解决<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 />-->[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ulimit&nbsp;-n&nbsp;2500</span><span style="color: #008000; "><br /></span>[root@lee&nbsp;mongodb-linux-x86_64-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongod&nbsp;--dbpath=/root/db&nbsp;--maxConns=2000</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;MongoDB&nbsp;starting&nbsp;:&nbsp;pid=2930&nbsp;port=27017&nbsp;dbpath=/root/db&nbsp;64-bit&nbsp;host=lee<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;db&nbsp;version&nbsp;v2.4.1<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;git&nbsp;version:&nbsp;1560959e9ce11a693be8b4d0d160d633eee75110<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;build&nbsp;info:&nbsp;Linux&nbsp;ip-10-2-29-40&nbsp;2.6.21.7-2.ec2.v1.2.fc8xen&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;SMP&nbsp;Fri&nbsp;Nov&nbsp;20&nbsp;17:48:28&nbsp;EST&nbsp;2009&nbsp;x86_64&nbsp;BOOST_LIB_VERSION=1_49</span><span style="color: #008000; "><br /></span>Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;allocator:&nbsp;tcmalloc<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.013&nbsp;[initandlisten]&nbsp;options:&nbsp;{&nbsp;dbpath:&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">/root/db</span><span style="color: #800000; ">"</span>,&nbsp;maxConns:&nbsp;2000&nbsp;}<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.031&nbsp;[initandlisten]&nbsp;journal&nbsp;dir=/root/db/journal<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.031&nbsp;[initandlisten]&nbsp;recover&nbsp;:&nbsp;no&nbsp;journal&nbsp;files&nbsp;present,&nbsp;no&nbsp;recovery&nbsp;needed<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.170&nbsp;[initandlisten]&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;27017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:07.171&nbsp;[websvr]&nbsp;admin&nbsp;web&nbsp;console&nbsp;waiting&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;connections&nbsp;on&nbsp;port&nbsp;28017<br />Wed&nbsp;Apr&nbsp;3&nbsp;11:11:10.076&nbsp;[initandlisten]&nbsp;connection&nbsp;accepted&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;192.168.4.86:53161&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">1&nbsp;(1&nbsp;connection&nbsp;now&nbsp;open)</span><span style="color: #008000; "><br /></span></div><br />再查看最大连接数，搞定<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 />-->[root@DELL113&nbsp;mongodb-linux-i686-2.4.1]<span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;./bin/mongo&nbsp;192.168.6.42</span><span style="color: #008000; "><br /></span>MongoDB&nbsp;shell&nbsp;version:&nbsp;2.4.1<br />connecting&nbsp;to:&nbsp;192.168.6.42/test<br />&gt;&nbsp;db.serverStatus().connections<br />{&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">current</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">available</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;1999,&nbsp;<span style="color: #800000; ">"</span><span style="color: #800000; ">totalCreated</span><span style="color: #800000; ">"</span>&nbsp;:&nbsp;NumberLong(1)&nbsp;}<br />&gt;&nbsp;</div><br />关于ulimit的更多知识大家可以去网上检索检索<br /><br />客户端程序通常是通过DRIVER来链接，由于每次建立链接的成本都挺高，因此都用链接池来实现，SPRING DATA MONGODB中是如下配置<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 />-->mongo.dbname=cms<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">线程池的大小</span><span style="color: #008000; "><br /></span>mongo.connectionsPerHost=100<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">这个*mongo.connectionsPerHost则是如果链接数大于100的等待xttk数</span><span style="color: #008000; "><br /></span>mongo.threadsAllowedToBlockForConnectionMultiplier=4<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">等待线程的等待时间</span><span style="color: #008000; "><br /></span>mongo.maxWaitTime=1500<br />mongo.socketTimeout=1500<br />mongo.connectTimeout=1000<br />mongo.autoConnectRetry=true<br />mongo.socketKeepAlive=true<br />mongo.slaveOk=true</div><br /><br /><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">autoConnectRetry</strong>&nbsp;simply means the driver will automatically attempt to reconnect to the server(s) after unexpected disconnects. In production environments you usually want this set to true.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">connectionsPerHost</strong>&nbsp;are the amount of physical connections a single Mongo instance (it's singleton so you usually have one per application) can establish to a mongod/mongos process. At time of writing the java driver will establish this amount of connections eventually even if the actual query throughput is low (in order words you will see the "conn" statistic in mongostat rise until it hits this number per app server).</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">There is no need to set this higher than 100 in most cases but this setting is one of those "test it and see" things. Do note that you will have to make sure you set this low enough so that the total amount of connections to your server do not exceed</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><code style="margin: 0px; padding: 1px 5px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; white-space: pre-wrap; background: #eeeeee;">db.serverStatus().connections.available</code></p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">In production we currently have this at 40.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">connectTimeout</strong>. As the name suggest number of milliseconds the driver will wait before a connection attempt is aborted. Set timeout to something long (15-30 seconds) unless there's a realistic, expected chance this will be in the way of otherwise succesful connection attempts. Normally if a connection attempt takes longer than a couple of seconds your network infrastructure isn't capable of high throughput.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">maxWaitTime</strong>. Number of ms a thread will wait for a connection to become available on the connection pool, and raises an exception if this does not happen in time. Keep default.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">socketTimeout</strong>. Standard socket timeout value. Set to 60 seconds (60000).</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">threadsAllowedToBlockForConnectionMultiplier</strong>. Multiplier for connectionsPerHost that denotes the number of threads that are allowed to wait for connections to become available if the pool is currently exhausted. This is the setting that will cause the "com.mongodb.DBPortPool$SemaphoresOut: Out of semaphores to get db connection" exception. It will throw this exception once this thread queue exceeds the threadsAllowedToBlockForConnectionMultiplier value. For example, if the connectionsPerHost is 10 and this value is 5 up to 50 threads can block before the aforementioned exception is thrown.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">If you expect big peaks in throughput that could cause large queues temporarily increase this value. We have it at 1500 at the moment for exactly that reason. If your query load consistently outpaces the server you should just improve your hardware/scaling situation accordingly.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">readPreference</strong>.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(UPDATED, 2.8+)</strong>&nbsp;Used to determine the default read preference and replaces "slaveOk". Set up a ReadPreference through one of the class factory method.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">A full description of the most common settings can be found at the end of this post</em></strong></p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">w</strong>.&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(UPDATED, 2.6+)</strong>&nbsp;This value determines the "safety" of the write. When this value is -1 the write will not report any errors regardless of network or database errors. WriteConcern.NONE is the appropriate predefined WriteConcern for this. If w is 0 then network errors will make the write fail but mongo errors will not. This is typically referred to as "fire and forget" writes and should be used when performance is more important than consistency and durability. Use WriteConcern.NORMAL for this mode.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">If you set w to 1 or higher the write is considered safe. Safe writes perform the write and follow it up by a request to the server to make sure the write succeeded or retrieve an error value if it did not (in other words, it sends a getLastError() command after you write). Note that until this getLastError() command is completed the connection is reserved. As a result of that and the additional command the throughput will be signficantly lower than writes with w &lt;= 0. With a w value of exactly 1 MongoDB guarantees the write succeeded (or verifiably failed) on the instance you sent the write to.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;">In the case of replica sets you can use higher values for w whcih tell MongoDB to send the write to at least "w" members of the replica set before returning (or more accurately, wait for the replication of your write to "w" members). You can also set w to the string "majority" which tells MongoDB to perform the write to the majority of replica set members (WriteConcern.MAJORITY). Typicall you should set this to 1 unless you need raw performance (-1 or 0) or replicated writes (&gt;1). Values higher than 1 have a considerable impact on write throughput.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">fsync</strong>. Durability option that forces mongo to flush to disk after each write when enabled. I've never had any durability issues related to a write backlog so we have this on false (the default) in production.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">j</strong>&nbsp;*<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">(NEW 2.7+)</em>*. Boolean that when set to true forces MongoDB to wait for a successful journaling group commit before returning. If you have journaling enabled you can enable this for additional durability. Refer to&nbsp;<a href="http://www.mongodb.org/display/DOCS/Journaling" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: #4a6b82; text-decoration: none; cursor: pointer; background: transparent;">http://www.mongodb.org/display/DOCS/Journaling</a>&nbsp;to see what journaling gets you (and thus why you might want to enable this flag).</p></li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference</strong>&nbsp;The ReadPreference class allows you to configure to what mongod instances queries are routed if you are working with replica sets. The following options are available :</p><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;"><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.primary()</strong>&nbsp;: All reads go to the repset primary member only. Use this if you require all queries to return consistent (the most recently written) data. This is the default.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.primaryPreferred()</strong>&nbsp;: All reads go to the repset primary member if possible but may query secondary members if the primary node is not available. As such if the primary becomes unavailable reads become eventually consistent, but only if the primary is unavailable.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.secondary()</strong>&nbsp;: All reads go to secondary repset members and the primary member is used for writes only. Use this only if you can live with eventually consistent reads. Additional repset members can be used to scale up read performance although there are limits to the amount of (voting) members a repset can have.</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.secondaryPreferred()</strong>&nbsp;: All reads go to secondary repset members if any of them are available. The primary member is used exclusively for writes unless all secondary members become unavailable. Other than the fallback to the primary member for reads this is the same as ReadPreference.secondary().</p></li><li style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;"><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; background: transparent;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">ReadPreference.nearest()</strong>&nbsp;: Reads go to the nearest repset member available to the database client. Use only if eventually consistent reads are acceptable. The nearest member is the member with the lowest latency between the client and the various repset members. Since busy members will eventually have higher latencies this&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; background: transparent;">should</em>&nbsp;also automatically balance read load although in my experience secondary(Preferred) seems to do so better if member latencies are relatively consistent.</p></li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; vertical-align: baseline; clear: both; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 17.8048000335693px; background: #ffffff;">Note : All of the above have tag enabled versions of the same method which return TaggableReadPreference instances instead. A full description of replica set tags can be found here :<a href="http://docs.mongodb.org/manual/reference/replica-configuration/#tag-sets" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: #4a6b82; text-decoration: none; cursor: pointer; background: transparent;">Replica Set Tags</a></p><br /><br />参考网址：<br /><a href="http://api.mongodb.org/java/2.10.1/com/mongodb/MongoClientOptions.Builder.html#connectionsPerHost(int)" target="_blank">http://api.mongodb.org/java/2.10.1/com/mongodb/MongoClientOptions.Builder.html#connectionsPerHost(int)</a><br /><a href="https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.5.xsd" target="_blank">https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-1.5.xsd</a><img src ="http://www.blogjava.net/paulwong/aggbug/422093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-06 22:10 <a href="http://www.blogjava.net/paulwong/archive/2015/01/06/422093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOMCAT调优</title><link>http://www.blogjava.net/paulwong/archive/2015/01/06/422081.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/06/422081.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422081.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/06/422081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422081.html</trackback:ping><description><![CDATA[<ol>
     <li>安装AB<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 />
     -->rpm&nbsp;-ivh&nbsp;http://repo.webtatic.com/yum/centos/5/`uname&nbsp;-i`/webtatic-release-5-0.noarch.rpm<br />
     yum&nbsp;install&nbsp;httpd-tools</div>
     <br />
     </li>
     <li>使用AB<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 />
     -->ab -r&nbsp;-n&nbsp;100000&nbsp;-c&nbsp;10000 http://10.120.151.223:8080/<br />需加-r，则在收到SOCKET错误的时候不会退出<br />这段的意思是发送100000个请求，其中并发是10000个</div>
     <br />
     </li>
     <li>修改LINUX能打开的文件的最大数<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 />
     -->2、&nbsp;&nbsp;修改目标<br />
     我们的目标是：让每一个用户登录系统后系统打开的最大文件数都是我们设定好的。<br />
     但我这里不得不说的是：非常遗憾，网上很多这方面关于ulimit设置修改资源限制的文章，但没一篇文章管用。<br />
     把这个目标分解为两个目标：<br />
     <br />
     2.1、设置对root用户登录系统生效<br />
     这个目标可以实现起来不难<br />
     <br />
     2.2、设置对所有用户生效<br />
     这个就非常麻烦了，弄不好还会把你的系统给整坏，因为要重编译Linux的内核才行！<br />
     所以权衡之下，我只实现了第一个目标，因为第二个目标的风险太大，我想如果我之前知道这点，那么我在装系统的时候我会先做这个处理，但现在我觉得已经晚了。<br />
     <br />
     3、&nbsp;&nbsp;修改的地方<br />
     <br />
     3.1、修改/etc/security/limits.conf<br />
     通过&nbsp;vi&nbsp;/etc/security/limits.conf修改其内容，在文件最后加入（数值也可以自己定义）：<br />
     *&nbsp;soft&nbsp;&nbsp;nofile&nbsp;=&nbsp;65536<br />
     *&nbsp;hard&nbsp;&nbsp;nofile&nbsp;=&nbsp;65536<br />
     root soft nofile&nbsp;65536<br />
     root hard nofile&nbsp;65536<br />
     * 表示该配置对所有用户均有效,root用户要特别加两行。<br />
     <br />
     3.2、修改/etc/profile<br />
     通过vi&nbsp;/etc/profile修改，在最后加入以下内容<br />
     ulimit&nbsp;-n&nbsp;65536<br />
     然后重新登录即可生效了。<br />
     说明：<br />
     其实只修改/etc/profile就可以生效了，但我还是建议把/etc/security/limits.conf也修改一下。<br />
     最后强调的是，你如果要使得修改对所有用户都生效，那么现在看来你只能重新编译Linux的内核才行。</div>
     <br />
     <br />
     </li>
     <li>安装APR，参考：<a href="http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/" target="_blank">http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/</a><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 />-->$ wget http://apache.fayea.com//apr/apr-1.5.1.tar.gz<br />$&nbsp;cd&nbsp;/path/to/tomcat/bin<br />$&nbsp;tar&nbsp;zxvf&nbsp;tomcat-native.tar.gz<br />$&nbsp;cd&nbsp;tomcat-native-x.y.z-src/jni/native<br />$&nbsp;./configure&nbsp;--with-apr=/usr/local/apr&nbsp;--with-ssl=/usr/lib64/openssl<br />$&nbsp;make&nbsp;install</div><br /></li>
     <li>修改server.xml<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: #0000FF; ">&lt;</span><span style="color: #800000; ">Connector&nbsp;</span><span style="color: #FF0000; ">port</span><span style="color: #0000FF; ">="8080"</span><span style="color: #FF0000; ">&nbsp;protocol</span><span style="color: #0000FF; ">="org.apache.coyote.http11.Http11AprProtocol"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URIEncoding</span><span style="color: #0000FF; ">="UTF-8"</span><span style="color: #FF0000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; ">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tcpNoDelay</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compression</span><span style="color: #0000FF; ">="on"</span><span style="color: #FF0000; ">&nbsp;compressionMinSize</span><span style="color: #0000FF; ">="2048"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxThreads</span><span style="color: #0000FF; ">="20000"</span><span style="color: #FF0000; ">&nbsp;connectionTimeout</span><span style="color: #0000FF; ">="-1"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compressableMimeType</span><span style="color: #0000FF; ">="application/json,text/html,text/xml,text/javascript,text/css,text/plain"</span><span style="color: #FF0000; ">&nbsp;redirectPort</span><span style="color: #0000FF; ">="8443"</span><span style="color: #0000FF; ">/&gt;</span></div><br />
     </li>
     <br />
     https的也要修改：<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: #0000FF; ">&lt;</span><span style="color: #800000; ">Connector&nbsp;</span><span style="color: #FF0000; ">SSLEnabled</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;clientAuth</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port</span><span style="color: #0000FF; ">="8443"</span><span style="color: #FF0000; ">&nbsp;keystoreFile</span><span style="color: #0000FF; ">="/root/java/keystore/server.jks"</span><span style="color: #FF0000; ">&nbsp;keystorePass</span><span style="color: #0000FF; ">="123456"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocol</span><span style="color: #0000FF; ">="org.apache.coyote.http11.Http11NioProtocol"</span><span style="color: #FF0000; ">&nbsp;scheme</span><span style="color: #0000FF; ">="https"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secure</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;sslProtocol</span><span style="color: #0000FF; ">="TLS"</span><span style="color: #FF0000; ">&nbsp;<br />
     &nbsp;&nbsp;&nbsp;&nbsp;URIEncoding</span><span style="color: #0000FF; ">="UTF-8"</span><span style="color: #FF0000; ">&nbsp;&nbsp;minSpareThreads</span><span style="color: #0000FF; ">="25"</span><span style="color: #FF0000; ">&nbsp;maxSpareThreads</span><span style="color: #0000FF; ">="75"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; ">&nbsp;disableUploadTimeout</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;connectionTimeout</span><span style="color: #0000FF; ">="20000"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;acceptCount</span><span style="color: #0000FF; ">="1000"</span><span style="color: #FF0000; ">&nbsp;&nbsp;maxThreads</span><span style="color: #0000FF; ">="1000"</span><span style="color: #FF0000; ">&nbsp;maxProcessors</span><span style="color: #0000FF; ">="1000"</span><span style="color: #FF0000; ">&nbsp;minProcessors</span><span style="color: #0000FF; ">="5"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;useURIValidationHack</span><span style="color: #0000FF; ">="false"</span><span style="color: #FF0000; ">&nbsp;tcpNoDelay</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;compression</span><span style="color: #0000FF; ">="on"</span><span style="color: #FF0000; ">&nbsp;compressionMinSize</span><span style="color: #0000FF; ">="2048"</span><span style="color: #FF0000; "><br />
     &nbsp;&nbsp;&nbsp;&nbsp;compressableMimeType</span><span style="color: #0000FF; ">="application/json,text/html,text/xml,text/javascript,text/css,text/plain"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></div>
     <br />
     <li>JVM启动参数<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 />
     -->JAVA_OPTS="-server&nbsp;-Xms2048m&nbsp;-Xmx2048m&nbsp;-Xss512k&nbsp;-XX:+AggressiveOpts&nbsp;-XX:+UseBiasedLocking&nbsp;-XX:PermSize=128M&nbsp;-XX:MaxPermSize=256M&nbsp;-XX:+DisableExplicitGC&nbsp;-XX:MaxTenuringThreshold=31&nbsp;-XX:+UseConcMarkSweepGC&nbsp;-XX:+UseParNewGC&nbsp;&nbsp;-XX:+CMSParallelRemarkEnabled&nbsp;-XX:+UseCMSCompactAtFullCollection&nbsp;-XX:LargePageSizeInBytes=128m&nbsp;&nbsp;-XX:+UseFastAccessorMethods&nbsp;-XX:+UseCMSInitiatingOccupancyOnly&nbsp;-Djava.awt.headless=true&nbsp;"</div>
     </li>
</ol>
<br />
参考网址：<br />
<a href="http://www.cnblogs.com/baibaluo/archive/2011/08/23/2150305.html" target="_blank">http://www.cnblogs.com/baibaluo/archive/2011/08/23/2150305.html</a><br />
<a href="http://ifeve.com/tomcat-connector-tuning-2/" target="_blank">http://ifeve.com/tomcat-connector-tuning-2/</a><br />
<a href="http://sndapk.blog.51cto.com/5385144/1306278" target="_blank">http://sndapk.blog.51cto.com/5385144/1306278</a><img src ="http://www.blogjava.net/paulwong/aggbug/422081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-06 17:40 <a href="http://www.blogjava.net/paulwong/archive/2015/01/06/422081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis 集群解决方案 Codis</title><link>http://www.blogjava.net/paulwong/archive/2014/11/09/419813.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 09 Nov 2014 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/11/09/419813.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/419813.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/11/09/419813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/419813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/419813.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><a href="https://github.com/wandoulabs/codis" target="_blank">https://github.com/wandoulabs/codis</a><br /><br />Codis 是一个分布式&nbsp;<a target="_blank" href="http://www.oschina.net/p/redis" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Redis</a>&nbsp;解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Codis 由四部分组成:</p><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">Codis Proxy &nbsp; (codis-proxy)</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">Codis Manager (codis-config)</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">Codis Redis &nbsp; (codis-server)</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">ZooKeeper</p></li></ul><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">codis-proxy 是客户端连接的 Redis 代理服务, codis-proxy 本身实现了 Redis 协议, 表现得和一个原生的 Redis 没什么区别 (就像&nbsp;<a target="_blank" href="http://www.oschina.net/p/twemproxy" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">Twemproxy</a>), 对于一个业务来说, 可以部署多个 codis-proxy, codis-proxy 本身是无状态的.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">codis-config 是 Codis 的管理工具, 支持包括, 添加/删除 Redis 节点, 添加/删除 Proxy 节点, 发起数据迁移等操作. codis-config 本身还自带了一个 http server, 会启动一个 dashboard, 用户可以直接在浏览器上观察 Codis 集群的运行状态.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">codis-server 是 Codis 项目维护的一个 Redis 分支, 基于 2.8.13 开发, 加入了 slot 的支持和原子的数据迁移指令. Codis 上层的 codis-proxy 和 codis-config 只能和这个版本的 Redis 交互才能正常运行.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Codis 支持按照 Namespace 区分不同的产品, 拥有不同的 product name 的产品, 各项配置都不会冲突.</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">目前 Codis 已经是稳定阶段，目前<a target="_blank" href="http://www.wandoujia.com/" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">豌豆荚</a>已经在使用该系统。</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">架构：</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><img src="http://static.oschina.net/uploads/img/201411/09075151_ofLG.png" alt="Snapshot1" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">特性：</p><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">自动平衡</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">使用非常简单</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">图形化的面板和管理工具</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">支持绝大多数 Redis 命令，完全兼容&nbsp;<a target="_blank" href="http://www.oschina.net/p/twemproxy" style="margin: 0px; padding: 0px; color: #3e62a6; outline: 0px;">twemproxy</a></p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">支持 Redis 原生客户端</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">安全而且透明的数据移植，可根据需要轻松添加和删除节点</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">提供命令行接口</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">RESTful APIs</p></li></ul><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">安装：</p><ul list-paddingleft-2"="" style="margin: 0.5em 0px 0.5em 1.5em; padding: 0px; list-style-position: inside; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">Install go</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">go get github.com/wandoulabs/codis</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">cd codis</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">./bootstrap.sh</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">make gotest</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">cd sample</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px 0px 10px; padding: 0px; display: inline;">follow instructions in usage.md</p></li></ul><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">界面截图：</p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Dashboard<img src="http://static.oschina.net/uploads/img/201411/09075152_psF3.png" alt="main" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Migrate<img src="http://static.oschina.net/uploads/img/201411/09075154_nMX7.png" alt="migrate" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></p><p style="margin: 0px 0px 10px; padding: 0px; font-family: Verdana, sans-serif, 宋体; font-size: 13px; line-height: 21.3333320617676px; background-color: #ffffff;">Slots<img src="http://static.oschina.net/uploads/img/201411/09075157_16s4.png" alt="slots" style="margin: 0px; padding: 0px; border: 0px; max-width: 100%;" /></p><img src ="http://www.blogjava.net/paulwong/aggbug/419813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-11-09 09:28 <a href="http://www.blogjava.net/paulwong/archive/2014/11/09/419813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java并行处理框架 JPPF</title><link>http://www.blogjava.net/paulwong/archive/2014/07/19/415998.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sat, 19 Jul 2014 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/19/415998.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415998.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/19/415998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415998.html</trackback:ping><description><![CDATA[JPPF是一个MASTER/SLAVE的结构，提供客户端的JAR包，客户端只要把执行的代码封闭成一个TASK并提交到MASTER中，MASTER会把此任务分派给SLAVE/NODE去执行，然后把结果返回。<br /><br /><a href="http://www.jppf.org/doc/v4/index.php?title=Main_Page" target="_blank">http://www.jppf.org/doc/v4/index.php?title=Main_Page</a><img src ="http://www.blogjava.net/paulwong/aggbug/415998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-19 09:55 <a href="http://www.blogjava.net/paulwong/archive/2014/07/19/415998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TOMCAT性能调优</title><link>http://www.blogjava.net/paulwong/archive/2014/07/17/415915.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 17 Jul 2014 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/17/415915.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415915.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/17/415915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415915.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415915.html</trackback:ping><description><![CDATA[<a href="http://my.oschina.net/leejayblog/blog?catalog=517328" target="_blank">http://my.oschina.net/leejayblog/blog?catalog=517328</a><br /><br /><br />tomcat7.0性能优化-挑战极限完整版<br /><a href="http://my.oschina.net/boltwu/blog/402271" target="_blank">http://my.oschina.net/boltwu/blog/402271</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/415915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-17 08:43 <a href="http://www.blogjava.net/paulwong/archive/2014/07/17/415915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网购狂欢节背后的技术阅兵</title><link>http://www.blogjava.net/paulwong/archive/2014/07/16/415870.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 16 Jul 2014 00:46:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/16/415870.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415870.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/16/415870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415870.html</trackback:ping><description><![CDATA[2013年是双11的第五个年头，从2009年的&#8220;光棍节&#8221;到现在的&#8220;网购狂欢节&#8221;，单单是名字上的变化，大家就能从中感受到业务规模发生的转变。<br /><br /><img src="http://ww2.sinaimg.cn/bmiddle/a1ab8e59jw1eicdu7tb2lj20c84lzb29.jpg" width="440" height="5975" alt="" /><img src ="http://www.blogjava.net/paulwong/aggbug/415870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-16 08:46 <a href="http://www.blogjava.net/paulwong/archive/2014/07/16/415870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图片服务架构演进</title><link>http://www.blogjava.net/paulwong/archive/2014/07/16/415869.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 16 Jul 2014 00:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/16/415869.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415869.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/16/415869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415869.html</trackback:ping><description><![CDATA[现在几乎任何一个网站、Web App以及移动APP等应用都需要有图片展示的功能，对于图片功能从下至上都是很重要的。<br /><br /><img src="http://ww2.sinaimg.cn/bmiddle/a1ab8e59jw1eid91xxlrxj20c87tqqv5.jpg" width="440" height="10142" alt="" /><img src ="http://www.blogjava.net/paulwong/aggbug/415869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-16 08:39 <a href="http://www.blogjava.net/paulwong/archive/2014/07/16/415869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>腾讯CKV海量分布式存储系统</title><link>http://www.blogjava.net/paulwong/archive/2014/07/16/415866.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 15 Jul 2014 23:58:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/16/415866.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415866.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/16/415866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415866.html</trackback:ping><description><![CDATA[<img src="http://ww4.sinaimg.cn/bmiddle/a1ab8e59jw1eeeg66h72fj20c83ek7ra.jpg" width="440" height="4412" alt="" /><img src ="http://www.blogjava.net/paulwong/aggbug/415866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-16 07:58 <a href="http://www.blogjava.net/paulwong/archive/2014/07/16/415866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何模拟超过 5 万的并发用户</title><link>http://www.blogjava.net/paulwong/archive/2014/07/02/415355.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 02 Jul 2014 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/07/02/415355.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/415355.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/07/02/415355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/415355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/415355.html</trackback:ping><description><![CDATA[<div><div><a href="http://www.oschina.net/translate/how-run-load-test-50k-concurrent-users" target="_blank">http://www.oschina.net/translate/how-run-load-test-50k-concurrent-users</a></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/415355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-07-02 09:13 <a href="http://www.blogjava.net/paulwong/archive/2014/07/02/415355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM实用参数-6 吞吐量收集器</title><link>http://www.blogjava.net/paulwong/archive/2014/06/16/414812.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 16 Jun 2014 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/06/16/414812.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/414812.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/06/16/414812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/414812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/414812.html</trackback:ping><description><![CDATA[在实践中我们发现对于大多数的应用领域，评估一个垃圾收集(GC)算法如何根据如下两个标准：
&nbsp;
<ol>
     <li>吞吐量越高算法越好</li>
     <li>暂停时间越短算法越好</li>
</ol>
首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(throughput)和暂停时间(pause times)。 JVM在专门的线程(GC threads)中执行GC。 只要GC线程是活动的，它们将与应用程序线程(application threads)争用当前可用CPU的时钟周期。 简单点来说，吞吐量是指应用程序线程用时占程序总用时的比例。 例如，吞吐量99/100意味着100秒的程序执行时间应用程序线程运行了99秒， 而在这一时间段内GC线程只运行了1秒。<br /><br />
术语&#8221;暂停时间&#8221;是指一个时间段内应用程序线程让与GC线程执行而完全暂停。 例如，GC期间100毫秒的暂停时间意味着在这100毫秒期间内没有应用程序线程是活动的。 如果说一个正在运行的应用程序有100毫秒的&#8220;平均暂停时间&#8221;，那么就是说该应用程序所有的暂停时间平均长度为100毫秒。 同样，100毫秒的&#8220;最大暂停时间&#8221;是指该应用程序所有的暂停时间最大不超过100毫秒。<br /><br /><br />
<h2>吞吐量 VS 暂停时间</h2>
高吞吐量最好因为这会让应用程序的最终用户感觉只有应用程序线程在做&#8220;生产性&#8221;工作。 直觉上，吞吐量越高程序运行越快。 低暂停时间最好因为从最终用户的角度来看不管是GC还是其他原因导致一个应用被挂起始终是不好的。 这取决于应用程序的类型，有时候甚至短暂的200毫秒暂停都可能打断终端用户体验。 <br /><br />因此，具有低的最大暂停时间是非常重要的，特别是对于一个交互式应用程序。
不幸的是&#8221;高吞吐量&#8221;和&#8221;低暂停时间&#8221;是一对相互竞争的目标（矛盾）。这样想想看，为了清晰起见简化一下：GC需要一定的前提条件以便安全地运行。 例如，必须保证应用程序线程在GC线程试图确定哪些对象仍然被引用和哪些没有被引用的时候不修改对象的状态。 <br /><br />为此，应用程序在GC期间必须停止(或者仅在GC的特定阶段，这取决于所使用的算法)。 然而这会增加额外的线程调度开销：直接开销是上下文切换，间接开销是因为缓存的影响。 加上JVM内部安全措施的开销，这意味着GC及随之而来的不可忽略的开销，将增加GC线程执行实际工作的时间。 <br /><br />因此我们可以通过尽可能少运行GC来最大化吞吐量，例如，只有在不可避免的时候进行GC，来节省所有与它相关的开销。
然而，仅仅偶尔运行GC意味着每当GC运行时将有许多工作要做，因为在此期间积累在堆中的对象数量很高。 单个GC需要花更多时间来完成， 从而导致更高的平均和最大暂停时间。 因此，考虑到低暂停时间，最好频繁地运行GC以便更快速地完成。 这反过来又增加了开销并导致吞吐量下降，我们又回到了起点。<br /><br />
综上所述，在设计（或使用）GC算法时&#8203;&#8203;，我们必须确定我们的目标：一个GC算法&#8203;&#8203;只可能针对两个目标之一（即只专注于最大吞吐量或最小暂停时间），或尝试找到一个二者的折衷。<br /><br /><br />
<h2>HotSpot虚拟机上的垃圾收集</h2>
该系列的第五部分我们已经讨论过年轻代的垃圾收集器。 对于年老代，HotSpot虚拟机提供两类垃圾收集算法(除了新的G1垃圾收集算法)，第一类算法试图最大限度地提高吞吐量，而第二类算法试图最小化暂停时间。 今天我们的重点是第一类，&#8221;面向吞吐量&#8221;的垃圾收集算法。<br /><br />
我们希望把重点放在JVM配置参数上，所以我只会简要概述HotSpot提供的面向吞吐量(throughput-oriented)垃圾收集算法。 当年老代中由于缺乏空间导致对象分配失败时会触发垃圾收集器(事实上，&#8221;分配&#8221;的通常是指从年轻代提升到年老代的对象)。 <br /><br />从所谓的&#8221;GC根&#8221;(GC roots)开始，搜索堆中的可达对象并将其标记为活着的，之后，垃圾收集器将活着的对象移到年老代的一块无碎片(non-fragmented)内存块中，并标记剩余的内存空间是空闲的。 也就是说，我们不像复制策略那样移到一个不同的堆区域，像年轻代垃圾收集算法所做的那样。 <br /><br />相反地，我们把所有的对象放在一个堆区域中，从而对该堆区域进行碎片整理。 垃圾收集器使用一个或多个线程来执行垃圾收集。 当使用多个线程时，算法的不同步骤被分解，使得每个收集线程大多时候工作在自己的区域而不干扰其他线程。 在垃圾收集期间，所有的应用程序线程暂停，只有垃圾收集完成之后才会重新开始。 <br /><br />现在让我们来看看跟面向吞吐量垃圾收集算法有关的重要JVM配置参数。<br /><br /><br />
<h2>-XX:+UseSerialGC</h2>
我们使用该标志来激活串行垃圾收集器，例如单线程面向吞吐量垃圾收集器。 无论年轻代还是年老代都将只有一个线程执行垃圾收集。 该标志被推荐用于只有单个可用处理器核心的JVM。 在这种情况下，使用多个垃圾收集线程甚至会适得其反，因为这些线程将争用CPU资源，造成同步开销，却从未真正并行运行。<br /><br /><br />
<h2>-XX:+UseParallelGC</h2>
有了这个标志，我们告诉JVM使用多线程并行执行年轻代垃圾收集。 在我看来，Java 6中不应该使用该标志因为-XX:+UseParallelOldGC显然更合适。 需要注意的是Java 7中该情况改变了一点(详见本概述)，就是-XX:+UseParallelGC能达到-XX:+UseParallelOldGC一样的效果。<br /><br /><br />
<h2>-XX:+UseParallelOldGC</h2>
该标志的命名有点不巧，因为&#8221;老&#8221;听起来像&#8221;过时&#8221;。 然而，&#8221;老&#8221;实际上是指年老代，这也解释了为什么-XX:+UseParallelOldGC要优于-XX:+UseParallelGC：除了激活年轻代并行垃圾收集，也激活了年老代并行垃圾收集。 当期望高吞吐量，并且JVM有两个或更多可用处理器核心时，我建议使用该标志。<br />
作为旁注，HotSpot的并行面向吞吐量垃圾收集算法通常称为&#8221;吞吐量收集器&#8221;，因为它们旨在通过并行执行来提高吞吐量。<br /><br /><br />
<h2>-XX:ParallelGCThreads</h2>
通过-XX:ParallelGCThreads=&lt;value&gt;我们可以指定并行垃圾收集的线程数量。 例如，-XX:ParallelGCThreads=6表示每次并行垃圾收集将有6个线程执行。 如果不明确设置该标志，虚拟机将使用基于可用(虚拟)处理器数量计算的默认值。 决定因素是由Java Runtime。availableProcessors()方法的返回值N，如果N&lt;=8，并行垃圾收集器将使用N个垃圾收集线程，如果N&gt;8个可用处理器，垃圾收集线程数量应为3+5N/8。<br /><br />
当JVM独占地使用系统和处理器时使用默认设置更有意义。 但是，如果有多个JVM(或其他耗CPU的系统)在同一台机器上运行，我们应该使用-XX:ParallelGCThreads来减少垃圾收集线程数到一个适当的值。 例如，如果4个以服务器方式运行的JVM同时跑在在一个具有16核处理器的机器上，设置-XX:ParallelGCThreads=4是明智的，它能使不同JVM的垃圾收集器不会相互干扰。<br /><br /><br />
<h2>-XX:-UseAdaptiveSizePolicy</h2>
吞吐量垃圾收集器提供了一个有趣的(但常见，至少在现代JVM上)机制以提高垃圾收集配置的用户友好性。 这种机制被看做是HotSpot在Java 5中引入的&#8221;人体工程学&#8221;概念的一部分。 通过人体工程学，垃圾收集器能将堆大小动态变动像GC设置一样应用到不同的堆区域，只要有证据表明这些变动将能提高GC性能。 &#8220;提高GC性能&#8221;的确切含义可以由用户通过-XX:GCTimeRatio和-XX:MaxGCPauseMillis(见下文)标记来指定。<br /><br />
重要的是要知道人体工程学是默认激活的。 这很好，因为自适应行为是JVM最大优势之一。 不过，有时我们需要非常清楚对于特定应用什么样的设置是最合适的，在这些情况下，我们可能不希望JVM混乱我们的设置。 每当我们发现处于这种情况时，我们可以考虑通过-XX:-UseAdaptiveSizePolicy停用一些人体工程学。<br /><br /><br />
<h2>-XX:GCTimeRatio</h2>
通过-XX:GCTimeRatio=&lt;value&gt;我们告诉JVM吞吐量要达到的目标值。 更准确地说，-XX:GCTimeRatio=N指定目标应用程序线程的执行时间(与总的程序执行时间)达到N/(N+1)的目标比值。 例如，通过-XX:GCTimeRatio=9我们要求应用程序线程在整个执行时间中至少9/10是活动的(因此，GC线程占用其余1/10)。 基于运行时的测量，JVM将会尝试修改堆和GC设置以期达到目标吞吐量。 -XX:GCTimeRatio的默认值是99，也就是说，应用程序线程应该运行至少99%的总执行时间。<br /><br /><br />
<h2>-XX:MaxGCPauseMillis</h2>
通过-XX:GCTimeRatio=&lt;value&gt;告诉JVM最大暂停时间的目标值(以毫秒为单位)。 在运行时，吞吐量收集器计算在暂停期间观察到的统计数据(加权平均和标准偏差)。 如果统计表明正在经历的暂停其时间存在超过目标值的风险时，JVM会修改堆和GC设置以降低它们。 需要注意的是，年轻代和年老代垃圾收集的统计数据是分开计算的，还要注意，默认情况下，最大暂停时间没有被设置。<br /><br />
如果最大暂停时间和最小吞吐量同时设置了目标值，实现最大暂停时间目标具有更高的优先级。 当然，无法保证JVM将一定能达到任一目标，即使它会努力去做。 最后，一切都取决于手头应用程序的行为。<br /><br />
当设置最大暂停时间目标时，我们应注意不要选择太小的值。 正如我们现在所知道的，为了保持低暂停时间，JVM需要增加GC次数，那样可能会严重影响可达到的吞吐量。 这就是为什么对于要求低暂停时间作为主要目标的应用程序(大多数是Web应用程序)，我会建议不要使用吞吐量收集器，而是选择CMS收集器。 CMS收集器是本系列下一部分的主题。<img src ="http://www.blogjava.net/paulwong/aggbug/414812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-06-16 17:26 <a href="http://www.blogjava.net/paulwong/archive/2014/06/16/414812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 下 Siege 压力测试</title><link>http://www.blogjava.net/paulwong/archive/2014/02/18/409971.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 18 Feb 2014 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/02/18/409971.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/409971.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/02/18/409971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/409971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/409971.html</trackback:ping><description><![CDATA[Siege（英文意思是围攻）是一个压力测试和评测工具，设计用于WEB开发这评估应用在压力下的承受能力：可以根据配置对一个WEB站点进行多用户的并发访问，记录每个用户所有请求过程的相应时间，并在一定数量的并发访问下重复进行。 <br /><br />说明<br /><br />ab的主要弱点在于它不能让你模拟一个更加真实的请求分布&#8212;&#8212;例如你想通过设置一个请求的列表来在这些列表之间来回测试，而siege就可以。<br /><br />安装<br /><br />siege需要自己从http://www.joedog.org/上自己下载，然后编译：<br /><br /><br />注意在configure的时候，一定要设置mandir参数，否则当你通过 man siege查看siege帮助的时候会看不到他的manual.<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 />-->wget&nbsp;http://www.joedog.org/pub/siege/siege-<span style="color: #800000; ">3.0</span>.<span style="color: #800000; ">5</span>.tar.gz<br />tar -zxf siege-2.67.tar.gz<br />./configure&nbsp;--prefix=/usr/<span style="color: #0000FF; ">local</span>/siege&nbsp;--mandir=/usr/<span style="color: #0000FF; ">local</span>/man<br />make<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;转到超级用户</span><span style="color: #008000; "><br /></span>make&nbsp;install</div>安装完成后，运行bin中的siege_config命令来创建.siege文件之后，你可以通过<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 />-->./siege&nbsp;-C<br />命令来查看当前配置</div><br />最简单的使用命令：<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 />-->./siege&nbsp;http://localhost/<br /><span style="color: #008000; ">#</span><span style="color: #008000; ">用来测试本地主页</span></div><br /><br />参数介绍<br /><br />-cNUM<br />设置并发的用户（连接）数量. 默认的连接数量可以到~/.siegerc中查看，指令为concurrent = x。比如-c10,设置并发10个连接<br /><br />-rNUM<br />（repetitions），重复数量，即每个连接发出的请求数量，设置这个的话，就不需要设置-t了。对应.siegerc配置文件中的reps = x指令<br /><br />-tNUM<br />（time），持续时间，即测试持续时间，在NUM时间后结束，单位默认为分，比如-t10，那么测试时间为10分钟，-t10s，则测试时间为10秒钟。对应.siegerc中的指令为time = x指令<br /><br />-b<br />(benchmark),基准测试，如果设置这个参数的话，那么delay时间为0。man siege中有一句话这样说：<br /><br />it's not recommanded that you use this option while load testing.<br /><br />说明基准测试和load testing 是完全不同的，至于有什么不同，可以阅读BenchMarkingVSLoadTestingVSPerformance.<br /><br />-f url.txt<br />(file),这是文件。对应.siegerc配置文件中的file = x指令<br /><br />其他比较关注的测试方法，比如我想使用Keep-Alive方式进行测试，可以在.siegerc配置文件中进行修改，将connect = close改为 connect = keep-alive<br />另外您还可以通过-H HEADER参数来设置请求header。<br /><br /><br />结果说明<br />Lifting the server siege&#8230; done.<br />Transactions: 3419263 hits //完成419263次处理<br />Availability: 100.00 % //100.00 % 成功率<br />Elapsed time: 5999.69 secs //总共用时<br />Data transferred: 84273.91 MB //共数据传输84273.91 MB<br />Response time: 0.37 secs //相应用时1.65秒：显示网络连接的速度<br />Transaction rate: 569.91 trans/sec //均每秒完成 569.91 次处理：表示服务器后<br />Throughput: 14.05 MB/sec //平均每秒传送数据<br />Concurrency: 213.42 //实际最高并发数<br />Successful transactions: 2564081 //成功处理次数<br />Failed transactions: 11 //失败处理次数<br />Longest transaction: 29.04 //每次传输所花最长时间<br />Shortest transaction: 0.00 //每次传输所花最短时间<img src ="http://www.blogjava.net/paulwong/aggbug/409971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-02-18 11:06 <a href="http://www.blogjava.net/paulwong/archive/2014/02/18/409971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些数据切分、缓存、rpc框架、nosql方案资料</title><link>http://www.blogjava.net/paulwong/archive/2013/10/14/404954.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 14 Oct 2013 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/10/14/404954.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/404954.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/10/14/404954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/404954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/404954.html</trackback:ping><description><![CDATA[<div style="margin-bottom: 15px; font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px;"><span style="line-height: 1.8em; font-size: 14px;">1、数据切分</span></div><div id="blog_content" style="line-height: 1.8em; font-family: Helvetica, Tahoma, Arial, sans-serif;"><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp; 1.1、<a href="http://www.guokr.com/blog/475765/" style="color: #108ac6;" target="_blank">mysql中间件研究（Atlas，cobar，TDDL）</a>&nbsp;</p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp; 1.2、<a href="http://www.cnblogs.com/ivanjack/archive/2010/09/11/1824001.html" style="color: #108ac6;" target="_blank">利用 MySQL Proxy 实现数据切分及整合&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp; 1.3、<a href="http://www.dedecms.com/knowledge/data-base/mysql/2012/0819/7626.html" style="color: #108ac6;" target="_blank">基于MySQL分库分表方案简介&nbsp;</a></p><p style="margin: 0px; padding: 0px;"><span style="line-height: 1.5;">&nbsp; &nbsp; &nbsp; &nbsp;</span>&nbsp;1.4、<a href="http://yale.iteye.com/blog/1859988" style="color: #108ac6;" target="_blank">tddl和diamond &nbsp;</a></p><p style="margin: 0px; padding: 0px;">2、缓存</p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp; 2.1、<a href="http://ljh0721.iteye.com/blog/1811338" style="color: #108ac6;" target="_blank">java客户端三种方式操作&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.2、<a href="http://zys-wings.com/?p=218" style="color: #108ac6;" target="_blank">myibatis配置memcached评测&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.3、<a href="http://stackoverflow.com/questions/11364554/memcached-spring-caching" style="color: #108ac6;" target="_blank">Memcached + Spring Caching&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.4、<a href="http://www.open-open.com/lib/view/1324369698014%20" style="color: #108ac6;" target="_blank">memcachedb-持久化存储的缓存系统&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.5、<a href="http://blog.sina.com.cn/s/blog_613904cc0100w5ij.html" style="color: #108ac6;" target="_blank">memcachedb让memcache的数据持久化&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.6、<a href="http://code.taobao.org/p/tair/wiki/intro/" style="color: #108ac6;" target="_blank">淘宝kv缓存框架tair&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;2.7、<a href="http://yueyemaitian.iteye.com/admin/blogs/%20http:/gubaojian.blog.163.com/blog/static/1661799082012519084312/" style="color: #108ac6;" target="_blank">ibatis之扩展缓存ibatis-tair-cache&nbsp;</a></p><p style="margin: 0px; padding: 0px;">3、rpc框架</p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;3.1、<a href="http://code.alibabatech.com/wiki/display/dubbo/Home-zh" style="color: #108ac6;">dubbo&nbsp;</a></p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;3.2、hsf 未开源</p><p style="margin: 0px; padding: 0px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;3.3、<a href="http://iwinit.iteye.com/blog/1745132" style="color: #108ac6;" target="_blank">服务框架HSF分析之一容器启动</a></p><p style="margin: 0px; padding: 0px;">4、noSql</p><p style="margin: 0px; padding: 0px;"><span style="line-height: 1.5;">&nbsp; &nbsp; &nbsp; &nbsp;</span>&nbsp;4.1、<a href="http://www.ha97.com/3447.html" style="color: #108ac6;" target="_blank">学习NoSQL数据库的必读资料&nbsp;</a></p></div><img src ="http://www.blogjava.net/paulwong/aggbug/404954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-10-14 10:14 <a href="http://www.blogjava.net/paulwong/archive/2013/10/14/404954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大数据平台架构设计资源</title><link>http://www.blogjava.net/paulwong/archive/2013/08/18/403001.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 18 Aug 2013 10:27:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/08/18/403001.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/403001.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/08/18/403001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/403001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/403001.html</trackback:ping><description><![CDATA[!!!基于Hadoop的大数据平台实施记&#8212;&#8212;整体架构设计<br /><a href="http://blog.csdn.net/jacktan/article/details/9200979" target="_blank">http://blog.csdn.net/jacktan/article/details/9200979</a><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/403001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-08-18 18:27 <a href="http://www.blogjava.net/paulwong/archive/2013/08/18/403001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>