﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-西瓜地儿</title><link>http://www.blogjava.net/ashutc/</link><description>沈阳求职（java3年以上经验）！ashutc@126.com</description><language>zh-cn</language><lastBuildDate>Thu, 16 Apr 2026 18:30:24 GMT</lastBuildDate><pubDate>Thu, 16 Apr 2026 18:30:24 GMT</pubDate><ttl>60</ttl><item><title>标准的策略模式</title><link>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 17 Jun 2011 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/352524.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/352524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/352524.html</trackback:ping><description><![CDATA[<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: #000000; ">定义:定义了算法族，分别封装起来，让它们之间可以互相替换，此模式让算法的变化独立于使用算法的客户。<br />适用性<br />许多相关的类仅仅是行为有异。&#8220;策略&#8221;提供了一种用多个行为中的一个行为来配置一个类的算法。<br />需要使用一个算法的不同变体。例如，你可能会定义一些反映不容的空间</span><span style="color: #000000; ">/</span><span style="color: #000000; ">时间权衡的算法。当这些变体实现了一个算法的类层次时[H087],可以使用策略模式。<br />算法使用客户不应该知道的数据。可以使用策略模式以避免暴露复杂的、与算法相关的数据结构。<br />一个类定义了多种行为，并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。<br />&nbsp;例子:以下的例子取自一个动作冒险游戏。你将看到代表游戏角色的类和角色可以使用的武器行为的类。每个角色一次只能只用一种武器，但是可以在游戏的过程中切换武器。<br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">：定义武器接口及实现类<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;定义武器行为接口<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;User<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">选择所使用的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;BowAndArrorBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用弓箭射击<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用弓箭射击</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SwordBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用宝剑攻击行为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用宝剑攻击!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;KnightBehavior&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;实现用匕首刺杀的行为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;userWeapon()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">用匕首刺杀!!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #000000; ">2</span><span style="color: #000000; ">：定义角色<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;角色的抽象父类&nbsp;定义抽象fight方法以及策略属性<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;User<br />&nbsp;*<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">abstract</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;WeaponBehavior&nbsp;weapon;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">策略调用&nbsp;&nbsp;武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">abstract</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">&nbsp;String&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">委托给行为类</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;performFight(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(name</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weapon.userWeapon();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;改变所使用的武器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;weapon<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setWeapon(WeaponBehavior&nbsp;weapon)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;weapon;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;King&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;King(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SwordBehavior();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">用宝剑</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">King</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">King&nbsp;fight</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Queen&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;Character&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Queen(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.weapon</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KnightBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">queen</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fight()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">queen&nbsp;fight</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />}<br /></span><span style="color: #000000; ">3</span><span style="color: #000000; ">：测试类<br /></span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;strategy;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Test&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义能够使用的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwordBehavior&nbsp;swordBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SwordBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnightBehavior&nbsp;knightBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KnightBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BowAndArrorBehavior&nbsp;bowAndArrorBehavior</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BowAndArrorBehavior();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义角色</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character&nbsp;king</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;King();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Character&nbsp;queen</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Queen();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">使用默认的武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">**************使用默认武器****************</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">切换武器</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.setWeapon(knightBehavior);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.setWeapon(swordBehavior);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">**************更换武器后****************</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;king.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queen.performFight();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #000000; ">4</span><span style="color: #000000; ">：结果<br /></span><span style="color: #000000; ">**************</span><span style="color: #000000; ">使用默认武器</span><span style="color: #000000; ">****************</span><span style="color: #000000; "><br />King:用宝剑攻击</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br />queen:用匕首刺杀</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">**************</span><span style="color: #000000; ">更换武器后</span><span style="color: #000000; ">****************</span><span style="color: #000000; "><br />King:用匕首刺杀</span><span style="color: #000000; ">!!</span><span style="color: #000000; "><br />queen:用宝剑攻击</span><span style="color: #000000; ">!!</span></div><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/ashutc/aggbug/352524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-17 15:29 <a href="http://www.blogjava.net/ashutc/archive/2011/06/17/352524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jar 命令说明</title><link>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 13 Jun 2011 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/352195.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/352195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/352195.html</trackback:ping><description><![CDATA[<br /><div><div><p><strong>jar cf myJarFile.jar *.class</strong></p> <p> 它会创建了一个名为myJarFile.jar的JAR"卷宗"。这个卷宗会包括当前目录下的所有class文件，并且自动生成manifest文件。</p> <p><strong>jar cmf myJarFile.jar myManifestFile.mf *.*</strong></p> <p>把当前目录的<strong>所有文件</strong>都打包，增加个用户自定义的，名为myManifestFile.mf的manifest文件。</p> <p><strong>jar tf myJarFile.jar</strong></p> <p>返回myJarFile.jar所含文件的列表。</p> <p><strong>jar tvf myJarFile.jar</strong></p> <p>加"verbose(详细)"标志，给出更详细的，关于myJarFile.jar当中的文件的信息。</p> <p><strong>jar cvf myApp.jar <em>audio classes image</em></strong></p> <p>假设audio，classes，image都是子目录。这个命令会把这些子目录全都收进myApp.jar。</p></div> <br /> <div><div> <p> 一个JAR"卷宗"只有一个文件，"卷宗"包含两个文件，一个是Zip文件，另一个是描述Zip文件所包含的文件的"manifest(清单)"。</p> 用法：jar&nbsp;<wbr>{ctxu}[vfm0Mi]&nbsp;<wbr>[<em>文件.jar</em>]&nbsp;<wbr>[manifest-文件]&nbsp;<wbr>[-C&nbsp;<wbr>目录]&nbsp;<wbr><em>文件名</em>&nbsp;<wbr>...<br />  选项：<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-c&nbsp;<wbr>&nbsp;<wbr>创建新的存档<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-t&nbsp;<wbr>&nbsp;<wbr>列出存档内容的列表<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-x&nbsp;<wbr>&nbsp;<wbr>展开存档中的命名的（或所有的〕文件<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-u&nbsp;<wbr>&nbsp;<wbr>更新已存在的存档<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-v&nbsp;<wbr>&nbsp;<wbr>生成详细输出到标准输出上<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-f&nbsp;<wbr>&nbsp;<wbr>指定存档文件名<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-m&nbsp;<wbr>&nbsp;<wbr>包含来自标明文件的标明信息<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-0&nbsp;<wbr>&nbsp;<wbr>只存储方式；未用ZIP压缩格式<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-M&nbsp;<wbr>&nbsp;<wbr>不产生所有项的清单（manifest〕文件<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-i&nbsp;<wbr>&nbsp;<wbr>为指定的jar文件产生索引信息<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>-C&nbsp;<wbr>&nbsp;<wbr>改变到指定的目录</div> <div>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 文件名，包含的文件,如果一个文件名是一个目录，它将被递归处理。<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 清单（manifest〕文件名和存档文件名都需要被指定，按'm'&nbsp;<wbr>和&nbsp;<wbr>'f'标志指定的相同顺序。</div></div> <br /> </div><img src ="http://www.blogjava.net/ashutc/aggbug/352195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-13 15:52 <a href="http://www.blogjava.net/ashutc/archive/2011/06/13/352195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动代码规范CheckStyle</title><link>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 03 Jun 2011 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/351690.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/351690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/351690.html</trackback:ping><description><![CDATA[<div> <br /> <br /> <div>CheckStyle是什么？<p>　　CheckStyle是SourceForge下的一个项目，提供了一个帮助<a target="_self"><u><strong>JAVA</strong></u></a>开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程，从而使得开发人员从这项重要，但是枯燥的任务中解脱出来[1]。</p><p>　　2.2. CheckStyle检验的主要内容</p><p>　　CheckStyle默认提供一下主要检查内容：</p><p>　　&#183;Javadoc注释</p><p>　　&#183;命名约定</p><p>　　&#183;标题</p><p>　　&#183;Import语句</p><p>　　&#183;体积大小</p><p>　　&#183;空白</p><p>　　&#183;修饰符</p><p>　　&#183;块</p><p>　　&#183;代码问题</p><p>　　&#183;类设计</p><p>　　&#183;混合检查（包活一些有用的比如非必须的System.out和printstackTrace）</p><p>　　从上面可以看出，CheckStyle提供了大部分功能都是对于代码规范的检查，而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是，对于团队开发，尤其是强调代码规范的公司来说，它的功能已经足够强大。</p><p>　　2.3. CheckStyle的主要运行方式</p><p>　　目前，CheckStyle的版本是3.0，与以前的版本不同，它的配置文件是基于XML而非Properties文件。</p><p>　　它的3.0版本提供了两种运行的方式：</p><p>　　&#183;命令行工具</p><p>　　&#183;ANT任务</p><p>　　同时，CheckStyle目前有很多针对流行IDE的插件，例如Eclipse、IntelliJ IDEA、JBuilder等。但是，大部分都是基于2.4的版本，新版本的特性不支持，同时配置也较为复杂。</p><p>　　因为一般情况下，如果与开发过程与环境集成起来，编码规范的检查会更加有效，因此，作为ANT任务的运行方式使用的更加普遍。</p><p>　　在ANT的build.xml文件中添加CheckStyle任务的步骤如下：</p><p>　　1. 将checkstyle-all-3.1.jar拷贝到项目的LIB目录；</p><p>　　2. 建立配置文件；</p><p>　　3. 声明CheckStyle任务：</p><p>＜taskdef resource="checkstyletask.properties" classpath="${lib}/checkstyle-all-3.1.jar"/＞</p><p>　　4. 建立CheckStyle任务：</p><p>＜target name="checkstyle"＞<br />＜checkstyle c＞<br />＜fileset dir="${src}" includes=" **/*.java" /＞<br />＜/checkstyle＞<br />＜/target＞</p><p>　　2.4. 定制CheckStyle</p><p>　　CheckStyle的执行基于XML配置文件，它的主要组成部分是：</p><p>　　&#183;Module：整个配置文件就是一棵Module树。根节点是Checker Module。</p><p>　　&#183;Properties：它来决定一个Module如何进行检查。每个Module都有一个默认值，如果不满足开发需求，可以设定<a target="_self"><u><strong>其它</strong></u></a>的值。</p><p>　　下面是一个示例：</p><p>＜module name="MethodLength"＞<br />＜property name="max" value="60"/＞<br />＜/module＞</p><p>　　它表示，如果方法或者构造函数的长度超过60行，CheckStyle就会报错。而默认值是150行。</p><p>　　以下是一段CheckStyle对于Maven项目源文件的检查报告：</p><p>Method 'createExpression' is not designed for extension - needs to be abstract, final or empty. 91<br />Unable to get class information for JellyException. 91<br />Line has trailing spaces. 93<br />Line has trailing spaces. 104<br />Method 'evaluate' is not designed for extension - needs to be abstract, final or empty. 113<br />Parameter context should be final. 113<br />Line has trailing spaces. 130<br />Method 'getExpressionText' is not designed for extension - needs to be abstract, final or empty. 131<br />Line has trailing spaces. 134<br />Line has trailing spaces. 135<br />Method 'toString' is not designed for extension - needs to be abstract, final or empty. 137<br />Method 'isSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 156<br />Method 'setSupportAntVariables' is not designed for extension - needs to be abstract, final or empty. 168<br />Parameter supportAntVariables should be final. 168<br />'supportAntVariables' hides a field. 168<br />Method 'isValidAntVariableName' is not designed for extension - needs to be abstract, final or empty. 183<br />Parameter text should be final. 183</p><p>　　一般情况下，与IDE集成在一起使用的时候，点击出错的条目，可以跳转到相应的代码。<br />本贴来自ZDNetChina中文社区<a href="http://bbs.zdnet.com.cn/">http://bbs.zdnet.com.cn</a>,本贴地址：<a href="http://bbs.zdnet.com.cn/viewthread.php?tid=178617">http://bbs.zdnet.com.cn/viewthread.php?tid=178617</a></p><p>&nbsp;</p><p><br />三、CheckStyle的最佳实践</p><p>　　3.1. Sun&#8217;s Code Conventions的修改</p><p>　　在CheckStyle的最新发布版本中，有一个对于Sun的Java编码规范的配置文件信息。但是，其中有很多条目并不一定符合项目开发的需要。就算是对于很多优秀的开源项目，按照这个规范来进行检查，也会出现成千上万的错误。</p><p>　　下面提出的一些修改意见，是从实际项目执行过程中总结出来的，可以作为大家的参考。我们以CheckStyle3.0配置文件的顺序来介绍：</p><p>　　1. 去除对于每个包都有一个package.html文件的限制；</p><p>＜!--＜module name="PackageHtml"/＞--＞<br />　　<br />　　2. 修改对于JavaDoc Comments的限定：对于很多使用Code Generator的项目来说，需要将手写代码与生成代码、<a target="_self"><u><strong>单元测试</strong></u></a>代码的检查分开进行；</p><p>　  　3.   修改对于体积大小的限制：目前，很多显示器都是17寸，而且打印方面的限制也比以前有所改善，同时，由于代码中Factory等模式的运用，以及有意义的  方法名称等约定，默认每行代码的长度（80）是远远不能满足要求；对于方法长度等等，也应该根据项目情况自行决定：</p><p>＜module name="FileLength"/＞<br />＜module name="LineLength"＞<br />＜property name="max" value="120"/＞<br />＜/module＞<br />＜module name="MethodLength"＞<br />＜property name="max" value="300"/＞<br />＜/module＞<br />＜module name="ParameterNumber"/＞</p><p>　　4. 修改对于Throws的的限制：允许Throws Unchecked Exception以及Throws Subclass Of Another Declared Exception。</p><p>＜module name="RedundantThrows"＞<br />＜property name="allowUnchecked" value="true"/＞<br />＜property name="allowSubclasses" value="true"/＞<br />＜/module＞</p><p>　　5. 修改成员变量的可视性：一般情况下，应该允许Protected Members以及Package Visible Members。</p><p>＜module name="VisibilityModifier"＞<br />＜property name="protectedAllowed" value="true"/＞<br />＜property name="packageAllowed" value="true"/＞<br />＜/module＞</p><p>　　3.2. CheckStyle应用的最佳实践</p><p>　　采用CheckStyle以后，编码规范的检查就变得及其简单，可以作为一项切实可行的实践加以执行。</p><p>　　一般情况下，在项目小组中引入CheckStyle可以按照下面的步骤进行：</p><p>　　1． 强调Code Review与Code Conventions的重要作用；</p><p>　　2． 介绍CheckStyle；</p><p>　　3． 初步应用CheckStyle：参照CheckStyle附带的配置文件，酌情加以剪裁，在项目的Ant配置文件中，添加CheckStyle任务，可以单独执行；</p><p>　　4． 修改、定型CheckStyle的配置文件：按照基本配置文件执行一段时间（2～3周），听取开发人员的反馈意见，修改配置信息；</p><p>　  　5．   作为开发过程的日常实践，强制执行CheckStyle：稳定CheckStyle的配置信息，同时将CheckStyle任务作为Build的依赖任务  或者配置源码控制系统（目前，CheckStyle可以与CVS有效集成），使得代码在加入系统之前必须通过检查。</p><p>　　同时需要指出的是，CheckStyle的有效执行需要依赖两个条件：</p><p>　　&#183;Ant的广泛应用：CheckStyle基于Ant执行的方式比较容易，而且可以在项目内容形成一致的执行环境。同时，也比较容易与其它任务，例如Build等发生关联。</p><p>　  　&#183;IDE Format Code的强大功能：由于CheckStyle本身并没有提供很强大的Code   Format等功能，因此，需要借助IDE的帮助，从而使得在发生错误的时候，可以很容易的进行修复。目前，主流的Java   IDE都提供了这方面的功能，IDEA在这方面尤其突出。它提供的统一、可定义的Code Format   Template（项目小组内部可以使用统一模板）以及方便的快捷键功能(Ctrl+Alt+T：Format Code,   Ctrl+Alt+O：Optimize Import等)。</p><p>　　四、结论</p><p>　　利用CheckStyle可以方便的对于编码的Code Conventions进行检查，同时，也有效地减少了Code Review的<a target="_self"><u><strong>工作</strong></u></a>，使得Reviw人员的精力更多的集中到逻辑和性能检查。<br /></p><p>Checkstyle的结果输出</p><p>序号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出内容意义</p><p>1 Type is missing a javadoc commentClass&nbsp; 缺少类型说明</p><p>2&#8220;{&#8221; should be on the previous line &#8220;{&#8221; 应该位于前一行</p><p>3Methos is missing a javadoc comment方法前面缺少javadoc注释</p><p>4Expected @throws tag for &#8220;Exception&#8221;在注释中希望有@throws的说明</p><p>5&#8220;.&#8221; Is preceeded with whitespace &#8220;.&#8221; 前面不能有空格</p><p>6&#8220;.&#8221; Is followed by whitespace&#8220;.&#8221; 后面不能有空格</p><p>7&#8220;=&#8221; is not preceeded with whitespace&#8220;=&#8221; 前面缺少空格</p><p>8&#8220;=&#8221; is not followed with whitespace&#8220;=&#8221; 后面缺少空格</p><p>9&#8220;}&#8221; should be on the same line&#8220;}&#8221; 应该与下条语句位于同一行</p><p>10Unused @param tag for &#8220;unused&#8221;没有参数&#8220;unused&#8221;，不需注释</p><p>11Variable &#8220;CA&#8221; missing javadoc变量&#8220;CA&#8221;缺少javadoc注释</p><p>12Line longer than 80characters行长度超过80</p><p>13Line contains a tab character行含有&#8221;tab&#8221; 字符</p><p>14Redundant &#8220;Public&#8221; modifier冗余的&#8220;public&#8221; modifier</p><p>15Final modifier out of order with the JSL suggestionFinal modifier的顺序错误</p><p>16Avoid using the &#8220;.*&#8221; form of importImport格式避免使用&#8220;.*&#8221;</p><p>17Redundant import from the same package从同一个包中Import内容</p><p>18Unused import-java.util.listImport进来的java.util.list没有被使用</p><p>19Duplicate import to line 13重复Import同一个内容</p><p>20Import from illegal package从非法包中 Import内容</p><p>21&#8220;while&#8221; construct must use &#8220;{}&#8221;&#8220;while&#8221; 语句缺少&#8220;{}&#8221;</p><p>22Variable &#8220;sTest1&#8221; must be private and have accessor method变量&#8220;sTest1&#8221;应该是private的，并且有调用它的方法</p><p>23Variable &#8220;ABC&#8221; must match pattern &#8220;^[a-z][a-zA-Z0-9]*$&#8221;变量&#8220;ABC&#8221;不符合命名规则&#8220;^[a-z][a-zA-Z0-9]*$&#8221;</p><p>24&#8220;(&#8221; is followed by whitespace&#8220;(&#8221; 后面不能有空格 25&#8220;)&#8221; is proceeded by whitespace&#8220;)&#8221; 前面不能有空格</p><p>&nbsp;</p><p>不太明白的错误解答</p><p>1.&nbsp; 'X' hides a field.</p><p>public class Foo<br />{<br />&nbsp;&nbsp;&nbsp; private int bar;</p><p>&nbsp;&nbsp;&nbsp; public Foo(int bar)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.bar = bar;<br />&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp; public final int getBar()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bar;<br />&nbsp;&nbsp;&nbsp; }<br />}</p><p>解释：全局private int bar;和局部public Foo(int bar)的bar变量名字重复。<br />此错误，可以忽略不检查。</p><p><br />2. Parameter X should be final.</p><p><br />public class Foo<br />{<br />&nbsp;&nbsp;&nbsp; private int bar;</p><p>&nbsp;&nbsp;&nbsp; public Foo(int bar)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.bar = bar;<br />&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp; public final int getBar()<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bar;<br />&nbsp;&nbsp;&nbsp; }<br />}</p><p>解释：public Foo(int bar)的局部变量，被认为是不可改变的，检查需要加上final关键字定义public Foo(final int bar)<br />此错误，可以忽略不检查。</p><p>3. Redundant 'X' modifier.</p><p>public interface CacheHRTreeService extends Manager {</p><p>&nbsp;/**<br />&nbsp; * Organization Tree<br />&nbsp; *<br />&nbsp; * @param orgDto<br />&nbsp; * @return<br />&nbsp; * @throws Exception<br />&nbsp; */<br />&nbsp;public void setOrganization(OrganizationDTO orgDto) throws Exception;</p><p>&nbsp;/**<br />&nbsp; * Organization Tree<br />&nbsp; *<br />&nbsp; * @return<br />&nbsp; * @throws Exception<br />&nbsp; */<br />&nbsp;public OrganizationDTO getOrganization() throws Exception;<br />......<br />}</p><p>解释：多余的字段。public OrganizationDTO getOrganization() throws Exception;此时public为多余的字段，因为interface定义的时候，就是public的。</p><p>需要检查。</p><p>4. - Class X should be declared as final.</p><p>解释：对于单例设计模式，要求返回唯一的类对象。但是HRFactory和ContextFactory为优化的两个类，不需求检查。<br /><a target="_self"><u><strong>其他</strong></u></a>的单例类，依然需要进行检查。</p><p><br />5.&nbsp; Utility classes should not have a public or default constructor.</p><p>解释：工具类不必提供默认的构造方法。<br />需要检查，仅仅为提示。</p><p>6. File does not end with a newline.<br />解释：虽然JAVA程序不要求结尾要用新行，但是习惯上应该要空一行。<br />需要检查，仅仅为提示。</p><p>7. - Method 'addChildrenId' is not designed for extension - needs to be<br />&nbsp; abstract, final or empty.</p><p>解释：通过父类继承的，此类有点特殊<br />可以忽略此类。</p><p>8. Variable 'id' must be private and have accessor methods.<br />解释：BaseHRDTO类，为父类，属性给子类继承，比较特殊。<br />但是其他的类，声名需要加上范围'private'关键字<br />需要检查。</p><p>9. -Array brackets at illegal position.<br />解释：代码写法，习惯不一样。<br />需要检查，仅仅提示。</p></div> </div><br /><br /><br /><img src ="http://www.blogjava.net/ashutc/aggbug/351690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-06-03 15:56 <a href="http://www.blogjava.net/ashutc/archive/2011/06/03/351690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0详细配置</title><link>http://www.blogjava.net/ashutc/archive/2011/05/27/351184.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 27 May 2011 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/27/351184.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/351184.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/27/351184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/351184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/351184.html</trackback:ping><description><![CDATA[<div><br />&lt;c3p0-config&gt; <br />&lt;default-config&gt; <br />&lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt; <br />&lt;property name="acquireIncrement"&gt;3&lt;/property&gt; <br /><br />&lt;!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --&gt; <br />&lt;property name="acquireRetryAttempts"&gt;30&lt;/property&gt; <br /><br />&lt;!--两次连接中间隔时间，单位毫秒。Default: 1000 --&gt; <br />&lt;property name="acquireRetryDelay"&gt;1000&lt;/property&gt; <br /><br />&lt;!--连接关闭时默认将所有未提交的操作回滚。Default: false --&gt; <br />&lt;property name="autoCommitOnClose"&gt;false&lt;/property&gt; <br /><br />&lt;!--c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么 <br />属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试 <br />使用。Default: null--&gt; <br />&lt;property name="automaticTestTable"&gt;Test&lt;/property&gt; <br /><br />&lt;!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 <br />保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试 <br />获取连接失败后该数据源将申明已断开并永久关闭。Default: false--&gt; <br />&lt;property name="breakAfterAcquireFailure"&gt;false&lt;/property&gt; <br /><br />&lt;!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出 <br />SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --&gt; <br />&lt;property name="checkoutTimeout"&gt;100&lt;/property&gt; <br /><br />&lt;!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 <br />Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--&gt; <br />&lt;property name="connectionTesterClassName"&gt;&lt;/property&gt; <br /><br />&lt;!--指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可 <br />Default: null--&gt; <br />&lt;property name="factoryClassLocation"&gt;null&lt;/property&gt; <br /><br />&lt;!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. <br />（文档原文）作者强烈建议不使用的一个属性--&gt; <br />&lt;property name="forceIgnoreUnresolvedTransactions"&gt;false&lt;/property&gt; <br /><br />&lt;!--每60秒检查所有连接池中的空闲连接。Default: 0 --&gt; <br />&lt;property name="idleConnectionTestPeriod"&gt;60&lt;/property&gt; <br /><br />&lt;!--初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 --&gt; <br />&lt;property name="initialPoolSize"&gt;3&lt;/property&gt; <br /><br />&lt;!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&gt; <br />&lt;property name="maxIdleTime"&gt;60&lt;/property&gt; <br /><br />&lt;!--连接池中保留的最大连接数。Default: 15 --&gt; <br />&lt;property name="maxPoolSize"&gt;15&lt;/property&gt; <br /><br />&lt;!--JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements <br />属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 <br />如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default: 0--&gt; <br />&lt;property name="maxStatements"&gt;100&lt;/property&gt; <br /><br />&lt;!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --&gt; <br />&lt;property name="maxStatementsPerConnection"&gt;&lt;/property&gt; <br /><br />&lt;!--c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 <br />通过多线程实现多个操作同时被执行。Default: 3--&gt; <br />&lt;property name="numHelperThreads"&gt;3&lt;/property&gt; <br /><br />&lt;!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0 <br />的数据源时。Default: null--&gt; <br />&lt;property name="overrideDefaultUser"&gt;root&lt;/property&gt; <br /><br />&lt;!--与overrideDefaultUser参数对应使用的一个参数。Default: null--&gt; <br />&lt;property name="overrideDefaultPassword"&gt;password&lt;/property&gt; <br /><br />&lt;!--密码。Default: null--&gt; <br />&lt;property name="password"&gt;&lt;/property&gt; <br /><br />&lt;!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意： <br />测试的表必须在初始数据源的时候就存在。Default: null--&gt; <br />&lt;property name="preferredTestQuery"&gt;select id from test where id=1&lt;/property&gt; <br /><br />&lt;!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --&gt; <br />&lt;property name="propertyCycle"&gt;300&lt;/property&gt; <br /><br />&lt;!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 <br />时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable <br />等方法来提升连接测试的性能。Default: false --&gt; <br />&lt;property name="testConnectionOnCheckout"&gt;false&lt;/property&gt; <br /><br />&lt;!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --&gt; <br />&lt;property name="testConnectionOnCheckin"&gt;true&lt;/property&gt; <br /><br />&lt;!--用户名。Default: null--&gt; <br />&lt;property name="user"&gt;root&lt;/property&gt; <br /><br />&lt;!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数 <br />允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始 <br />广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到 <br />支持，但今后可能的版本可能不支持动态反射代理。Default: false--&gt; <br />&lt;property name="usesTraditionalReflectiveProxies"&gt;false&lt;/property&gt; <br /><br />&lt;property name="automaticTestTable"&gt;con_test&lt;/property&gt; <br />&lt;property name="checkoutTimeout"&gt;30000&lt;/property&gt; <br />&lt;property name="idleConnectionTestPeriod"&gt;30&lt;/property&gt; <br />&lt;property name="initialPoolSize"&gt;10&lt;/property&gt; <br />&lt;property name="maxIdleTime"&gt;30&lt;/property&gt; <br />&lt;property name="maxPoolSize"&gt;25&lt;/property&gt; <br />&lt;property name="minPoolSize"&gt;10&lt;/property&gt; <br />&lt;property name="maxStatements"&gt;0&lt;/property&gt; <br />&lt;user-overrides user="swaldman"&gt; <br />&lt;/user-overrides&gt; <br />&lt;/default-config&gt; <br />&lt;named-config name="dumbTestConfig"&gt; <br />&lt;property name="maxStatements"&gt;200&lt;/property&gt; <br />&lt;user-overrides user="poop"&gt; <br />&lt;property name="maxStatements"&gt;300&lt;/property&gt; <br />&lt;/user-overrides&gt; <br />&lt;/named-config&gt; <br />&lt;/c3p0-config&gt; <br /><br /><br />转：<a href="http://www.wujianrong.com/archives/2007/08/c3p0.html" target="_blank">http://www.wujianrong.com/archives/2007/08/c3p0.html</a>解决MYSQL 8小时问题最近的一个项目在Hibernate使用C3P0的连接池，数据库为Mysql。开发测试没有问题，在运行中每个一段长的空闲时间就出现异常:<br /><br />java 代码org.hibernate.exception.JDBCConnectionException: could not execute query <br />at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) <br />at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) <br />....... <br />Caused  by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No  operations allowed after connection closed.Connection was implicitly  closed due to underlying exception/error: <br /><br /><br />** BEGIN NESTED EXCEPTION ** <br /><br />com.mysql.jdbc.CommunicationsException <br />MESSAGE: Communications link failure due to underlying exception: <br /><br />** BEGIN NESTED EXCEPTION ** <br /><br />java.net.SocketException <br />MESSAGE: Broken pipe <br /><br />STACKTRACE: <br /><br />java.net.SocketException: Broken pipe <br />at java.net.SocketOutputStream.socketWrite0(Native Method) <br />...... <br />** END NESTED EXCEPTION ** <br /><br />查看了Mysql的文档，以及Connector/J的文档以及在线说明发现，出现这种异常的原因是：<br /><br />Mysql 服务器默认的&#8220;wait_timeout&#8221;是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该  connection。这就是问题的所在，在C3P0  pools中的connections如果空闲超过8小时，Mysql将其断开，而C3P0并不知道该connection已经失效，如果这时有  Client请求connection，C3P0将该失效的Connection提供给Client，将会造成上面的异常。<br /><br />解决的方法有3种：<br /><br />增加wait_timeout的时间。 <br />减少Connection pools中connection的lifetime。 <br />测试Connection pools中connection的有效性。 <br />当然最好的办法是同时综合使用上述3种方法，下面就DBCP和C3P0分别做一说明，假设wait_timeout为默认的8小时<br /><br />DBCP增加以下配置信息:<br /><br />//set to 'Select 1' <br />validationQuery = "Select 1" <br />//set to 'true' <br />testWhileIdle = "true" <br />//some positive integer <br />timeBetweenEvictionRunsMillis = 3600000 <br />//set to something smaller than 'wait_timeout' <br />minEvictableIdleTimeMillis = 18000000 <br />//if you don't mind a hit for every getConnection(), set to "true" <br />testOnBorrow = "true" <br /><br />C3P0增加以下配置信息:<br /><br />//获取connnection时测试是否有效 <br />testConnectionOnCheckin = true <br />//自动测试的table名称<br /><br />automaticTestTable=C3P0TestTable<br /><br />//set to something much less than wait_timeout, prevents connections from going stale <br />idleConnectionTestPeriod = 18000 <br />//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out <br />maxIdleTime = 25000 <br />//if you can take the performance 'hit', set to "true" <br />testConnectionOnCheckout = true <br /><br />更多的配置信息大家可以查看C3P0文档，Connector/J文档，以及DBCP的文档。<br /><br />转: <a href="http://www.iteye.com/article/38506" target="_blank">http://www.iteye.com/article/38506</a><br /><br />我自己的配置:<br /><br />jdbc.driverClass=com.mysql.jdbc.Driver<br />jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test<br />jdbc.user = root<br />jdbc.password = 12345<br />jdbc.miniPoolSize = 1<br />jdbc.maxPoolSize = 20<br />jdbc.initialPoolSize = 1<br />jdbc.maxIdleTime = 25000<br />jdbc.acquireIncrement = 1<br /><br />jdbc.acquireRetryAttempts = 30<br />jdbc.acquireRetryDelay = 1000<br />jdbc.testConnectionOnCheckin = true<br />jdbc.automaticTestTable = c3p0TestTable<br />jdbc.idleConnectionTestPeriod = 18000<br />jdbc.checkoutTimeout=3000<br /><br />&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br />&nbsp;&nbsp; &lt;property name="driverClass" value="${jdbc.driverClass}" /&gt;<br />&nbsp;&nbsp; &lt;property name="jdbcUrl" value="${jdbc.jdbcUrl}" /&gt;<br />&nbsp;&nbsp; &lt;property name="user" value="${jdbc.user}" /&gt;<br />&nbsp;&nbsp; &lt;property name="password" value="${jdbc.password}" /&gt;<br />&nbsp;&nbsp; &lt;property name="minPoolSize" value="${jdbc.miniPoolSize}" /&gt;<br />&nbsp;&nbsp; &lt;property name="maxPoolSize" value="${jdbc.maxPoolSize}"/&gt;&nbsp;&nbsp;<br />&nbsp;&nbsp; &lt;property name="initialPoolSize" value="${jdbc.initialPoolSize}"/&gt;<br />&nbsp;&nbsp; &lt;property name="maxIdleTime" value="${jdbc.maxIdleTime}"/&gt;<br />&nbsp;&nbsp; &lt;property name="acquireIncrement" value="${jdbc.acquireIncrement}"/&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; &lt;property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}"/&gt;<br />&nbsp;&nbsp; &lt;property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}"/&gt;<br />&nbsp;&nbsp; &lt;property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}"/&gt;<br />&nbsp;&nbsp; &lt;property name="automaticTestTable" value="${jdbc.automaticTestTable}"/&gt;<br />&nbsp;&nbsp; &lt;property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/&gt;<br />&nbsp;&nbsp; &lt;property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/&gt;<br /><br />&lt;/bean&gt;</div><br /><br /><img src ="http://www.blogjava.net/ashutc/aggbug/351184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-27 15:58 <a href="http://www.blogjava.net/ashutc/archive/2011/05/27/351184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计表和字段技巧</title><link>http://www.blogjava.net/ashutc/archive/2011/05/10/349927.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 10 May 2011 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/10/349927.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/349927.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/10/349927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/349927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/349927.html</trackback:ping><description><![CDATA[<h1><font size="2"><strong>&nbsp; 1. 原始单据与实体之间的关系</strong> </font>
</h1>
<p style="text-indent: 2em"><font size="2">可以是一对一、一对多、多对多的关系。在一般情况下，它们是一
对一的关系：即一张原始单据对应且只对应一个实体。在特殊情况下，它们可能是一对多或多对一的关系，即一张原始单证对应多个实体，或多张原始单证对应一个
实体。这里的实体可以理解为基本表。明确这种对应关系后，对我们设计录入界面大有好处。 </font></p>
<p style="text-indent: 2em"><font size="2">【例1】：一份员工履历资料，在人力资源信息系统中，就对应三个基本表：员工基本情况表、社会关系表、工作简历表。这就是&#8220;一张原始单证对应多个实体&#8221;的典型例子。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>2. 主键与外键</strong> </font></p>
<p style="text-indent: 2em"><font size="2">一般而言，一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键，也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。 </font></p>
<p style="text-indent: 2em"><font size="2">主键与外键的设计，在全局数据库的设计中，占有重要地位。当全
局数据库的设计完成以后，有个美国数据库设计专家说：&#8220;键，到处都是键，除了键之外，什么也没有&#8221;，这就是他的数据库设计经验之谈，也反映了他对信息系统
核心(数据模型)的高度抽象思想。因为：主键是实体的高度抽象，主键与外键的配对，表示实体之间的连接。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>3. 基本表的性质</strong> </font></p>
<p style="text-indent: 2em"><font size="2">基本表与中间表、临时表不同，因为它具有如下四个特性： </font></p>
<p style="text-indent: 2em"><font size="2">(1) 原子性。基本表中的字段是不可再分解的。 </font></p>
<p style="text-indent: 2em"><font size="2">(2) 原始性。基本表中的记录是原始数据（基础数据）的记录。 </font></p>
<p style="text-indent: 2em"><font size="2">(3) 演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。 </font></p>
<p style="text-indent: 2em"><font size="2">(4) 稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。 </font></p>
<p style="text-indent: 2em"><font size="2">理解基本表的性质后，在设计数据库时，就能将基本表与中间表、临时表区分开来。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>4. 范式标准</strong> </font></p>
<p style="text-indent: 2em"><font size="2">基本表及其字段之间的关系, 应尽量满足第三范式。但是，满足第三范式的数据库设计，往往不是最好的设计。为了提高数据库的运行效率，常常需要降低范式标准：适当增加冗余，达到以空间换时间的目的。 </font></p>
<p style="text-indent: 2em"><font size="2">【例2】：有一张存放商品的基本表，如表1所示。&#8220;金额&#8221;这个字段的存在，表明该表的设计不满足第三范式，因为&#8220;金额&#8221;可以由&#8220;单价&#8221;乘以&#8220;数量&#8221;得到，说明&#8220;金额&#8221;是冗余字段。但是，增加&#8220;金额&#8221;这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。 </font></p>
<p style="text-indent: 2em"><font size="2">在Rose 2002中，规定列有两种类型：数据列和计算列。&#8220;金额&#8221;这样的列被称为&#8220;计算列&#8221;，而&#8220;单价&#8221;和&#8220;数量&#8221;这样的列被称为&#8220;数据列&#8221;。 </font></p>
<p style="text-indent: 2em"><font size="2">表1 商品表的表结构 </font></p>
<p style="text-indent: 2em"><font size="2">商品名称 商品型号 单价 数量 金额 </font></p>
<p style="text-indent: 2em"><font size="2">电视机 29吋 2,500 40 100,000　　 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>5. 通俗地理解三个范式</strong> </font></p>
<p style="text-indent: 2em"><font size="2">通俗地理解三个范式，对于数据库设计大有好处。在数据库设计中，为了更好地应用三个范式，就必须通俗地理解三个范式(通俗地理解是够用的理解，并不是最科学最准确的理解)： </font></p>
<p style="text-indent: 2em"><font size="2">第一范式：1NF是对属性的原子性约束，要求属性具有原子性，不可再分解； </font></p>
<p style="text-indent: 2em"><font size="2">第二范式：2NF是对记录的惟一性约束，要求记录有惟一标识，即实体的惟一性； </font></p>
<p style="text-indent: 2em"><font size="2">第三范式：3NF是对字段冗余性的约束，即任何字段不能由其他字段派生出来，它要求字段没有冗余. </font></p>
<p style="text-indent: 2em"><font size="2">没有冗余的数据库设计可以做到。但是，没有冗余的数据库未必是
最好的数据库，有时为了提高运行效率，就必须降低范式标准，适当保留冗余数据。具体做法是：在概念数据模型设计时遵守第三范式，降低范式标准的工作放到物
理数据模型设计时考虑。降低范式就是增加字段，允许冗余。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>6. 要善于识别与正确处理多对多的关系</strong> </font></p>
<p style="text-indent: 2em"><font size="2">若两个实体之间存在多对多的关系，则应消除这种关系。消除的办法是，在两者之间增加第三个实体。这样，原来一个多对多的关系，现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个</font>实体中去。这里的第三个实体，实质上是一个较复杂的关系，它对应一张基本表。一般来讲，数据库设计工具不能识别多对多的关系，但能处理多对多的关系。 </p>
<p style="text-indent: 2em"><font size="2">【例3】：在&#8220;图书馆信息系统&#8221;中，&#8220;图书&#8221;是一个实体，&#8220;读
者&#8221;也是一个实体。这两个实体之间的关系，是一个典型的多对多关系：一本图书在不同时间可以被多个读者借阅，一个读者又可以借多本图书。为此，要在二者之
间增加第三个实体，该实体取名为&#8220;借还书&#8221;，它的属性为：借还时间、借还标志(0表示借书，1表示还书)，另外，它还应该有两个外键(&#8220;图书&#8221;的主键，
&#8220;读者&#8221;的主键)，使它能与&#8220;图书&#8221;和&#8220;读者&#8221;连接。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>7. 主键PK的取值方法</strong> </font></p>
<p style="text-indent: 2em"><font size="2">PK是供程序员使用的表间连接工具，可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时，建议字段的个数不要太多，多了不但索引占用空间大，而且速度也慢。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>8. 正确认识数据冗余</strong> </font></p>
<p style="text-indent: 2em"><font size="2">主键与外键在多表中的重复出现, 不属于数据冗余，这个概念必须清楚，事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余！而且是一种低级冗余，即重复性的冗余。高级冗余不是字段的重复出现，而是字段的派生出现。 </font></p>
<p style="text-indent: 2em"><font size="2">【例4】：商品中的&#8220;单价、数量、金额&#8221;三个字段，&#8220;金额&#8221;就
是由&#8220;单价&#8221;乘以&#8220;数量&#8221;派生出来的，它就是冗余，而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性，因为同一数
据，可能从不同时间、地点、角色上多次录入。因此，我们提倡高级冗余(派生性冗余)，反对低级冗余(重复性冗余)。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>9. E&#8211;R图没有标准答案</strong> </font></p>
<p style="text-indent: 2em"><font size="2">信息系统的E&#8211;R图没有标准答案，因为它的设计与画法不是惟一
的，只要它覆盖了系统需求的业务范围和功能内容，就是可行的。反之要修改E&#8211;R图。尽管它没有惟一的标准答案，并不意味着可以随意设计。好的E—R图的标
准是：结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>10. 视图技术在数据库设计中很有用</strong> </font></p>
<p style="text-indent: 2em"><font size="2">与基本表、代码表、中间表不同，视图是一种虚表，它依赖数据源
的实表而存在。视图是供程序员使用数据库的一个窗口，是基表数据综合的一种形式,
是数据处理的一种方法，是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。
若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。 </font></p>
<p style="text-indent: 2em"><font size="2">对于某些与国家政治、经济、技术、军事和安全利益有关的信息系
统，视图的作用更加重要。这些系统的基本表完成物理设计之后，立即在基本表上建立第一层视图，这层视图的个数和结构，与基本表的个数和结构是完全相同。并
且规定，所有的程序员，一律只准在视图上操作。只有数据库管理员，带着多个人员共同掌握的&#8220;安全钥匙&#8221;，才能直接在基本表上操作。请读者想想：这是为什
么？ </font></p>
<p style="text-indent: 2em"><font size="2"><strong>11. 中间表、报表和临时表</strong> </font></p>
<p style="text-indent: 2em"><font size="2">中间表是存放统计数据的表，它是为数据仓库、输出报表或查询结果而设计的，有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的，存放临时记录，为个人所用。基表和中间表由DBA维护，临时表由程序员自己用程序自动维护。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>12. 完整性约束表现在三个方面</strong> </font></p>
<p style="text-indent: 2em"><font size="2">域的完整性：用Check来实现约束，在数据库设计工具中，对字段的取值范围进行定义时，有一个Check按钮，通过它定义字段的值城。参照完整性：用PK、FK、表级触发器来实现。用户定义完整性：它是一些业务规则，用存储过程和触发器来实现。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>13. 防止数据库设计打补丁的方法是&#8220;三少原则&#8221;</strong> </font></p>
<p style="text-indent: 2em"><font size="2">(1) 一个数据</font>库中表的个数越少越好。只有表的个数少了，才能说明系统的E&#8211;R图少而精，去掉了重复的多余的实体，形成了对客观世界的高度抽象，进行了系统的数据集成，防止了打补丁式的设计； </p>
<p style="text-indent: 2em"><font size="2">(2) 一个表中组合主键的字段个数越少越好。因为主键的作用，一是建主键索引，二是做为子表的外键，所以组合主键的字段个数少了，不仅节省了运行时间，而且节省了索引存储空间； </font></p>
<p style="text-indent: 2em"><font size="2">(3)
一个表中的字段个数越少越好。只有字段的个数少了，才能说明在系统中不存在数据重复，且很少有数据冗余，更重要的是督促读者学会&#8220;列变行&#8221;，这样就防止了
将子表中的字段拉入到主表中去，在主表中留下许多空余的字段。所谓&#8220;列变行&#8221;，就是将主表中的一部分内容拉出去，另外单独建一个子表。这个方法很简单，有
的人就是不习惯、不采纳、不执行。 </font></p>
<p style="text-indent: 2em"><font size="2">数据库设计的实用原则是：在数据冗余和处理速度之间找到合适的
平衡点。&#8220;三少&#8221;是一个整体概念，综合观点，不能孤立某一个原则。该原则是相对的，不是绝对的。&#8220;三多&#8221;原则肯定是错误的。试想：若覆盖系统同样的功能，
一百个实体(共一千个属性) 的E&#8211;R图，肯定比二百个实体(共二千个属性) 的E&#8211;R图，要好得多。 </font></p>
<p style="text-indent: 2em"><font size="2">提倡&#8220;三少&#8221;原则，是叫读者学会利用数据库设计技术进行系统的
数据集成。数据集成的步骤是将文件系统集成为应用数据库，将应用数据库集成为主题数据库，将主题数据库集成为全局综合数据库。集成的程度越高，数据共享性
就越强，信息孤岛现象就越少，整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。 </font></p>
<p style="text-indent: 2em"><font size="2">提倡&#8220;三少&#8221;原则的目的，是防止读者利用打补丁技术，不断地对
数据库进行增删改，使企业数据库变成了随意设计数据库表的&#8220;垃圾堆&#8221;，或数据库表的&#8220;大杂院&#8221;，最后造成数据库中的基本表、代码表、中间表、临时表杂乱无
章，不计其数，导致企事业单位的信息系统无法维护而瘫痪。 </font></p>
<p style="text-indent: 2em"><font size="2">&#8220;三多&#8221;原则任何人都可以做到，该原则是&#8220;打补丁方法&#8221;设计数据库的歪理学说。&#8220;三少&#8221;原则是少而精的原则，它要求有较高的数据库设计技巧与艺术，不是任何人都能做到的，因为该原则是杜绝用&#8220;打补丁方法&#8221;设计数据库的理论依据。 </font></p>
<p style="text-indent: 2em"><font size="2"><strong>14. 提高数据库运行效率的办法</strong> </font></p>
<p style="text-indent: 2em"><font size="2">在给定的系统硬件和系统软件条件下，提高数据库系统的运行效率的办法是： </font></p>
<p style="text-indent: 2em"><font size="2">(1) 在数据库物理设计时，降低范式，增加冗余, 少用触发器, 多用存储过程。 </font></p>
<p style="text-indent: 2em"><font size="2">(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条)，复杂计算要先在数据库外面，以文件系统方式用C++语言计算处理完成之后，最后才入库追加到表中去。这是电信计费系统设计的经验。 </font></p>
<p style="text-indent: 2em"><font size="2">(3) 发现某个表的记录太多，例如超过一千万条，则要对该表进行水平分割。水平分割的做法是，以该表主键PK的某个值为界线，将该表的记录水平分割为两个表。若发现某个表的字段太多，例如超过八十个，则垂直分割该表，将原来的一个表分解为两个表。 </font></p>
<p style="text-indent: 2em"><font size="2">(4) 对数据库管理系统DBMS进行系统优化，即优化各种系统参数，如缓冲区个数。 </font></p>
<p style="text-indent: 2em"><font size="2">(5) 在使用面向数据的SQL语言进行程序设计时，尽量采取优化算法。 </font></p>
<p style="text-indent: 2em"><font size="2">总之，要提高数据库的运行效率，必须从数据库系统级优化、数据库设计级优化、程序实现级优化，这三个层次上同时下功夫。 </font></p>
<p style="text-indent: 2em"><font size="2">上述十四个技巧，是许多人在大量的数据库分析与设计实践中，逐步总结出来的。对于这些经验的运用，读者不能生帮硬套，死记硬背，而要消化理解，实事求是，灵活掌握。并逐步做到：在应用中发展，在发展中应用。</font></p>
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/349927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-10 17:15 <a href="http://www.blogjava.net/ashutc/archive/2011/05/10/349927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据表的设计原则</title><link>http://www.blogjava.net/ashutc/archive/2011/05/10/349926.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 10 May 2011 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/10/349926.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/349926.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/10/349926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/349926.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/349926.html</trackback:ping><description><![CDATA[<br />
<p>(1)不应针对整个系统进行数据库设计，而应该根据系统架构中的组件划分，针对每个组件所处理的业务进行组件单元的数据库设计；不同组件间所对应的
数据库表之间的关联应尽可能减少，如果不同组件间的表需要外键关联也尽量不要创建外键关联，而只是记录关联表的一个主键，确保组件对应的表之间的独立性，
为系统或表结构的重构提供可能性。 </p>
<p>(2)采用领域模型驱动的方式和自顶向下的思路进行数据库设计，首先分析系统业务，根据职责定义对象。对象要符合封装的特性，确保与职责相关的数据
项被定义在一个对象之内，这些数据项能够完整描述该职责，不会出现职责描述缺失。并且一个对象有且只有一项职责，如果一个对象要负责两个或两个以上的职
责，应进行分拆。 </p>
<p>(3)根据建立的领域模型进行数据库表的映射，此时应参考数据库设计第二范式：一个表中的所有非关键字属性都依赖于整个关键字。关键字可以是一个属
性，也可以是多个属性的集合，不论那种方式，都应确保关键字能够保证唯一性。在确定关键字时，应保证关键字不会参与业务且不会出现更新异常，这时，最优解
决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。 </p>
<p>(4)由于第一点所述的领域模型驱动的方式设计数据库表结构，领域模型中的每一个对象只有一项职责，所以对象中的数据项不存在传递依赖，所以，这种思路的数据库表结构设计从一开始即满足第三范式：一个表应满足第二范式，且属性间不存在传递依赖。 </p>
<p>(5)同样，由于对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系，所以在领域模型中的对象存在主对象和从对象之分，从对象是从1－N或N－N的角度进一步主对象的业务逻辑，所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。 </p>
<p>(6)在映射后得出的数据库表结构中，应再根据第四范式进行进一步修改，确保不存在多值依赖。这时，应根据反向工程的思路反馈给领域模型。如果表结
构中存在多值依赖，则证明领域模型中的对象具有至少两个以上的职责，应根据第一条进行设计修正。第四范式：一个表如果满足BCNF，不应存在多值依赖。 </p>
<p>(7)在经过分析后确认所有的表都满足二、三、四范式的情况下，表和表之间的关联尽量采用弱关联以便于对表字段和表结构的调整和重构。并且，我认为
数据库中的表是用来持久化一个对象实例在特定时间及特定条件下的状态的，只是一个存储介质，所以，表和表之间也不应用强关联来表述业务（数据间的一致
性），这一职责应由系统的逻辑层来保证，这种方式也确保了系统对于不正确数据（脏数据）的兼容性。当然，从整个系统的角度来说我们还是要尽最大努力确保系
统不会产生脏数据，单从另一个角度来说，脏数据的产生在一定程度上也是不可避免的，我们也要保证系统对这种情况的容错性。这是一个折中的方案。 </p>
<p>(8)应针对所有表的主键和外键建立索引，有针对性的（针对一些大数据量和常用检索方式）建立组合属性的索引，提高检索效率。虽然建立索引会消耗部
分系统资源，但比较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响，以及无索引时的排序操作所带来的性能影响，这种方式仍然是值
得提倡的。 </p>
<p>(9)尽量少采用存储过程，目前已经有很多技术可以替代存储过程的功能如&#8220;对象/关系映射&#8221;等，将数据一致性的保证放在数据库中，无论对于版本控
制、开发和部署、以及数据库的迁移都会带来很大的影响。但不可否认，存储过程具有性能上的优势，所以，当系统可使用的硬件不会得到提升而性能又是非常重要
的质量属性时，可经过平衡考虑选用存储过程。 </p>
<p>(10)当处理表间的关联约束所付出的代价（常常是使用性上的代价）超过了保证不会出现修改、删除、更改异常所付出的代价，并且数据冗余也不是主要
的问题时，表设计可以不符合四个范式。四个范式确保了不会出现异常，但也可能由此导致过于纯洁的设计，使得表结构难于使用，所以在设计时需要进行综合判
断，但首先确保符合四个范式，然后再进行精化修正是刚刚进入数据库设计领域时可以采用的最好办法。 </p>
<p>(11)设计出的表要具有较好的使用性，主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。 </p>
<p>(12)设计出的表要尽可能减少数据冗余，确保数据的准确性，有效的控制冗余有助于提高数据库的性能。 </p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/349926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-10 17:12 <a href="http://www.blogjava.net/ashutc/archive/2011/05/10/349926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计范式</title><link>http://www.blogjava.net/ashutc/archive/2011/05/10/349910.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 10 May 2011 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/10/349910.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/349910.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/10/349910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/349910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/349910.html</trackback:ping><description><![CDATA[<span style="color: red;">设计范式</span>（<span style="font-family: Verdana;"><span style="color: #800080;">范式</span>,
数据库设计范式,数据库的设计范式）是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中，这种规则就是范式。关系数据库中
的关系必须满足一定的要求，即满足不同的范式。目前关系数据库有六种范式：第一范式（1NF）、第二范式（2NF）、第三范式（3NF）、第四范式
（4NF）、第五范式（5NF）和第六范式（6NF）。满足最低要求的范式是第一范式（1NF）。在第一范式的基础上进一步满足更多要求的称为第二范式
（2NF），其余范式以次类推。一般说来，数据库只需满足第三范式（3NF）就行了。下面我们举例介绍第一范式（1NF）、第二范式（2NF）和第三范式
（3NF）。
<p class="cnt"><span style="font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在创建一个数据库的过程中，范化是将其转化为一些表的过程，这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据，从而导致创建多余
的表。范化是在识别数据库中的数据元素、关系，以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。</span></p>
<p class="cnt"><span style="font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是范化的一个例子
Customer Item purchased Purchase price Thomas Shirt $40 Maria Tennis
shoes $35 Evelyn Shirt $40 Pajaro Trousers $25 </span></p>
<p class="cnt"><span style="font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
如果上面这个表用于保存物品的价格，而你想要删除其中的一个顾客，这时你就必须同时删除一个价格。范化就是要解决这个问题，你可以将这个表化为两个表，一
个用于存储每个顾客和他所买物品的信息，另一个用于存储每件产品和其价格的信息，这样对其中一个表做添加或删除操作就不会影响另一个表。<br />
<br />
<strong><span style="text-decoration: underline;">关系数据库的几种设计范式介绍</span></strong></span></p>
<p><span style="font-family: Verdana;">
</span></p>
<p class="cnt"><br />
<strong>1 第一范式（1NF）</strong></p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在任何一个关系数据库中，第一范式（1NF）是对关系模式的基本要求，不满足第一范式（1NF）的数据库就不是关系数据库。</p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
所谓第一范式（1NF）是指数据库表的每一列都是不可分割的基本数据项，同一列中不能有多个值，即实体中的某个属性不能有多个值或者不能有重复的属性。如
果出现重复的属性，就可能需要定义一个新的实体，新的实体由重复的属性构成，新实体与原实体之间为一对多关系。在第一范式（1NF）中表的每一行只包含一
个实例的信息。例如，对于图3-2
中的员工信息表，不能将员工信息都放在一列中显示，也不能将其中的两列或多列在一列中显示；员工信息表的每一行只表示一个员工的信息，一个员工的信息在表
中只出现一次。简而言之，第一范式就是无重复的列。</p>
<p class="cnt"><strong>2 第二范式（2NF）</strong></p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
第二范式（2NF）是在第一范式（1NF）的基础上建立起来的，即满足第二范式（2NF）必须先满足第一范式（1NF）。第二范式（2NF）要求数据库表
中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列，以存储各个实例的惟一标识。如图3-2
员工信息表中加上了员工编号（emp_id）列，因为每个员工的员工编号是惟一的，因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主
码。</p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
第二范式（2NF）要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性，如果存在，那么这个属性和主关键字的这一部
分应该分离出来形成一个新的实体，新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列，以存储各个实例的惟一标识。简而言之，第二范式
就是非主属性非部分依赖于主关键字。</p>
<p class="cnt"><strong>3 第三范式（3NF）</strong></p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
满足第三范式（3NF）必须先满足第二范式（2NF）。简而言之，第三范式（3NF）要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例
如，存在一个部门信息表，其中每个部门有部门编号（dept_id）、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将
部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表，则根据第三范式（3NF）也应该构建它，否则就会有大量的数据冗余。简
而言之，第三范式就是属性不依赖于其它非主属性。 </p>
<p class="cnt"><span style="font-family: Verdana;"><strong><span style="text-decoration: underline;">数据库设计三大范式应用实例剖析</span></strong> </span></p>
<p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
数据库的设计范式是数据库设计所需要满足的规范，满足这些规范的数据库是简洁的、结构明晰的，同时，不会发生插入（insert）、删除（delete）
和更新（update）操作异常。反之则是乱七八糟，不仅给数据库的编程人员制造麻烦，而且面目可憎，可能存储了大量不需要的冗余信息。 <br />
<br />
设计范式是不是很难懂呢？非也，大学教材上给我们一堆数学公式我们当然看不懂，也记不住。所以我们很多人就根本不按照范式来设计数据库。 <br />
<br />
实质上，设计范式用很形象、很简洁的话语就能说清楚，道明白。本文将对范式进行通俗地说明，并以笔者曾经设计的一个简单论坛的数据库为例来讲解怎样将这些范式应用于实际工程。 <br />
<br />
<strong>　　 范式说明 </strong><br />
<br />
第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。 <br />
<br />
例如，如下的数据库表是符合第一范式的： <br />
<br />
</p>
<table style="height: 43px;" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td height="18">字段1 </td>
            <td>字段2 </td>
            <td>字段3 </td>
            <td>字段4 </td>
        </tr>
        <tr>
            <td height="23">　　 </td>
            <td>　　 </td>
            <td>　　 </td>
            <td>　　 </td>
        </tr>
    </tbody>
</table>
<br />
而这样的数据库表是不符合第一范式的： <br />
<br />
<table style="height: 25px;" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td>字段1 </td>
            <td>字段2 </td>
            <td colspan="2">字段3 </td>
            <td>字段4 </td>
        </tr>
        <tr>
            <td>　　 </td>
            <td>　　 </td>
            <td>字段3.1 </td>
            <td>字段3.2 </td>
            <td>　　 </td>
        </tr>
    </tbody>
</table>
<p class="main"><br />
很显然，在当前的任何关系数据库管理系统（DBMS）中，傻瓜也不可能做出不符合第一范式的数据库，因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此，你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。 <br />
<br />
<strong>第二范式（2NF）：</strong>数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。 <br />
<br />
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)，关键字为组合关键字(学号, 课程名称)，因为存在如下决定关系： <br />
<br />
(学号, 课程名称) &#8594; (姓名, 年龄, 成绩, 学分) <br />
<br />
这个数据库表不满足第二范式，因为存在如下决定关系： <br />
<br />
(课程名称) &#8594; (学分) <br />
<br />
(学号) &#8594; (姓名, 年龄) <br />
<br />
即存在组合关键字中的字段决定非关键字的情况。 <br />
<br />
由于不符合2NF，这个选课关系表会存在如下问题： <br />
<br />
(1) 数据冗余： <br />
<br />
同一门课程由n个学生选修，"学分"就重复n-1次；同一个学生选修了m门课程，姓名和年龄就重复了m-1次。 <br />
<br />
(2) 更新异常： <br />
<br />
若调整了某门课程的学分，数据表中所有行的"学分"值都要更新，否则会出现同一门课程学分不同的情况。 <br />
<br />
(3) 插入异常： <br />
<br />
假设要开设一门新的课程，暂时还没有人选修。这样，由于还没有"学号"关键字，课程名称和学分也无法记录入数据库。 <br />
<br />
(4) 删除异常： <br />
<br />
假设一批学生已经完成课程的选修，这些选修记录就应该从数据库表中删除。但是，与此同时，课程名称和学分信息也被删除了。很显然，这也会导致插入异常。 <br />
<br />
把选课关系表SelectCourse改为如下三个表： <br />
<br />
学生：Student(学号, 姓名, 年龄)； <br />
<br />
课程：Course(课程名称, 学分)； <br />
<br />
选课关系：SelectCourse(学号, 课程名称, 成绩)。 <br />
<br />
这样的数据库表是符合第二范式的， 消除了数据冗余、更新异常、插入异常和删除异常。 <br />
<br />
另外，所有单关键字的数据库表都符合第二范式，因为不可能存在组合关键字。 <br />
<br />
<strong>第三范式（3NF）：</strong>在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A &#8594; B &#8594; C"的决定关系，则C传递函数依赖于A。因此，满足第三范式的数据库表应该不存在如下依赖关系： <br />
<br />
关键字段 &#8594; 非关键字段x &#8594; 非关键字段y <br />
<br />
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)，关键字为单一关键字"学号"，因为存在如下决定关系： <br />
<br />
(学号) &#8594; (姓名, 年龄, 所在学院, 学院地点, 学院电话) <br />
<br />
这个数据库是符合2NF的，但是不符合3NF，因为存在如下决定关系： <br />
<br />
(学号) &#8594; (所在学院) &#8594; (学院地点, 学院电话) <br />
<br />
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。 <br />
<br />
它也会存在数据冗余、更新异常、插入异常和删除异常的情况，读者可自行分析得知。 <br />
<br />
把学生关系表分为如下两个表： <br />
<br />
学生：(学号, 姓名, 年龄, 所在学院)； <br />
<br />
学院：(学院, 地点, 电话)。 <br />
<br />
这样的数据库表是符合第三范式的，消除了数据冗余、更新异常、插入异常和删除异常。 <br />
<br />
<strong>鲍依斯-科得范式（BCNF）：</strong>在第三范式的基础上，数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。 <br />
<br />
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量)，且有一个管理员只在一个仓库工作；一个仓库可以存储多种物品。这个数据库表中存在如下决定关系： <br />
<br />
(仓库ID, 存储物品ID) &#8594;(管理员ID, 数量) <br />
<br />
(管理员ID, 存储物品ID) &#8594; (仓库ID, 数量) <br />
<br />
所以，(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字，表中的唯一非关键字段为数量，它是符合第三范式的。但是，由于存在如下决定关系： <br />
<br />
(仓库ID) &#8594; (管理员ID) <br />
<br />
(管理员ID) &#8594; (仓库ID) <br />
<br />
即存在关键字段决定关键字段的情况，所以其不符合BCNF范式。它会出现如下异常情况： <br />
<br />
(1) 删除异常： <br />
<br />
当仓库被清空后，所有"存储物品ID"和"数量"信息被删除的同时，"仓库ID"和"管理员ID"信息也被删除了。 <br />
<br />
(2) 插入异常： <br />
<br />
当仓库没有存储任何物品时，无法给仓库分配管理员。 <br />
<br />
(3) 更新异常： <br />
<br />
如果仓库换了管理员，则表中所有行的管理员ID都要修改。 <br />
<br />
把仓库管理关系表分解为二个关系表： <br />
<br />
仓库管理：StorehouseManage(仓库ID, 管理员ID)； <br />
<br />
仓库：Storehouse(仓库ID, 存储物品ID, 数量)。 <br />
<br />
这样的数据库表是符合BCNF范式的，消除了删除异常、插入异常和更新异常。 </p>
<p class="cnt"><strong>　　 范式应用 </strong><br />
<br />
我们来逐步搞定一个论坛的数据库，有如下信息： <br />
<br />
（1） 用户：用户名，email，主页，电话，联系地址 <br />
<br />
（2） 帖子：发帖标题，发帖内容，回复标题，回复内容 <br />
<br />
第一次我们将数据库设计为仅仅存在表：</p>
<p class="cnt">
</p>
<table style="height: 25px;" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td>用户名 </td>
            <td>email </td>
            <td>主页 </td>
            <td>电话 </td>
            <td>联系地址 </td>
            <td>发帖标题 </td>
            <td>发帖内容 </td>
            <td>回复标题 </td>
            <td>回复内容 </td>
        </tr>
    </tbody>
</table>
<br />
这个数据库表符合第一范式，但是没有任何一组候选关键字能决定数据库表的整行，唯一的关键字段用户名也不能完全决定整个元组。我们需要增加"发帖ID"、"回复ID"字段，即将表修改为： <br />
<br />
<table style="height: 25px;" align="center" border="1" cellpadding="2" cellspacing="0">
    <tbody>
        <tr>
            <td>用户名 </td>
            <td>email </td>
            <td>主页 </td>
            <td>电话 </td>
            <td>联系地址 </td>
            <td>发帖ID </td>
            <td>发帖标题 </td>
            <td>发帖内容 </td>
            <td>回复ID </td>
            <td>回复标题 </td>
            <td>回复内容 </td>
        </tr>
    </tbody>
</table>
<br />
这样数据表中的关键字(用户名，发帖ID，回复ID)能决定整行： <br />
<br />
(用户名,发帖ID,回复ID) &#8594; (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容) <br />
<br />
但是，这样的设计不符合第二范式，因为存在如下决定关系： <br />
<br />
(用户名) &#8594; (email,主页,电话,联系地址) <br />
<br />
(发帖ID) &#8594; (发帖标题,发帖内容) <br />
<br />
(回复ID) &#8594; (回复标题,回复内容) <br />
<br />
即非关键字段部分函数依赖于候选关键字段，很明显，这个设计会导致大量的数据冗余和操作异常。 <br />
<br />
我们将数据库表分解为（带下划线的为关键字）： <br />
<br />
（1） 用户信息：用户名，email，主页，电话，联系地址 <br />
<br />
（2） 帖子信息：发帖ID，标题，内容 <br />
<br />
（3） 回复信息：回复ID，标题，内容 <br />
<br />
（4） 发贴：用户名，发帖ID <br />
<br />
（5） 回复：发帖ID，回复ID <br />
<br />
这样的设计是满足第1、2、3范式和BCNF范式要求的，但是这样的设计是不是最好的呢？ <br />
<br />
不一定。 <br />
<br />
观察可知，第4项"发帖"中的"用户名"和"发帖ID"之间是1：N的关系，因此我们可以把"发帖"合并到第2项的"帖子信息"中；第5项"回复"中的"
发帖ID"和"回复ID"之间也是1：N的关系，因此我们可以把"回复"合并到第3项的"回复信息"中。这样可以一定量地减少数据冗余，新的设计为： <br />
<br />
（1） 用户信息：用户名，email，主页，电话，联系地址 <br />
<br />
（2） 帖子信息：用户名，发帖ID，标题，内容 <br />
<br />
（3） 回复信息：发帖ID，回复ID，标题，内容 <br />
<br />
数据库表1显然满足所有范式的要求； <br />
<br />
数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖，即不满足第二范式的要求，但是这一设计并不会导致数据冗余和操作异常； <br />
<br />
数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖，也不满足第二范式的要求，但是与数据库表2相似，这一设计也不会导致数据冗余和操作异常。 <br />
<br />
由此可以看出，并不一定要强行满足范式的要求，对于1：N关系，当1的一边合并到N的那边后，N的那边就不再满足第二范式了，但是这种设计反而比较好！ <br />
<br />
对于M：N的关系，不能将M一边或N一边合并到另一边去，这样会导致不符合范式要求，同时导致操作异常和数据冗余。 <br />
对于1：1的关系，我们可以将左边的1或者右边的1合并到另一边去，设计导致不符合范式要求，但是并不会导致操作异常和数据冗余。 <br />
<br />
<strong>　　 结论 </strong><br />
<br />
满足范式要求的数据库设计是结构清晰的，同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的，在数据库表中存在1：1或1：N关系这种较特殊的情况下，合并导致的不符合范式要求反而是合理的。 <br />
<br />
在我们设计数据库的时候，一定要时刻考虑范式的要求。</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/349910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-10 13:13 <a href="http://www.blogjava.net/ashutc/archive/2011/05/10/349910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计</title><link>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 09 May 2011 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/349855.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/349855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/349855.html</trackback:ping><description><![CDATA[<br />
<br />
<ol class="article">
    <li>原始单据与实体之间的关系</li>
    <p class="contentNew">可以是一对一、一对多、多对多的关系。在一般情况下，它们是一对一的关系：即一张原始单据对应且只
    对应一个实体。在特殊情况下，它们可能是一对多或多对一的关系，即一张原始单证对应多个实体，或多张原始单证对应一个实体。这里的实体可以理解为基本表。
    明确这种对应关系后，对我们设计录入界面大有好处。</p>
    <p class="contentNew">比如：一份员工履历资料，在人力资源信息系统中，就对应三个基本表：员工基本情况表、社会关系表、工作简历表。这就是&#8220;一张原始单证对应多个实体&#8221;的典型例子。</p>
    <li>主键与外键</li>
    <p class="contentNew">一般而言，一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体,
    可以定义主键，也可以不定义主键（因为它无子孙）, 但必须要有外键（因为它有父亲）。
    主键与外键的设计，在全局数据库的设计中，占有重要地位。当全局数据库的设计完成以后，有个美国数据库设计专家说：&#8220;键，到处都是键，除了键之外，什么也
    没有&#8221;，这就是他的数据库设计经验之谈，也反映了他对信息系统核心（数据模型）的高度抽象思想。因为：主键是实体的高度抽象，主键与外键的配对，表示实体
    之间的连接。</p>
    <li>基本表的性质</li>
    <p class="contentNew">基本表与中间表、临时表不同，因为它具有如下四个特性：</p>
    <ul class="article">
        <li>原子性。基本表中的字段是不可再分解的。</li>
        <li>原始性。基本表中的记录是原始数据（基础数据）的记录。</li>
        <li>演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。</li>
        <li>稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。</li>
    </ul>
    <p class="contentNew">理解基本表的性质后，在设计数据库时，就能将基本表与中间表、临时表区分开来。</p>
    <li>范式标准</li>
    <p class="contentNew">基本表及其字段之间的关系, 应尽量满足第三范式。但是，满足第三范式的数据库设计，往往不是最好的设计。为了提高数据库的运行效率，常常需要降低范式标准：适当增加冗余，达到以空间换时间的目的。</p>
    <p class="contentNew">比如有一张存放商品的基本表，如表1所示。&#8220;金额&#8221;这个字段的存在，表明该表的设计不满足第三范式，因为&#8220;金额&#8221;可以由&#8220;单价&#8221;乘以&#8220;数量&#8221;得到，说明&#8220;金额&#8221;是冗余字段。但是，增加&#8220;金额&#8221;这个冗余字段，可以提高查询统计的速度，这就是以空间换时间的作法。</p>
    <p class="contentNew">在Rose 2002中，规定列有两种类型：数据列和计算列。&#8220;金额&#8221;这样的列被称为&#8220;计算列&#8221;，而&#8220;单价&#8221;和&#8220;数量&#8221;这样的列被称为&#8220;数据列&#8221;。</p>
    <table style="line-height: 150%;" align="center" border="1" cellspacing="0" width="600">
        <tbody>
            <tr>
                <td>商品名称</td>
                <td>商品型号</td>
                <td>单价</td>
                <td>数量</td>
                <td>金额</td>
            </tr>
            <tr>
                <td>电视机</td>
                <td>29吋</td>
                <td>2,500</td>
                <td>40</td>
                <td>100,000</td>
            </tr>
        </tbody>
    </table>
    <p align="center">表1 商品表的表结构</p>
    <li>通俗地理解三个范式</li>
    <p class="contentNew">通俗地理解三个范式，对于数据库设计大有好处。在数据库设计中，为了更好地应用三个范式，就必须通俗地理解三个范式（通俗地理解是够用的理解，并不是最科学最准确的理解）：</p>
    <ul class="article">
        <li>第一范式：1NF是对属性的原子性约束，要求属性具有原子性，不可再分解；</li>
        <li>第二范式：2NF是对记录的惟一性约束，要求记录有惟一标识，即实体的惟一性；</li>
        <li>第三范式：3NF是对字段冗余性的约束，即任何字段不能由其他字段派生出来，它要求字段没有冗余。</li>
    </ul>
    <p class="contentNew">没有冗余的数据库设计可以做到。但是，没有冗余的数据库未必是最好的数据库，有时为了提高运行效率，就必须降低范式标准，适当保留冗余数据。具体做法是：在概念数据模型设计时遵守第三范式，降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段，允许冗余。</p>
    <li>要善于识别与正确处理多对多的关系</li>
    <p class="contentNew">若两个实体之间存在多对多的关系，则应消除这种关系。消除的办法是，在两者之间增加第三个实体。这
    样，原来一个多对多的关系，现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个实体，实质上是一个较复杂的关系，
    它对应一张基本表。一般来讲，数据库设计工具不能识别多对多的关系，但能处理多对多的关系。</p>
    <p class="contentNew">比如在&#8220;图书馆信息系统&#8221;中，&#8220;图书&#8221;是一个实体，&#8220;读者&#8221;也是一个实体。这两个实体之间的关系，
    是一个典型的多对多关系：一本图书在不同时间可以被多个读者借阅，一个读者又可以借多本图书。为此，要在二者之间增加第三个实体，该实体取名为&#8220;借还
    书&#8221;，它的属性为：借还时间、借还标志（0表示借书，1表示还书），另外，它还应该有两个外键（&#8220;图书&#8221;的主键，&#8220;读者&#8221;的主键），使它能与&#8220;图书&#8221;和
    &#8220;读者&#8221;连接。</p>
    <li>主键PK的取值方法</li>
    <p class="contentNew">PK是供程序员使用的表间连接工具，可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时，建议字段的个数不要太多，多了不但索引占用空间大，而且速度也慢。</p>
    <li>正确认识数据冗余</li>
    <p class="contentNew">主键与外键在多表中的重复出现，不属于数据冗余，这个概念必须清楚，事实上有许多人还不清楚。非键字段的重复出现，才是数据冗余！而且是一种低级冗余，即重复性的冗余。高级冗余不是字段的重复出现，而是字段的派生出现。</p>
    <p class="contentNew">比如商品中的&#8220;单价、数量、金额&#8221;三个字段，&#8220;金额&#8221;就是由&#8220;单价&#8221;乘以&#8220;数量&#8221;派生出来的，它就
    是冗余，而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性，因为同一数据，可能从不同时间、地点、角色上多次录
    入。因此，我们提倡高级冗余（派生性冗余），反对低级冗余（重复性冗余）。</p>
    <li>E-R图没有标准答案</li>
    <p class="contentNew">信息系统的E-R图没有标准答案，因为它的设计与画法不是惟一的，只要它覆盖了系统需求的业务范围
    和功能内容，就是可行的。反之要修改E-R图。尽管它没有惟一的标准答案，并不意味着可以随意设计。好的E—R图的标准是：结构清晰、关联简洁、实体个数
    适中、属性分配合理、没有低级冗余。</p>
    <li>视图技术在数据库设计中很有用</li>
    <p class="contentNew">与基本表、代码表、中间表不同，视图是一种虚表，它依赖数据源的实表而存在。视图是供程序员使用数
    据库的一个窗口，是基表数据综合的一种形式, 是数据处理的一种方法，是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间,
    视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义,
    视图的深度就不受限制了。</p>
    <p class="contentNew">对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统，视图的作用更加重要。这些系统的
    基本表完成物理设计之后，立即在基本表上建立第一层视图，这层视图的个数和结构，与基本表的个数和结构是完全相同。并且规定，所有的程序员，一律只准在视
    图上操作。只有数据库管理员，带着多个人员共同掌握的&#8220;安全钥匙&#8221;，才能直接在基本表上操作。请读者想想：这是为什么？</p>
    <li>中间表、报表和临时表</li>
    <p class="contentNew">中间表是存放统计数据的表，它是为数据仓库、输出报表或查询结果而设计的，有时它没有主键与外键（数据仓库除外）。临时表是程序员个人设计的，存放临时记录，为个人所用。基表和中间表由DBA维护，临时表由程序员自己用程序自动维护。</p>
    <li>完整性约束表现在三个方面</li>
    <p class="contentNew">域的完整性：用Check来实现约束，在数据库设计工具中，对字段的取值范围进行定义时，有一个Check按钮，通过它定义字段的值城。</p>
    <p class="contentNew">参照完整性：用PK、FK、表级触发器来实现。</p>
    <p class="contentNew">用户定义完整性：它是一些业务规则，用存储过程和触发器来实现。</p>
    <li>防止数据库设计打补丁的方法是&#8220;三少原则&#8221;</li>
    <ul class="article">
        <li>一个数据库中表的个数越少越好。只有表的个数少了，才能说明系统的E--R图少而精，去掉了重复的多余的实体，形成了对客观世界的高度抽象，进行了系统的数据集成，防止了打补丁式的设计；</li>
        <li>一个表中组合主键的字段个数越少越好。因为主键的作用，一是建主键索引，二是做为子表的外键，所以组合主键的字段个数少了，不仅节省了运行时间，而且节省了索引存储空间；</li>
        <li>一个表中的字段个数越少越好。只有字段的个数少了，才能说明在系统中不存在数据重复，且很少有数据冗余，更重要的是督促
        读者学会&#8220;列变行&#8221;，这样就防止了将子表中的字段拉入到主表中去，在主表中留下许多空余的字段。所谓&#8220;列变行&#8221;，就是将主表中的一部分内容拉出去，另外单
        独建一个子表。这个方法很简单，有的人就是不习惯、不采纳、不执行。</li>
    </ul>
    <p class="contentNew">数据库设计的实用原则是：在数据冗余和处理速度之间找到合适的平衡点。&#8220;三少&#8221;是一个整体概念，综
    合观点，不能孤立某一个原则。该原则是相对的，不是绝对的。&#8220;三多&#8221;原则肯定是错误的。试想：若覆盖系统同样的功能，一百个实体（共一千个属性）
    的E-R图，肯定比二百个实体（共二千个属性） 的E--R图，要好得多。</p>
    <p class="contentNew">提倡&#8220;三少&#8221;原则，是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系
    统集成为应用数据库，将应用数据库集成为主题数据库，将主题数据库集成为全局综合数据库。集成的程度越高，数据共享性就越强，信息孤岛现象就越少，整个企
    业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。</p>
    <p class="contentNew">提倡&#8220;三少&#8221;原则的目的，是防止读者利用打补丁技术，不断地对数据库进行增删改，使企业数据库变成了随意设计数据库表的&#8220;垃圾堆&#8221;，或数据库表的&#8220;大杂院&#8221;，最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章，不计其数，导致企事业单位的信息系统无法维护而瘫痪。</p>
    <p class="contentNew">&#8220;三多&#8221;原则任何人都可以做到，该原则是&#8220;打补丁方法&#8221;设计数据库的歪理学说。&#8220;三少&#8221;原则是少而精的原则，它要求有较高的数据库设计技巧与艺术，不是任何人都能做到的，因为该原则是杜绝用&#8220;打补丁方法&#8221;设计数据库的理论依据。</p>
    <li>提高数据库运行效率的办法</li>
    <p class="contentNew">在给定的系统硬件和系统软件条件下，提高数据库系统的运行效率的办法是：</p>
    <ul class="article">
        <li>在数据库物理设计时，降低范式，增加冗余，少用触发器, 多用存储过程。</li>
        <li>当计算非常复杂、而且记录条数非常巨大时（例如一千万条），复杂计算要先在数据库外面，以文件系统方式用C++语言计算处理完成之后，最后才入库追加到表中去。这是电信计费系统设计的经验。</li>
        <li>发现某个表的记录太多，例如超过一千万条，则要对该表进行水平分割。水平分割的做法是，以该表主键PK的某个值为界线，将该表的记录水平分割为两个表。若发现某个表的字段太多，例如超过八十个，则垂直分割该表，将原来的一个表分解为两个表。</li>
        <li>对数据库管理系统DBMS进行系统优化，即优化各种系统参数，如缓冲区个数。</li>
        <li>在使用面向数据的SQL语言进行程序设计时，尽量采取优化算法。</li>
    </ul>
    <p class="contentNew">总之，要提高数据库的运行效率，必须从数据库系统级优化、数据库设计级优化、程序实现级优化，这三个层次上同时下功夫。</p>
</ol>
<p class="contentNew">上述十四个技巧，是许多人在大量的数据库分析与设计实践中，逐步总结出来的。对于这些经验的运用，读者不能生帮硬套，死记硬背，而要消化理解，实事求是，灵活掌握。并逐步做到：在应用中发展，在发展中应用。 </p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/349855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-05-09 17:13 <a href="http://www.blogjava.net/ashutc/archive/2011/05/09/349855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再谈 ：try中的return语句，在finally前执行还是在finally后执行（网上也大多是之前执行是错误的，附测试数据）</title><link>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 19 Apr 2011 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348559.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348559.html</trackback:ping><description><![CDATA[首先说明下：网上大多说法（finally块会执行，并都会在return之前执行）都是错误的。
<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><span style="color: #000000; ">&nbsp;cn.yu.test001;<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-19&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:&nbsp;测试<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;testReturn&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;test()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;fun1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000;">&nbsp;fun2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fun1()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun1被执行了</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun1的确被执行了,返回么？</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;fun2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2被执行了</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fun2的确被执行了,返回么？</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(testReturn.test());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<br />
<br />
<br />
<br />
结果：fun1被执行了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun1的确被执行了,返回么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun2被执行了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fun2的确被执行了,返回么？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
<br />
证明什么？finally并没有在之前执行，第一个执行的还是try里面的内容但是没有立刻返回,等待执行finally，当finally返回结果后执行完毕。<br />
并不是网上大多数的说法<br />
<br />
还有要说明下 如果finally里面没有返回值，则返回try里面的返回值。<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-19 11:30 <a href="http://www.blogjava.net/ashutc/archive/2011/04/19/348559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分析农夫养牛问题（网上好多错的，尤其是csdn上各种说法都有）</title><link>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 18 Apr 2011 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348503.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348503.html</trackback:ping><description><![CDATA[这个是特指三年后，也就是第四年（牛3岁）才可以生小牛：<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 />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.test;<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;一个农夫养了一头牛，三年后，这头牛每年会生出1头牛，生出来的牛三年后，又可以每年生出一头牛&#8230;&#8230;问农夫10年后有多少头牛?n年呢？（用JAVA实现）&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-18&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Cow&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cowcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CowCount(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;startYear;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;endYear;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(i,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始年份，第一年开始</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">终止年份，第十年终止</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(startYear,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">总牛数：</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">cowcount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
结果 总牛数：19<br />
<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; 总数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1年&nbsp;&nbsp; a&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; 0岁 （刚生下来） &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2年&nbsp;&nbsp; a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 1岁&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; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3年&nbsp;&nbsp; a&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; 2岁&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4年&nbsp;&nbsp; a,b1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;"> 3岁</span>,0岁 （增加一头） &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 2头&nbsp; <br />
（这里理解吧？成年牛4岁才可以生小牛，小牛刚生下来是0岁而不是1岁）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5年&nbsp;&nbsp; a,b1,b2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">4岁</span>，1岁 0岁 &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 3头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6年&nbsp;&nbsp; a,b1,b2,b3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: red;">5岁</span>，2岁 1岁 0岁 &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 4头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7年&nbsp;&nbsp; a,b1,b2,b3,b4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">6岁，3岁</span> 2岁 1岁 0岁 0岁 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8年&nbsp;&nbsp; a,b1,b2,b3,b4,b5,c1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">7岁，4岁 3岁</span> 2岁 1岁 1岁 0岁 &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9年&nbsp;&nbsp; a,b1,b2,b3,b4,b5,b6,c1,c2,d1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">8岁，5岁 4岁</span> <span style="color: red;">3岁</span> 2岁 2岁 1岁&#8230;&#8230; &nbsp;&nbsp;&nbsp;&nbsp; 13头<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10年&nbsp; a,b1,b2,b3,b4,b5,b6,b7,c1,c2,c3,d1,d2 &nbsp; &nbsp; <span style="color: red;">9岁，6岁 5岁 4岁</span> <span style="color: red;">3岁 3岁</span> 2岁&#8230;&#8230; &nbsp;&nbsp; &nbsp; 19头<br />
<br />
如果是第三年生小牛呢（也就是说牛2岁就可以生小牛）<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 />
--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;cn.yu.test;<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;一个农夫养了一头牛，三年后，这头牛每年会生出1头牛，生出来的牛三年后，又可以每年生出一头牛&#8230;&#8230;问农夫10年后有多少头牛?n年呢？（用JAVA实现）&nbsp;<br />
&nbsp;*&nbsp;Created&nbsp;by&nbsp;myeclipse8.5.<br />
&nbsp;*&nbsp;User:&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;yu<br />
&nbsp;*&nbsp;Time:&nbsp;2011-4-18&nbsp;<br />
&nbsp;*&nbsp;Company:&nbsp;天极传媒集团<br />
&nbsp;*&nbsp;Descripion:<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Cow&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cowcount&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CowCount(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cowcount</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">2</span><span style="color: #000000; "> </span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;startYear;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;endYear;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(i,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;startYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始年份，第一年开始</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;endYear</span><span style="color: #000000; ">=</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">终止年份，第十年终止</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CowCount(startYear,&nbsp;endYear);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">总牛数：</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">cowcount);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
结果 总牛数：55<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-18 16:21 <a href="http://www.blogjava.net/ashutc/archive/2011/04/18/348503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lucene评分分析</title><link>http://www.blogjava.net/ashutc/archive/2011/04/15/348339.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 15 Apr 2011 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/15/348339.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348339.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/15/348339.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348339.html</trackback:ping><description><![CDATA[<br />
<div class="blog_content">
<p><span style="font-size: medium;">在IndexSearcher类中有一个管理Lucene得分情况的方法，如下所示：</span></p>
<p><span style="font-size: medium;">public Explanation explain(Weight weight, int doc) throws IOException {<br />
&nbsp;&nbsp;&nbsp; return weight.explain(reader, doc);<br />
}</span></p>
<p><span style="font-size: medium;">返回的这个Explanation的实例解释了Lucene中Document的得分情况。我们可以测试一下，直观地感觉一下到底这个Explanation的实例都记录了一个Document的哪些信息。</span></p>
<p><span style="font-size: medium;">写一个测试类，如下所示：</span></p>
<p><span style="font-size: medium;">package org.shirdrn.lucene.learn;</span></p>
<p><span style="font-size: medium;">import java.io.IOException;<br />
import java.util.Date;</span></p>
<p><span style="font-size: medium;">import net.teamhot.lucene.ThesaurusAnalyzer;</span></p>
<p><span style="font-size: medium;">import org.apache.lucene.document.Document;<br />
import org.apache.lucene.document.Field;<br />
import org.apache.lucene.index.CorruptIndexException;<br />
import org.apache.lucene.index.IndexWriter;<br />
import org.apache.lucene.index.Term;<br />
import org.apache.lucene.index.TermDocs;<br />
import org.apache.lucene.search.Explanation;<br />
import org.apache.lucene.search.Hits;<br />
import org.apache.lucene.search.IndexSearcher;<br />
import org.apache.lucene.search.Query;<br />
import org.apache.lucene.search.TermQuery;<br />
import org.apache.lucene.store.LockObtainFailedException;</span></p>
<p><span style="font-size: medium;">public class AboutLuceneScore {<br />
<br />
private String path = "E:\\Lucene\\index";<br />
<br />
public void createIndex(){<br />
&nbsp;&nbsp; IndexWriter writer;<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; writer = new IndexWriter(path,new ThesaurusAnalyzer(),true);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; Field fieldA = new Field("contents","一人",Field.Store.YES,Field.Index.TOKENIZED); <br />
&nbsp;&nbsp;&nbsp; Document docA = new Document(); <br />
&nbsp;&nbsp;&nbsp; docA.add(fieldA);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; Field fieldB = new Field("contents","一人 之交 一人之交",Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp; Document docB = new Document(); <br />
&nbsp;&nbsp;&nbsp; docB.add(fieldB);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; Field fieldC = new Field("contents","一人 之下 一人之下",Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp; Document docC = new Document(); <br />
&nbsp;&nbsp;&nbsp; docC.add(fieldC);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; Field fieldD = new Field("contents","一人 做事 一人当 一人做事一人当",Field.Store.YES,Field.Index.TOKENIZED); <br />
&nbsp;&nbsp;&nbsp; Document docD = new Document(); <br />
&nbsp;&nbsp;&nbsp; docD.add(fieldD);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; Field fieldE = new Field("contents","一人 做事 一人當 一人做事一人當",Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp; Document docE = new Document(); <br />
&nbsp;&nbsp;&nbsp; docE.add(fieldE);</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; writer.addDocument(docA);<br />
&nbsp;&nbsp;&nbsp; writer.addDocument(docB);<br />
&nbsp;&nbsp;&nbsp; writer.addDocument(docC);<br />
&nbsp;&nbsp;&nbsp; writer.addDocument(docD);<br />
&nbsp;&nbsp;&nbsp; writer.addDocument(docE);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp; } catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; } catch (LockObtainFailedException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }<br />
}<br />
<br />
public static void main(String[] args) {<br />
&nbsp;&nbsp; AboutLuceneScore aus = new AboutLuceneScore();<br />
&nbsp;&nbsp; aus.createIndex();&nbsp;&nbsp;&nbsp;</span><span style="font-size: medium;"><span style="color: #339966;"> // 建立索引<br />
</span>&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; String keyword = "一人";<br />
&nbsp;&nbsp;&nbsp; Term term = new Term("contents",keyword);<br />
&nbsp;&nbsp;&nbsp; Query query = new TermQuery(term); <br />
&nbsp;&nbsp;&nbsp; IndexSearcher searcher = new IndexSearcher(aus.path);<br />
&nbsp;&nbsp;&nbsp; Date startTime = new Date();<br />
&nbsp;&nbsp;&nbsp; Hits hits = searcher.search(query);<br />
&nbsp;&nbsp;&nbsp; TermDocs termDocs = searcher.getIndexReader().termDocs(term);<br />
&nbsp;&nbsp;&nbsp; while(termDocs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("搜索关键字&lt;"+keyword+"&gt;在编号为 "+termDocs.doc());<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" 的Document中出现过 "+termDocs.freq()+" 次");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; System.out.println("********************************************************************");<br />
&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;hits.length();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Document的内部编号为 ： "+hits.id(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Document内容为 ： "+hits.doc(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Document得分为 ： "+hits.score(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp; Explanation e = searcher.explain(query, hits.id(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Explanation为 ： \n"+e);<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Document对应的Explanation的一些参数值如下： ");<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Explanation的getValue()为 ： "+e.getValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Explanation的getDescription()为 ： "+e.getDescription());<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("********************************************************************");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; System.out.println("共检索出符合条件的Document "+hits.length()+" 个。");<br />
&nbsp;&nbsp;&nbsp; Date finishTime = new Date();<br />
&nbsp;&nbsp;&nbsp; long timeOfSearch = finishTime.getTime() - startTime.getTime();<br />
&nbsp;&nbsp;&nbsp; System.out.println("本次搜索所用的时间为 "+timeOfSearch+" ms");<br />
&nbsp;&nbsp; } catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp;<br />
}<br />
}</span></p>
<p><span style="font-size: medium;">该测试类中实现了一个建立索引的方法createIndex()方法；然后通过检索一个关键字&#8220;一人&#8221;，获取到与它相关的Document的信息。</span></p>
<p><span style="font-size: medium;">打印出结果的第一部分为：这个检索关键字&#8220;一人&#8221;在每个Document中出现的次数。</span></p>
<p><span style="font-size: medium;">打印出结果的第二部分为：相关的Explanation及其得分情况的信息。</span></p>
<p><span style="font-size: medium;">测试结果输出如下所示：</span></p>
<p><span style="font-size: medium;">搜索关键字&lt;一人&gt;在编号为 0 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 1 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 2 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 3 的Document中出现过 2 次<br />
搜索关键字&lt;一人&gt;在编号为 4 的Document中出现过 2 次<br />
********************************************************************<br />
Document的内部编号为 ： 0<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人&gt;&gt;<br />
Document得分为 ： 0.81767845<br />
Explanation为 ： <br />
0.81767845 = (MATCH) fieldWeight(contents:一人 in 0), product of:<br />
1.0 = tf(termFreq(contents:一人)=1)<br />
0.81767845 = idf(docFreq=5)<br />
1.0 = fieldNorm(field=contents, doc=0)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.81767845<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 0), product of:<br />
********************************************************************<br />
Document的内部编号为 ： 3<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人 做事 一人当 一人做事一人当&gt;&gt;<br />
Document得分为 ： 0.5059127<br />
Explanation为 ： <br />
0.5059127 = (MATCH) fieldWeight(contents:一人 in 3), product of:<br />
1.4142135 = tf(termFreq(contents:一人)=2)<br />
0.81767845 = idf(docFreq=5)<br />
0.4375 = fieldNorm(field=contents, doc=3)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.5059127<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 3), product of:<br />
********************************************************************<br />
Document的内部编号为 ： 4<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人 做事 一人當 一人做事一人當&gt;&gt;<br />
Document得分为 ： 0.5059127<br />
Explanation为 ： <br />
0.5059127 = (MATCH) fieldWeight(contents:一人 in 4), product of:<br />
1.4142135 = tf(termFreq(contents:一人)=2)<br />
0.81767845 = idf(docFreq=5)<br />
0.4375 = fieldNorm(field=contents, doc=4)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.5059127<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 4), product of:<br />
********************************************************************<br />
Document的内部编号为 ： 1<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人 之交 一人之交&gt;&gt;<br />
Document得分为 ： 0.40883923<br />
Explanation为 ： <br />
0.40883923 = (MATCH) fieldWeight(contents:一人 in 1), product of:<br />
1.0 = tf(termFreq(contents:一人)=1)<br />
0.81767845 = idf(docFreq=5)<br />
0.5 = fieldNorm(field=contents, doc=1)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.40883923<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 1), product of:<br />
********************************************************************<br />
Document的内部编号为 ： 2<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人 之下 一人之下&gt;&gt;<br />
Document得分为 ： 0.40883923<br />
Explanation为 ： <br />
0.40883923 = (MATCH) fieldWeight(contents:一人 in 2), product of:<br />
1.0 = tf(termFreq(contents:一人)=1)<br />
0.81767845 = idf(docFreq=5)<br />
0.5 = fieldNorm(field=contents, doc=2)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.40883923<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 2), product of:<br />
********************************************************************<br />
共检索出符合条件的Document 5 个。<br />
本次搜索所用的时间为 79 ms</span></p>
<p><span style="font-size: medium;">先从测试的输出结果进行分析，可以获得到如下信息：</span></p>
<p><span style="font-size: medium;">■ 测试类中hits.score(i)的值与Explanation的getValue()的值是一样的，即Lucene默认使用的得分；</span></p>
<p><span style="font-size: medium;">■ 默认情况下，Lucene按照Document的得分进行排序检索结果；</span></p>
<p><span style="font-size: medium;">■ 默认情况下，如果两个Document的得分相同，按照Document的内部编号进行排序，比如上面编号为(3和4)、(1和2)是两组得分相同的Document，结果排序时按照Document的编号进行了排序；</span></p>
<p><span style="font-size: medium;">通过从IndexSearcher类中的explain方法：</span></p>
<p><span style="font-size: medium;">public Explanation explain(Weight weight, int doc) throws IOException {<br />
&nbsp;&nbsp;&nbsp; return weight.explain(reader, doc);<br />
}</span></p>
<p><span style="font-size: medium;">可以看出，实际上是调用了Weight接口类中的explain()方法，而Weight是与一个Query相关的，它记录了一次查询构造的Query的情况，从而保证一个Query实例可以重用。</span></p>
<p><span style="font-size: medium;">具体地，可以在实现Weight接口的具体类TermWeight中追溯到explain()方法，而TermWeight类是一个内部类，定义在TermQuery类内部。TermWeight类的explain()方法如下所示：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; public Explanation explain(IndexReader reader, int doc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException {</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComplexExplanation result = new ComplexExplanation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.setDescription("weight("+getQuery()+" in "+doc+"), product of:");</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">Explanation idfExpl = new Explanation(idf, "idf(docFreq=" + reader.docFreq(term) + ")");</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339966;">// explain query weight</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation queryExpl = new Explanation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryExpl.setDescription("queryWeight(" + getQuery() + "), product of:");</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation boostExpl = new Explanation(getBoost(), "boost");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (getBoost() != 1.0f)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryExpl.addDetail(boostExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryExpl.addDetail(idfExpl);</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation queryNormExpl = new Explanation(queryNorm,"queryNorm");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryExpl.addDetail(queryNormExpl);</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryExpl.setValue(boostExpl.getValue() *idfExpl.getValue() *queryNormExpl.getValue());</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.addDetail(queryExpl);</span></p>
<p><span style="font-size: medium;"><span style="color: #339966;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 说明Field的权重<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String field = term.field();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComplexExplanation fieldExpl = new ComplexExplanation();<br />
<span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.setDescription("fieldWeight("+term+" in "+doc+"), product of:");</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation tfExpl = scorer(reader).explain(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.addDetail(tfExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.addDetail(idfExpl);</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation fieldNormExpl = new Explanation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] fieldNorms = reader.norms(field);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float fieldNorm =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) : 0.0f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldNormExpl.setValue(fieldNorm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldNormExpl.setDescription("fieldNorm(field="+field+", doc="+doc+")");</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.addDetail(fieldNormExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.setMatch(Boolean.valueOf(tfExpl.isMatch()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldExpl.setValue(tfExpl.getValue() *idfExpl.getValue() *fieldNormExpl.getValue());</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.addDetail(fieldExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.setMatch(fieldExpl.getMatch());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: medium;"><span style="color: #339966;">// combine them<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.setValue(queryExpl.getValue() * fieldExpl.getValue());</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queryExpl.getValue() == 1.0f)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fieldExpl;</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: medium;">根据检索结果，以及上面的TermWeight类的explain()方法，可以看出输出的字符串部分正好一一对应，比如：idf(Inverse Document Frequency，即反转文档频率)、fieldNorm、fieldWeight。</span></p>
<p><span style="font-size: medium;">检索结果的第一个Document的信息：</span></p>
<p><span style="font-size: medium;">Document的内部编号为 ： 0<br />
Document内容为 ： Document&lt;stored/uncompressed,indexed,tokenized&lt;contents:一人&gt;&gt;<br />
Document得分为 ： 0.81767845<br />
Explanation为 ： <br />
0.81767845 = (MATCH) fieldWeight(contents:一人 in 0), product of:<br />
</span><span style="font-size: medium;"><span style="color: #ff0000;">1.0 = tf(termFreq(contents:一人)=1)<br />
</span>0.81767845 = idf(docFreq=5)<br />
1.0 = fieldNorm(field=contents, doc=0)</span></p>
<p><span style="font-size: medium;">Document对应的Explanation的一些参数值如下： <br />
Explanation的getValue()为 ： 0.81767845<br />
Explanation的getDescription()为 ： fieldWeight(contents:一人 in 0), product of:</span></p>
<p><strong><span style="font-size: medium;">tf的计算</span></strong></p>
<p><span style="font-size: medium;">上面的tf值Term Frequency，即词条频率，可以在org.apache.lucene.search.Similarity类中看到具体地说明。在Lucene中，并不是直接使用的词条的频率，而实际使用的词条频率的平方根，即：</span></p>
<p>
</p>
<table class="FCK__ShowTableBorders" align="center" border="0" cellpadding="2" cellspacing="2">
    <tbody>
        <tr>
            <td valign="middle" align="right"><span style="font-size: medium;"><code><span style="font-family: NSimsun;">tf(t in d)</span></code> =</span></td>
            <td valign="top" align="center"><span style="font-size: medium;">frequency<sup><big>&#189;</big></sup></span></td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: medium;">这是使用org.apache.lucene.search.Similarity类的子类DefaultSimilarity中的方法计算的，如下：</span></p>
<p><span style="font-size: medium;"><span style="color: #339966;">/** Implemented as &lt;code&gt;sqrt(freq)&lt;/code&gt;. */</span><br />
public float tf(float freq) {<br />
&nbsp;&nbsp;&nbsp; return (float)Math.sqrt(freq);<br />
}</span></p>
<p><span style="font-size: medium;">即：某个Document的tf = 检索的词条在该Document中出现次数freq取平方根值</span></p>
<p><span style="font-size: medium;">也就是freq的平方根。</span></p>
<p><span style="font-size: medium;">例如，从我们的检索结果来看：</span></p>
<p><span style="font-size: medium;">搜索关键字&lt;一人&gt;在编号为 0 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 1 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 2 的Document中出现过 1 次<br />
搜索关键字&lt;一人&gt;在编号为 3 的Document中出现过 2 次<br />
搜索关键字&lt;一人&gt;在编号为 4 的Document中出现过 2 次</span></p>
<p><span style="font-size: medium;">各个Document的tf计算如下所示：</span></p>
<p><span style="font-size: medium;">编号为0的Document的 tf 为： (float)Math.sqrt(1) = 1.0；<br />
编号为1的Document的 tf 为： (float)Math.sqrt(1) = 1.0；<br />
编号为2的Document的 tf 为： (float)Math.sqrt(1) = 1.0；<br />
编号为3的Document的 tf 为： (float)Math.sqrt(2) = 1.4142135；<br />
编号为4的Document的 tf 为： (float)Math.sqrt(2) = 1.4142135；</span></p>
<p><strong><span style="font-size: medium;">idf的计算</span></strong></p>
<p><span style="font-size: medium;">检索结果中，每个检索出来的Document的都对应一个idf，在DefaultSimilarity类中可以看到idf计算的实现方法，如下：</span></p>
<p><span style="font-size: medium;"><span style="color: #339966;">/** Implemented as &lt;code&gt;log(numDocs/(docFreq+1)) + 1&lt;/code&gt;. */</span><br />
public float idf(int docFreq, int numDocs) {<br />
&nbsp;&nbsp;&nbsp; return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);<br />
}</span></p>
<p><span style="font-size: medium;">其中，docFreq是根据指定关键字进行检索，检索到的Document的数量，我们测试的docFreq=5；numDocs是指索引文件中总共的Document的数量，我们的测试比较特殊，将全部的Document都检索出来了，我们测试的numDocs=5。</span></p>
<p><span style="font-size: medium;">各个Document的idf的计算如下所示：</span></p>
<p><span style="font-size: medium;">编号为0的Document的 idf 为：(float)(Math.log(5/(double)(5+1)) + 1.0) = 0.81767845；<br />
编号为1的Document的 idf 为：(float)(Math.log(5/(double)(5+1)) + 1.0) = 0.81767845；<br />
编号为2的Document的 idf 为：(float)(Math.log(5/(double)(5+1)) + 1.0) = 0.81767845；<br />
编号为3的Document的 idf 为：(float)(Math.log(5/(double)(5+1)) + 1.0) = 0.81767845；<br />
编号为4的Document的 idf 为：(float)(Math.log(5/(double)(5+1)) + 1.0) = 0.81767845；</span></p>
<p><strong><span style="font-size: medium;">lengthNorm的计算</span></strong></p>
<p><span style="font-size: medium;">在DefaultSimilarity类中可以看到lengthNorm计算的实现方法，如下：</span></p>
<p><span style="font-size: medium;">public float lengthNorm(String fieldName, int numTerms) {<br />
&nbsp;&nbsp;&nbsp; return (float)(1.0 / Math.sqrt(numTerms));<br />
}</span></p>
<p><span style="font-size: medium;">各个Document的lengthNorm的计算如下所示：</span></p>
<p><span style="font-size: medium;">编号为0的Document的 lengthNorm 为：(float)(1.0 / Math.sqrt(1)) = 1.0/1.0 = 1.0；<br />
编号为1的Document的 lengthNorm 为：(float)(1.0 / Math.sqrt(1)) = 1.0/1.0 = 1.0；<br />
编号为2的Document的 lengthNorm 为：(float)(1.0 / Math.sqrt(1)) = 1.0/1.0 = 1.0；<br />
编号为3的Document的 lengthNorm 为：(float)(1.0 / Math.sqrt(2)) = 1.0/1.4142135 = 0.7071068；<br />
编号为4的Document的 lengthNorm 为：(float)(1.0 / Math.sqrt(2)) = 1.0/1.4142135 = 0.7071068；</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: medium;">关于fieldNorm</span></strong></p>
<p><span style="font-size: medium;">fieldNorm是在建立索引的时候写入的，而检索的时候需要从索引文件中读取，然后通过解码，得到fieldNorm的float型值，用于计算Document的得分。</span></p>
<p><span style="font-size: medium;">在org.apache.lucene.search.TermQuery.TermWeight类中，explain方法通过打开的IndexReader流读取fieldNorm，写入索引文件的是byte[]类型，需要解码，如下所示：</span></p>
<p><span style="font-size: medium;">byte[] fieldNorms = reader.norms(field);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float fieldNorm = fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) : 0.0f;</span></p>
<p><span style="font-size: medium;">调用Similarity类的decodeNorm方法，将byte[]类型值转化为float浮点值：</span></p>
<p><span style="font-size: medium;">public static float decodeNorm(byte b) {<br />
&nbsp;&nbsp;&nbsp; return NORM_TABLE[b &amp; 0xFF]; <span style="color: #339966;">// &amp; 0xFF maps negative bytes to positive above 127</span><br />
}</span></p>
<p><span style="font-size: medium;">这样，一个浮点型的fieldNorm的值就被读取出来了，可以参加一些运算，最终实现Lucene的Document的得分的计算。</span></p>
<p><strong><span style="font-size: medium;">queryWeight的计算</span></strong></p>
<p><span style="font-size: medium;">queryWeight的计算可以在org.apache.lucene.search.TermQuery.TermWeight类中的sumOfSquaredWeights方法中看到计算的实现：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; public float sumOfSquaredWeights() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryWeight = idf * getBoost();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: medium;"><span style="color: #339966;"> // compute query weight<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return queryWeight * queryWeight;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: medium;"><span style="color: #339966;"> // square it<br />
</span>&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: medium;">其实默认情况下，queryWeight = idf，因为Lucune中默认的激励因子boost = 1.0。</span></p>
<p><span style="font-size: medium;">各个Document的queryWeight的计算如下所示：</span></p>
<p><span style="font-size: medium;">queryWeight = 0.81767845 * 0.81767845 = 0.6685980475944025；</span></p>
<p><strong><span style="font-size: medium;">queryNorm的计算</span></strong></p>
<p><span style="font-size: medium;">queryNorm的计算在DefaultSimilarity类中实现，如下所示：</span></p>
<p><span style="font-size: medium;"><span style="color: #339966;">/** Implemented as &lt;code&gt;1/sqrt(sumOfSquaredWeights)&lt;/code&gt;. */</span><br />
public float queryNorm(float sumOfSquaredWeights) {<br />
&nbsp;&nbsp;&nbsp; return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));<br />
}</span></p>
<p><span style="font-size: medium;">这里，sumOfSquaredWeights的计算是在org.apache.lucene.search.TermQuery.TermWeight类中的sumOfSquaredWeights方法实现：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; public float sumOfSquaredWeights() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryWeight = idf * getBoost();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: medium;"><span style="color: #339966;"> // compute query weight<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return queryWeight * queryWeight;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: medium;"><span style="color: #339966;"> // square it<br />
</span>&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: medium;">其实默认情况下，sumOfSquaredWeights = idf * idf，因为Lucune中默认的激励因子boost = 1.0。</span></p>
<p><span style="font-size: medium;">上面测试例子中sumOfSquaredWeights的计算如下所示：</span></p>
<p><span style="font-size: medium;">sumOfSquaredWeights = 0.81767845*0.81767845 = 0.6685980475944025；</span></p>
<p><span style="font-size: medium;">然后，就可以计算queryNorm的值了，计算如下所示：</span></p>
<p><span style="font-size: medium;">queryNorm = (float)(1.0 / Math.sqrt(0.6685980475944025) = 1.2229746301862302962735534977105；</span></p>
<p><strong><span style="font-size: medium;">value的计算</span></strong></p>
<p><span style="font-size: medium;">org.apache.lucene.search.TermQuery.TermWeight类类中还定义了一个value成员：</span></p>
<p><span style="font-size: medium;">private float value;</span></p>
<p><span style="font-size: medium;">关于value的计算，可以在它的子类org.apache.lucene.search.TermQuery.TermWeight类中看到计算的实现：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp; public void normalize(float queryNorm) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.queryNorm = queryNorm;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queryWeight *= queryNorm;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339966;">// normalize query weight</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = queryWeight * idf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966;"> // idf for document</span><br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: medium;">这里，使用normalize方法计算value的值，即：</span></p>
<p><span style="font-size: medium;">value = queryNorm * queryWeight * idf;</span></p>
<p><span style="font-size: medium;">上面测试例子中value的值计算如下：</span></p>
<p><span style="font-size: medium;">value = 1.2229746301862302962735534977105 * 0.6685980475944025 * 0.81767845 = 0.66859804759440249999999999999973；</span></p>
<p><strong><span style="font-size: medium;">关于fieldWeight</span></strong></p>
<p><span style="font-size: medium;">从检索结果中，可以看到：</span></p>
<p><span style="font-size: medium;">0.81767845 = (MATCH) fieldWeight(contents:一人 in 0), product of:</span></p>
<p><span style="font-size: medium;">字符串"(MATCH) "的输在ComplexExplanation类中的getSummary方法中可以看到：</span></p>
<p><span style="font-size: medium;">protected String getSummary() {<br />
&nbsp;&nbsp;&nbsp; if (null == getMatch())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.getSummary();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return getValue() + " = "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + (isMatch() ? "(MATCH) " : "(NON-MATCH) ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + getDescription();<br />
}</span></p>
<p><span style="font-size: medium;">这个fieldWeight的值其实和Document的得分是相等的，先看这个fieldWeight是如何计算出来的，在org.apache.lucene.search.TermQuery.TermWeight类中的explain方法中可以看到：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComplexExplanation <span style="color: #ff0000;">fieldExpl</span> = new ComplexExplanation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.setDescription("fieldWeight("+term+" in "+doc+<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; "), product of:");</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation tfExpl = scorer(reader).explain(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.addDetail(tfExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.addDetail(idfExpl);</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Explanation fieldNormExpl = new Explanation();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] fieldNorms = reader.norms(field);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float fieldNorm =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldNorms!=null ? Similarity.decodeNorm(fieldNorms[doc]) : 0.0f;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldNormExpl.setValue(fieldNorm);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldNormExpl.setDescription("fieldNorm(field="+field+", doc="+doc+")");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.addDetail(fieldNormExpl);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.setMatch(Boolean.valueOf(tfExpl.isMatch()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">fieldExpl</span>.setValue(tfExpl.getValue() *<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; idfExpl.getValue() *<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; fieldNormExpl.getValue());</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.addDetail(<span style="color: #ff0000;">fieldExpl</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.setMatch(<span style="color: #ff0000;">fieldExpl</span>.getMatch());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966;"> // combine them</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.setValue(queryExpl.getValue() * <span style="color: #ff0000;">fieldExpl</span>.getValue());</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queryExpl.getValue() == 1.0f)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <span style="color: #ff0000;">fieldExpl</span>;</span></p>
<p><span style="font-size: medium;">上面，ComplexExplanation fieldExpl被设置了很多项内容，我们就从这里来获取fieldWeight的计算的实现。</span></p>
<p><span style="font-size: medium;">关键是在下面进行了计算：</span></p>
<p><span style="font-size: medium;"><span style="color: #ff0000;">fieldExpl</span>.setValue(tfExpl.getValue() *<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; idfExpl.getValue() *<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; fieldNormExpl.getValue());</span></p>
<p><span style="font-size: medium;">使用计算式表示就是</span></p>
<p><span style="font-size: medium;">fieldWeight = tf * idf * fieldNorm</span></p>
<p><span style="font-size: medium;">fieldNorm的值因为是在建立索引的时候写入到索引文件中的，索引只需要从上面的测试结果中取来，进行如下关于Document的分数的计算的验证。</span></p>
<p><span style="font-size: medium;">使用我们这个例子来计算检索出来的Docuyment的fieldWeight，需要用到前面计算出来的结果，如下所示：</span></p>
<p><span style="font-size: medium;">编号为0的Document的 fieldWeight 为：1.0 * 0.81767845 * 1.0 = 0.81767845；<br />
编号为1的Document的 fieldWeight 为：1.0 * 0.81767845 * 0.5 = 0.408839225；<br />
编号为2的Document的 fieldWeight 为：1.0 * 0.81767845 * 0.5 = 0.408839225；<br />
编号为3的Document的 fieldWeight 为：1.4142135 * 0.81767845 * 0.4375 = 0.5059127074089703125；<br />
编号为4的Document的 fieldWeight 为：1.4142135 * 0.81767845 * 0.4375 = 0.5059127074089703125；</span></p>
<p><span style="font-size: medium;">对比一下，其实检索结果中Document的得分就是这个fieldWeight的值，验证后，正好相符(注意：我这里没有进行舍入运算)。</span></p>
<p><strong><span style="font-size: medium;">总结说明</span></strong></p>
<p><span style="font-size: medium;">上面的计算得分是按照Lucene默认设置的情况下进行的，比如激励因子的默认值为1.0，它体现的是一个Document的重要性，即所谓的fieldWeight。</span></p>
<p><span style="font-size: medium;">不仅可以通过为一个Document设置激励因子boost，而且可以通过为一个Document中的Field设置boost，因为一个Document的权重体现在它当中的Field上，即上面计算出来的fieldWeight与Document的得分是相等的。</span></p>
<p><span style="font-size: medium;">提高一个Document的激励因子boost，可以使该Document被检索出来的默认排序靠前，即说明比较重要。也就是说，修改激励因子boost能够改变检索结果的排序。</span></p>
</div>
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-15 11:02 <a href="http://www.blogjava.net/ashutc/archive/2011/04/15/348339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hashmap的遍历方式</title><link>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 14 Apr 2011 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348299.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348299.html</trackback:ping><description><![CDATA[<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><span style="color: #000000; ">&nbsp;cn.yu.hashmap;<br />
<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.HashMap;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Iterator;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Map;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Map.Entry;<br />
<br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;hashmap&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">aaa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">2</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bbb</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">3</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ccc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">4</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ddd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">5</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">eee</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">6</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">fff</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">7</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ggg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">8</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hhh</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">9</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">iii</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;遍历hashmap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap1(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用keySet遍历<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap2(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用entrySet遍历&nbsp;速度快<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashmap3(map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap1(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Map.Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;entry&nbsp;:&nbsp;map.entrySet())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Key:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;entry.getKey()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;value:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;entry.getValue().toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap2(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;it</span><span style="color: #000000; ">=</span><span style="color: #000000; ">map.keySet().iterator();</span><span style="color: #008000; ">//</span><span style="color: #008000; ">这是取得键对象&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(it.hasNext())&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">value:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">map.get(it.next()));&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">获得键所对应的值。&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;hashmap3(HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;map.entrySet().iterator();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(it.hasNext()){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;entry</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">)it.next();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">key:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">entry.getKey()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;value:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">entry.getValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;line(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">========================华丽的分割线===============================</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
&nbsp; Hashmap实际上是一个数组和链表的结合体，利用数组来模拟一个个桶（类似于Bucket Sort）以快速存取不同hashCode的key，对于相同hashCode的不同key，再调用其equals方法从List中提取出和key所相对应的value<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/348299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-14 15:43 <a href="http://www.blogjava.net/ashutc/archive/2011/04/14/348299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring3.0注解</title><link>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 14 Apr 2011 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348270.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348270.html</trackback:ping><description><![CDATA[<p>使用 @Repository、@Service、@Controller 和 @Component 将类标识为 Bean</p>
<p>Spring 自 2.0 版本开始，陆续引入了一些注解用于简化 Spring 的开发。@Repository
注解便属于最先引入的一批，它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO
类上即可。同时，为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解，需要在 XML 配置文件中启用 Bean
的自动扫描功能，这可以通过 &lt;context:component-scan/&gt; 实现。如下所示：</p>
<p>&nbsp;// 首先使用 @Repository 将 DAO 类声明为 Bean <br />
&nbsp;package bookstore.dao; <br />
&nbsp;@Repository <br />
&nbsp;public class UserDaoImpl implements UserDao{ &#8230;&#8230; } </p>
<p>&nbsp;// 其次，在 XML 配置文件中启动 Spring 的自动扫描功能<br />
&nbsp;&lt;beans &#8230; &gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br />
&nbsp;&lt;context:component-scan base-package=&#8221;bookstore.dao&#8221; /&gt; <br />
&#8230;&#8230;<br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>如此，我们就不再需要在 XML 中显式使用 &lt;bean/&gt; 进行 Bean 的配置。Spring 在容器初始化时将自动扫描
base-package 指定的包及其子包下的所有 class 文件，所有标注了 @Repository 的类都将被注册为 Spring
Bean。</p>
<p>为什么 @Repository 只能标注在 DAO 类上呢？这是因为该注解的作用不只是将类识别为
Bean，同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring
本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构，用于封装不同的持久层框架抛出的异常，使得异常独立于底层的框架。</p>
<p>Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解：@Component、@Service、@Constroller，它们分别用于软件系统的不同层次：</p>
<p><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#67;&#111;&#109;&#112;&#111;&#110;&#101;&#110;&#116;">&#8226;@Component</a> 是一个泛化的概念，仅仅表示一个组件 (Bean) ，可以作用在任何层次。<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#83;&#101;&#114;&#118;&#105;&#99;&#101;">&#8226;@Service</a> 通常作用在业务层，但是目前该功能与 @Component 相同。<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#67;&#111;&#110;&#115;&#116;&#114;&#111;&#108;&#108;&#101;&#114;">&#8226;@Constroller</a> 通常作用在控制层，但是目前该功能与 @Component 相同。<br />
通
过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解，Spring 会自动创建相应的
BeanDefinition 对象，并注册到 ApplicationContext 中。这些类就成了 Spring
受管组件。这三个注解除了作用于不同软件层次的类，其使用方式与 @Repository 是完全相同的。</p>
<p>另外，除了上面的四个注解外，用户可以创建自定义的注解，然后在注解上标注 @Component，那么，该自定义注解便具有了与所 @Component 相同的功能。不过这个功能并不常用。</p>
<p>当一个 Bean 被自动检测到时，会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean
名称。默认情况下，对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller，会把
name 取值作为 Bean 的名字。如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件，默认 Bean
名称会是小写开头的非限定类名。如果你不想使用默认 bean 命名策略，可以提供一个自定义的命名策略。首先实现 BeanNameGenerator
接口，确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名，如下所示：</p>
<p>&nbsp;&lt;beans ...&gt; <br />
&nbsp;&lt;context:component-scan <br />
&nbsp;&nbsp;&nbsp; base-package="a.b" name-generator="a.SimpleNameGenerator"/&gt; <br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>与通过 XML 配置的 Spring Bean 一样，通过上述注解标识的
Bean，其默认作用域是"singleton"，为了配合这四个注解，在标注 Bean 的同时能够指定 Bean 的作用域，Spring 2.5
引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了，如下所示：</p>
<p>&nbsp;@Scope("prototype") <br />
&nbsp;@Repository <br />
&nbsp;public class Demo { &#8230; } <br />
&nbsp;</p>
<p>如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法，只需实现 ScopeMetadataResolver 接口，确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名：</p>
<p>&nbsp;&lt;context:component-scan base-package="a.b"<br />
&nbsp;scope-resolver="footmark.SimpleScopeResolver" /&gt; <br />
&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @PostConstruct 和 @PreDestroy 指定生命周期回调方法</p>
<p>Spring Bean 是受 Spring IoC 容器管理，由容器进行初始化和销毁的（prototype
类型由容器初始化之后便不受容器管理），通常我们不需要关注容器对 Bean 的初始化和销毁操作，由 Spring 经过构造函数或者工厂方法创建的
Bean
就是已经初始化完成并立即可用的。然而在某些情况下，可能需要我们手工做一些额外的初始化或者销毁操作，这通常是针对一些资源的获取和释放操作。
Spring 1.x 为此提供了两种方式供用户指定执行生命周期回调的方法。</p>
<p>第一种方式是实现 Spring 提供的两个接口：InitializingBean 和 DisposableBean。如果希望在 Bean
初始化完成之后执行一些自定义操作，则可以让 Bean 实现 InitializingBean 接口，该接口包含一个
afterPropertiesSet() 方法，容器在为该 Bean 设置了属性之后，将自动调用该方法；如果 Bean 实现了
DisposableBean 接口，则容器在销毁该 Bean 之前，将调用该接口的 destroy() 方法。这种方式的缺点是，让 Bean
类实现 Spring 提供的接口，增加了代码与 Spring 框架的耦合度，因此不推荐使用。</p>
<p>第二种方式是在 XML 文件中使用 &lt;bean&gt; 的 init-method 和 destroy-method
属性指定初始化之后和销毁之前的回调方法，代码无需实现任何接口。这两个属性的取值是相应 Bean
类中的初始化和销毁方法，方法名任意，但是方法不能有参数。示例如下：</p>
<p>&nbsp;&lt;bean id=&#8221;userService&#8221; <br />
&nbsp;class=&#8221;bookstore.service.UserService&#8221; <br />
&nbsp;init-method=&#8221;init&#8221; destroy-method=&#8221;destroy&#8221;&gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>Spring 2.5 在保留以上两种方式的基础上，提供了对 JSR-250 的支持。JSR-250
规范定义了两个用于指定声明周期方法的注解：@PostConstruct 和
@PreDestroy。这两个注解使用非常简单，只需分别将他们标注于初始化之后执行的回调方法或者销毁之前执行的回调方法上。由于使用了注解，因此需
要配置相应的 Bean 后处理器，亦即在 XML 中增加如下一行：</p>
<p>&nbsp;&lt;context:annotation-config /&gt; <br />
&nbsp;</p>
<p>比较上述三种指定生命周期回调方法的方式，第一种是不建议使用的，不但其用法不如后两种方式灵活，而且无形中增加了代码与框架的耦合度。后面两种方式开发者可以根据使用习惯选择其中一种，但是最好不要混合使用，以免增加维护的难度。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Required 进行 Bean 的依赖检查</p>
<p>依赖检查的作用是，判断给定 Bean 的相应 Setter 方法是否都在实例化的时候被调用了。而不是判断字段是否已经存在值了。Spring
进行依赖检查时，只会判断属性是否使用了 Setter 注入。如果某个属性没有使用 Setter
注入，即使是通过构造函数已经为该属性注入了值，Spring 仍然认为它没有执行注入，从而抛出异常。另外，Spring 只管是否通过 Setter
执行了注入，而对注入的值却没有任何要求，即使注入的 &lt;null/&gt;，Spring 也认为是执行了依赖注入。</p>
<p>&lt;bean&gt; 标签提供了 dependency-check 属性用于进行依赖检查。该属性的取值包括以下几种：</p>
<p>&#8226;none -- 默认不执行依赖检查。可以在 &lt;beans&gt; 标签上使用 default-dependency-check 属性改变默认值。<br />
&#8226;simple -- 对原始基本类型和集合类型进行检查。<br />
&#8226;objects -- 对复杂类型进行检查（除了 simple 所检查类型之外的其他类型）。<br />
&#8226;all -- 对所有类型进行检查。<br />
旧
版本使用 dependency-check 在配置文件中设置，缺点是粒度较粗。使用 Spring2.0 提供的 @Required
注解，提供了更细粒度的控制。@Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter
方法是否被调用了，而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。</p>
<p>为了让 Spring 能够处理该注解，需要激活相应的 Bean 后处理器。要激活该后处理器，只需在 XML 中增加如下一行即可。</p>
<p>&nbsp;&lt;context:annotation-config/&gt; <br />
&nbsp;</p>
<p>当某个被标注了 @Required 的 Setter 方法没有被调用，则 Spring 在解析的时候会抛出异常，以提醒开发者对相应属性进行设置。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Resource、@Autowired 和 @Qualifier 指定 Bean 的自动装配策略</p>
<p>自动装配是指，Spring 在装配 Bean 的时候，根据指定的自动装配规则，将某个 Bean 所需要引用类型的 Bean 注入进来。&lt;bean&gt; 元素提供了一个指定自动装配类型的 autowire 属性，该属性有如下选项：</p>
<p>&#8226;no -- 显式指定不使用自动装配。<br />
&#8226;byName -- 如果存在一个和当前属性名字一致的 Bean，则使用该 Bean 进行注入。如果名称匹配但是类型不匹配，则抛出异常。如果没有匹配的类型，则什么也不做。<br />
&#8226;byType
-- 如果存在一个和当前属性类型一致的 Bean ( 相同类型或者子类型 )，则使用该 Bean 进行注入。byType
能够识别工厂方法，即能够识别 factory-method 的返回类型。如果存在多个类型一致的
Bean，则抛出异常。如果没有匹配的类型，则什么也不做。<br />
&#8226;constructor -- 与 byType 类似，只不过它是针对构造函数注入而言的。如果当前没有与构造函数的参数类型匹配的 Bean，则抛出异常。使用该种装配模式时，优先匹配参数最多的构造函数。<br />
&#8226;autodetect -- 根据 Bean 的自省机制决定采用 byType 还是 constructor 进行自动装配。如果 Bean 提供了默认的构造函数，则采用 byType；否则采用 constructor 进行自动装配。<br />
当
使用 byType 或者 constructor 类型的自动装配的时候，自动装配也支持引用类型的数组或者使用了泛型的集合，这样，Spring
就会检查容器中所有类型匹配的 Bean，组成集合或者数组后执行注入。对于使用了泛型的 Map 类型，如果键是 String 类型，则
Spring 也会自动执行装配，将所有类型匹配的 Bean 作为值，Bean 的名字作为键。</p>
<p>我们可以给 &lt;beans&gt; 增加 default-autowire
属性，设置默认的自动封装策略。默认值为"no"。如果使用自动装配的同时，也指定了 property 或者 constructor-arg
标签，则显式指定的值将覆盖自动装配的值。目前的自动封装不支持简单类型，比如基本类型、String、Class，以及它们的数组类型。</p>
<p>在按类型匹配的时候 ( 可能是 byType、constructor、autodetect)，同一个类型可能存在多个 Bean，如果被注入的属性是数组、集合或者 Map，这可能没有问题，但是如果只是简单的引用类型，则会抛出异常。解决方法有如下几种：</p>
<p>&#8226;取消该 Bean 的自动装配特性，使用显式的注入。我们可能不希望某个 Bean 被当作其他 Bean
执行自动封装时的候选对象，我们可以给该 &lt;bean&gt; 增加
autowire-candidate="false"。(autowire-candidate 属性和 autowire
属性相互独立，互不相干。某个 Bean 可以将 autowire-candidate 设置为 false，同时使用 autowire 特性。)
另外，我们可以设置 &lt;beans&gt; 的 default-autowire-candidates
属性，可以在该属性中指定可以用于自动装配候选 Bean 的匹配模式，比如
default-autowire-candidates="*serv,*dao"，这表示所有名字以 serv 或者 dao 结尾的 Bean
被列为候选，其他则忽略，相当于其他 Bean 都指定为 autowire-candidate="false"，此时可以显式为
&lt;bean&gt; 指定 autowire-candidate="true"。在 &lt;bean&gt; 上指定的设置要覆盖
&lt;beans&gt; 上指定的设置。<br />
&#8226;如果在多个类型相同的 Bean 中有首选的 Bean，那么可以将该 &lt;bean&gt;
的 primary 属性设置为 "true" ，这样自动装配时便优先使用该 Bean 进行装配。此时不能将
autowire-candidate 设为 false。<br />
&#8226;如果使用的是 Java 5 以上版本，可以使用注解进行更细粒度的控制。<br />
使用 @Autowired 和 @Qualifier 注解执行自动装配</p>
<p>使用 @Autowired 注解进行装配，只能是根据类型进行匹配。@Autowired 注解可以用于 Setter
方法、构造函数、字段，甚至普通方法，前提是方法必须有至少一个参数。@Autowired 可以用于数组和使用泛型的集合类型。然后 Spring
会将容器中所有类型符合的 Bean 注入进来。@Autowired 标注作用于 Map 类型时，如果 Map 的 key 为 String
类型，则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来，用 Bean 的 id 或 name
作为 Map 的 key。</p>
<p>@Autowired 标注作用于普通方法时，会产生一个副作用，就是在容器初始化该 Bean 实例的时候就会调用该方法。当然，前提是执行了自动装配，对于不满足装配条件的情况，该方法也不会被执行。</p>
<p>当标注了 @Autowired 后，自动注入不能满足，则会抛出异常。我们可以给 @Autowired 标注增加一个
required=false 属性，以改变这个行为。另外，每一个类中只能有一个构造函数的 @Autowired.required() 属性为
true。否则就出问题了。如果用 @Autowired 同时标注了多个构造函数，那么，Spring 将采用贪心算法匹配构造函数 ( 构造函数最长
)。</p>
<p>@Autowired 还有一个作用就是，如果将其标注在 BeanFactory 类型、ApplicationContext
类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上，那么
Spring 会自动注入这些实现类的实例，不需要额外的操作。</p>
<p>当容器中存在多个 Bean 的类型与需要注入的相同时，注入将不能执行，我们可以给 @Autowired 增加一个候选值，做法是在
@Autowired 后面增加一个 @Qualifier 标注，提供一个 String 类型的值作为候选的 Bean 的名字。举例如下：</p>
<p>&nbsp;@Autowired(required=false) <br />
&nbsp;@Qualifier("ppp") <br />
&nbsp;public void setPerson(person p){} <br />
&nbsp;</p>
<p>@Qualifier 甚至可以作用于方法的参数 ( 对于方法只有一个参数的情况，我们可以将 @Qualifer 标注放置在方法声明上面，但是推荐放置在参数前面 )，举例如下：</p>
<p>&nbsp;@Autowired(required=false) <br />
&nbsp;public void sayHello(@Qualifier("ppp")Person p,String name){} <br />
&nbsp;</p>
<p>我们可以在配置文件中指定某个 Bean 的 qualifier 名字，方法如下：</p>
<p>&nbsp;&lt;bean id="person" class="footmark.spring.Person"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;qualifier value="ppp"/&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>如果没有明确指定 Bean 的 qualifier 名字，那么默认名字就是 Bean 的名字。通常，qualifier 应该是有业务含义的，例如 "domain"，"persistent" 等，而不应该是类似 "person" 方式。</p>
<p>我们还可以将 @Qualifier 标注在集合类型上，那么所有 qualifier 名字与指定值相同的 Bean 都将被注入进来。</p>
<p>最后，配置文件中需要指定每一个自定义注解的属性值。我们可以使用 &lt;meta&gt; 标签来代替 &lt;qualifier/&gt;
标签，如果 &lt;meta&gt; 标签和 &lt;qualifier/&gt; 标签同时出现，那么优先使用
&lt;qualifier&gt; 标签。如果没有 &lt;qualifier&gt; 标签，那么会用 &lt;meta&gt;
提供的键值对来封装 &lt;qualifier&gt; 标签。示例如下：</p>
<p>&nbsp;&lt;bean class="footmark.HelloWorld"&gt; <br />
&nbsp;&lt;qualifier type="MovieQualifier"&gt; <br />
&nbsp;&lt;attribute key="format" value="VHS"/&gt; <br />
&nbsp;&lt;attribute key="genre" value="Comedy"/&gt; <br />
&nbsp;&lt;/qualifier&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;&lt;bean class="footmark.HelloWorld"&gt; <br />
&nbsp;&lt;meta key="format" value="DVD"/&gt; <br />
&nbsp;&lt;meta key="genre" value="Action"/&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>@Autowired 注解对应的后处理注册与前面相似，只需在配置文件中增加如下一行即可：</p>
<p>&nbsp;&lt;context:annotation-config/&gt; <br />
&nbsp;</p>
<p>如果 @Autowired 注入的是 BeanFactory、ApplicationContext、ResourceLoader
等系统类型，那么则不需要 @Qualifier，此时即使提供了 @Qualifier 注解，也将会被忽略；而对于自定义类型的自动装配，如果使用了
@Qualifier 注解并且没有名字与之匹配的 Bean，则自动装配匹配失败。</p>
<p>使用 JSR-250 中的 @Resource 和 @Qualifier 注解</p>
<p>如果希望根据 name 执行自动装配，那么应该使用 JSR-250 提供的 @Resource 注解，而不应该使用 @Autowired 与 @Qualifier 的组合。</p>
<p>@Resource 使用 byName 的方式执行自动封装。@Resource 标注可以作用于带一个参数的 Setter
方法、字段，以及带一个参数的普通方法上。@Resource 注解有一个 name 属性，用于指定 Bean 在配置文件中对应的名字。如果没有指定
name 属性，那么默认值就是字段或者属性的名字。@Resource 和 @Qualifier 的配合虽然仍然成立，但是 @Qualifier
对于 @Resource 而言，几乎与 name 属性等效。</p>
<p>如果 @Resource 没有指定 name 属性，那么使用 byName 匹配失败后，会退而使用 byType
继续匹配，如果再失败，则抛出异常。在没有为 @Resource 注解显式指定 name 属性的前提下，如果将其标注在 BeanFactory
类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher
类型、MessageSource 类型上，那么 Spring 会自动注入这些实现类的实例，不需要额外的操作。此时 name 属性不需要指定 (
或者指定为"")，否则注入失败；如果使用了 @Qualifier，则该注解将被忽略。而对于用户自定义类型的注入，@Qualifier 和
name 等价，并且不被忽略。</p>
<p>&lt;bean&gt; 的 primary 和 autowire-candidate 属性对 @Resource、@Autowired 仍然有效。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Configuration 和 @Bean 进行 Bean 的声明</p>
<p>虽然 2.0 版本发布以来，Spring 陆续提供了十多个注解，但是提供的这些注解只是为了在某些情况下简化 XML 的配置，并非要取代
XML 配置方式。这一点可以从 Spring IoC 容器的初始化类可以看出：ApplicationContext 接口的最常用的实现类是
ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext，以及面向
Portlet 的 XmlPortletApplicationContext 和面向 web 的
XmlWebApplicationContext，它们都是面向 XML 的。Spring 3.0
新增了另外两个实现类：AnnotationConfigApplicationContext 和
AnnotationConfigWebApplicationContext。从名字便可以看出，它们是为注解而生，直接依赖于注解作为容器配置信息来
源的 IoC 容器初始化类。由于 AnnotationConfigWebApplicationContext 是
AnnotationConfigApplicationContext 的 web 版本，其用法与后者相比几乎没有什么差别，因此本文将以
AnnotationConfigApplicationContext 为例进行讲解。</p>
<p>AnnotationConfigApplicationContext 搭配上 @Configuration 和 @Bean
注解，自此，XML 配置方式不再是 Spring IoC
容器的唯一配置方式。两者在一定范围内存在着竞争的关系，但是它们在大多数情况下还是相互协作的关系，两者的结合使得 Spring IoC
容器的配置更简单，更强大。</p>
<p>之前，我们将配置信息集中写在 XML 中，如今使用注解，配置信息的载体由 XML 文件转移到了 Java
类中。我们通常将用于存放配置信息的类的类名以 &#8220;Config&#8221; 结尾，比如
AppDaoConfig.java、AppServiceConfig.java 等等。我们需要在用于指定配置信息的类上加上
@Configuration 注解，以明确指出该类是 Bean 配置的信息源。并且 Spring 对标注 Configuration
的类有如下要求：</p>
<p>&#8226;配置类不能是 final 的；<br />
&#8226;配置类不能是本地化的，亦即不能将配置类定义在其他类的方法内部；<br />
&#8226;配置类必须有一个无参构造函数。<br />
AnnotationConfigApplicationContext
将配置类中标注了 @Bean 的方法的返回值识别为 Spring Bean，并注册到容器中，受 IoC 容器管理。@Bean 的作用等价于
XML 配置中的 &lt;bean/&gt; 标签。示例如下：</p>
<p>&nbsp;@Configuration <br />
&nbsp;public class BookStoreDaoConfig{ <br />
&nbsp;&nbsp;&nbsp; @Bean <br />
&nbsp;&nbsp;&nbsp; public UserDao userDao(){ return new UserDaoImpl();} <br />
&nbsp;&nbsp;&nbsp; @Bean <br />
&nbsp;&nbsp;&nbsp; public BookDao bookDao(){return new BookDaoImpl();} <br />
&nbsp;} <br />
&nbsp;</p>
<p>Spring 在解析到以上文件时，将识别出标注 @Bean 的所有方法，执行之，并将方法的返回值 ( 这里是 UserDaoImpl 和
BookDaoImpl 对象 ) 注册到 IoC 容器中。默认情况下，Bean 的名字即为方法名。因此，与以上配置等价的 XML 配置如下：</p>
<p>&nbsp;&lt;bean id=&#8221;userDao&#8221; class=&#8221;bookstore.dao.UserDaoImpl&#8221;/&gt; <br />
&nbsp;&lt;bean id=&#8221;bookDao&#8221; class=&#8221;bookstore.dao.BookDaoImpl&#8221;/&gt; <br />
&nbsp;</p>
<p>@Bean 具有以下四个属性：</p>
<p>&#8226;name -- 指定一个或者多个 Bean 的名字。这等价于 XML 配置中 &lt;bean&gt; 的 name 属性。<br />
&#8226;initMethod -- 容器在初始化完 Bean 之后，会调用该属性指定的方法。这等价于 XML 配置中 &lt;bean&gt; 的 init-method 属性。<br />
&#8226;destroyMethod -- 该属性与 initMethod 功能相似，在容器销毁 Bean 之前，会调用该属性指定的方法。这等价于 XML 配置中 &lt;bean&gt; 的 destroy-method 属性。<br />
&#8226;autowire
-- 指定 Bean 属性的自动装配策略，取值是 Autowire
类型的三个静态属性。Autowire.BY_NAME，Autowire.BY_TYPE，Autowire.NO。与 XML 配置中的
autowire 属性的取值相比，这里少了 constructor，这是因为 constructor 在这里已经没有意义了。<br />
@Bean 没有直接提供指定作用域的属性，可以通过 @Scope 来实现该功能，关于 @Scope 的用法已在上文列举。</p>
<p>下面讲解基于注解的容器初始化。AnnotationConfigApplicationContext 提供了三个构造函数用于初始化容器。</p>
<p>&#8226;AnnotationConfigApplicationContext()：该构造函数初始化一个空容器，容器不包含任何 Bean 信息，需要在稍后通过调用其 register() 方法注册配置类，并调用 refresh() 方法刷新容器。<br />
&#8226;AnnotationConfigApplicationContext(Class&lt;?&gt;... annotatedClasses)：这是最常用的构造函数，通过将涉及到的配置类传递给该构造函数，以实现将相应配置类中的 Bean 自动注册到容器中。<br />
&#8226;AnnotationConfigApplicationContext(String...
basePackages)：该构造函数会自动扫描以给定的包及其子包下的所有类，并自动识别所有的 Spring
Bean，将其注册到容器中。它不但识别标注 @Configuration 的配置类并正确解析，而且同样能识别使用
@Repository、@Service、@Controller、@Component 标注的类。<br />
除了使用上面第三种类型的构造函数让容器
自动扫描 Bean 的配置信息以外，AnnotationConfigApplicationContext 还提供了 scan()
方法，其功能与上面也类似，该方法主要用在容器初始化之后动态增加 Bean 至容器中。调用了该方法以后，通常需要立即手动调用 refresh()
刷新容器，以让变更立即生效。</p>
<p>需要注意的是，AnnotationConfigApplicationContext 在解析配置类时，会将配置类自身注册为一个
Bean，因为 @Configuration 注解本身定义时被 @Component 标注了。因此可以说，一个 @Configuration
同时也是一个 @Component。大多数情况下，开发者用不到该 Bean，并且在理想情况下，该 Bean
应该是对开发者透明的。@Configuration 的定义如下所示：</p>
<p>&nbsp;@Target({ElementType.TYPE}) <br />
&nbsp;@Retention(RetentionPolicy.RUNTIME) <br />
&nbsp;@Documented <br />
&nbsp;@Component <br />
&nbsp;public @interface Configuration { <br />
&nbsp;String value() default ""; <br />
&nbsp;} <br />
&nbsp;</p>
<p>在一般的项目中，为了结构清晰，通常会根据软件的模块或者结构定义多个 XML 配置文件，然后再定义一个入口的配置文件，该文件使用
&lt;import/&gt; 将其他的配置文件组织起来。最后只需将该文件传给 ClassPathXmlApplicationContext
的构造函数即可。针对基于注解的配置，Spring 也提供了类似的功能，只需定义一个入口配置类，并在该类上使用 @Import
注解引入其他的配置类即可，最后只需要将该入口类传递给 AnnotationConfigApplicationContext。具体示例如下：</p>
<p>&nbsp;@Configuration <br />
&nbsp;@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class}) <br />
&nbsp;public class BookStoreConfig{ &#8230; } <br />
&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>混合使用 XML 与注解进行 Bean 的配置</p>
<p>设计 @Configuration 和 @Bean 的初衷，并不是为了完全取代 XML，而是为了在 XML 之外多一种可行的选择。由于
Spring 自发布以来，Spring 开发小组便不断简化 XML 配置，使得 XML 配置方式已经非常成熟，加上 Spring 2.0
以后出现了一系列命名空间的支持，使得 XML 配置方式成为了使用简单、功能强大的 Bean 定义方式。而且，XML
配置的一些高级功能目前还没有相关注解能够直接支持。因此，在目前的多数项目中，要么使用纯粹的 XML 配置方式进行 Bean
的配置，要么使用以注解为主，XML 为辅的配置方式进行 Bean 的配置。</p>
<p>之所以会出现两者共存的情况，主要归结为三个原因：其一，目前绝大多数采用 Spring 进行开发的项目，几乎都是基于 XML
配置方式的，Spring 在引入注解的同时，必须保证注解能够与 XML 和谐共存，这是前提；其二，由于注解引入较晚，因此功能也没有发展多年的
XML 强大，因此，对于复杂的配置，注解还很难独当一面，在一段时间内仍然需要 XML 的配合才能解决问题。除此之外，Spring 的 Bean
的配置方式与 Spring 核心模块之间是解耦的，因此，改变配置方式对 Spring 的框架自身是透明的。Spring 可以通过使用 Bean
后处理器 (BeanPostProcessor) 非常方便的增加对于注解的支持。这在技术实现上非常容易的事情。</p>
<p>要使用混合配置方式，首先需要判断以哪一种配置方式为主。对这个问题的不同回答将会直接影响到实现的方式。然而大可不必为此伤脑筋，因为不论是以
XML 为主，还是以注解为主，配置方式都是简单而且容易理解的。这里不存在错误的决定，因为仅仅是表现方式不一样。我们首先假设以 XML
配置为主的情况。</p>
<p>对于已经存在的大型项目，可能初期是以 XML 进行 Bean 配置的，后续逐渐加入了注解的支持，这时我们只需在 XML 配置文件中将被
@Configuration 标注的类定义为普通的 &lt;bean&gt;，同时注册处理注解的 Bean 后处理器即可。示例如下：</p>
<p>&nbsp;// 假设存在如下的 @Configuration 类：<br />
&nbsp;package bookstore.config; <br />
&nbsp;import bookstore.dao.*; <br />
&nbsp;@Configuration <br />
&nbsp;public class MyConfig{ <br />
&nbsp;@Bean <br />
&nbsp;&nbsp;&nbsp; public UserDao userDao(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new UserDaoImpl(); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;} <br />
此时，只需在 XML 中作如下声明即可：<br />
&nbsp;&lt;beans &#8230; &gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp; &lt;context:annotation-config /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;bean class=&#8221;demo.config.MyConfig&#8221;/&gt; <br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>由于启用了针对注解的 Bean 后处理器，因此在 ApplicationContext 解析到 MyConfig 类时，会发现该类标注了
@Configuration 注解，随后便会处理该类中标注 @Bean 的方法，将这些方法的返回值注册为容器总的 Bean。</p>
<p>对于以上的方式，如果存在多个标注了 @Configuration 的类，则需要在 XML 文件中逐一列出。另一种方式是使用前面提到的自动扫描功能，配置如下：</p>
<p>&nbsp;&lt;context:component-scan base-package=&#8221;bookstore.config&#8221; /&gt; <br />
&nbsp;</p>
<p>如此，Spring 将扫描所有 demo.config 包及其子包中的类，识别所有标记了
@Component、@Controller、@Service、@Repository 注解的类，由于 @Configuration
注解本身也用 @Component 标注了，Spring 将能够识别出 @Configuration 标注类并正确解析之。</p>
<p>对于以注解为中心的配置方式，只需使用 @ImportResource 注解引入存在的 XML 即可，如下所示：</p>
&nbsp;@Configuration <br />
&nbsp;@ImportResource(&#8220;classpath:/bookstore/config/spring-beans.xml&#8221;) <br />
&nbsp;public class MyConfig{ <br />
&#8230;&#8230;<br />
&nbsp;} <br />
&nbsp;// 容器的初始化过程和纯粹的以配置为中心的方式一致：<br />
&nbsp;AnnotationConfigApplicationContext ctx = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new AnnotationConfigApplicationContext(MyConfig.class); <br />
&#8230;&#8230;
<img src ="http://www.blogjava.net/ashutc/aggbug/348270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-14 10:01 <a href="http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sphinx</title><link>http://www.blogjava.net/ashutc/archive/2011/04/01/347467.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 01 Apr 2011 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/01/347467.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/347467.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/01/347467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/347467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/347467.html</trackback:ping><description><![CDATA[<strong></strong> 首先我们要从 Sphinx 官网上 http://www.sphinxsearch.com/downloads.html 下载
mysql-5.0.45-sphinxse-0.9.8-win32.zip 和
sphinx-0.9.8.1-win32.zip，假设你已经安装好了 MySQL
<br />
<br />
先将 mysql 服务停掉 解压 mysql-5.0.45-sphinxse-0.9.8-win32.zip 将 bin 和 share
覆盖掉 mysql 目录中的 bin 和 share 解压 sphinx-0.9.8.1-win32.zip
到独立的目录，如:d:/www/sphinx/中
<br />
<br />
接着开启 mysql 服务，建立 "test" 数据库，并导入 sql 语句,如下：
<br />
<br />
-----------------------------------------------------------
<br />
<br />
CREATE TABLE `documents` (
<br />
`id` int(11) NOT NULL auto_increment,
<br />
`group_id` int(11) NOT NULL,
<br />
`group_id2` int(11) NOT NULL,
<br />
`date_added` datetime NOT NULL,
<br />
`title` varchar(255) NOT NULL,
<br />
`content` text NOT NULL,
<br />
PRIMARY KEY (`id`)
<br />
) ENGINE=InnoDB AUTO_INCREMENT=5;
<br />
<br />
INSERT INTO `documents` VALUES ('1', '1', '5', '2008-09-13
21:37:47', 'test one', 'this is my test document number one. also
checking search within phrases.');
<br />
INSERT INTO `documents` VALUES ('2', '1', '6', '2008-09-13 21:37:47', 'test two', 'this is my test document number two');
<br />
INSERT INTO `documents` VALUES ('3', '2', '7', '2008-09-13 21:37:47', 'another doc', 'this is another group');
<br />
INSERT INTO `documents` VALUES ('4', '2', '8', '2008-09-13 21:37:47', 'doc number four', 'this is to test groups');
<br />
<br />
-------------------------------------------实际上，这个新建立的表就是 Sphinx 中的 example.sql
<br />
<br />
我们的测试表已经建立完成，接下来我们要配置 sphinx-doc.conf 文件（重要）
<br />
<br />
先将 sphinx 下的 sphinx-min.conf 复制一份改名为 sphinx-doc.conf，接着 修改它:
<br />
<br />
----------------------------------------------------------------------
<br />
<br />
#
<br />
# Minimal Sphinx configuration sample (clean, simple, functional)
<br />
#
<br />
# type----------------------------------------数据库类型，目前支持 mysql 与 pgsql
<br />
# strip_html--------------------------------是否去掉html 标签
<br />
# sql_host----------------------------------数据库主机地址
<br />
# sql_user----------------------------------数据库用户名
<br />
# sql_pass----------------------------------数据库密码
<br />
# sql_db-------------------------------------数据库名称
<br />
# sql_port-----------------------------------数据库采用的端口
<br />
# sql_query_pre--------------------------执行sql前要设置的字符集，用utf8必须SET NAMES utf8
<br />
#
sql_query---------------------------------全文检索要显示的内容，在这里尽可能不使用where或
group by，将 where 与 groupby 的内容交给 sphinx，由 sphinx 进行条件过滤与 groupby 效率会更高
<br />
# 注意: select 出来的字段必须至少包括一个唯一主键 (ARTICLESID) 以及要全文检索的字段，你计划原本在 where 中要用到的字段也要 select 出来
<br />
# 这里不用使用orderby
<br />
# sql_attr_ 开头的表示一些属性字段，你原计划要用在 where, orderby, groupby 中的字段要在这里定义(# 为自己添加的注释内容)
<br />
<br />
#source 数据源名:
<br />
<br />
source documents
<br />
{
<br />
type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = mysql
<br />
sql_host&nbsp;&nbsp;&nbsp;&nbsp; = localhost
<br />
sql_user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = root
<br />
sql_pass&nbsp;&nbsp;&nbsp;&nbsp; = yourpassword
<br />
sql_db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = test
<br />
sql_port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 3306 # optional, default is 3306
<br />
<br />
sql_query_pre&nbsp;&nbsp;&nbsp;&nbsp; = SET NAMES utf8
<br />
sql_query&nbsp;&nbsp;&nbsp;&nbsp; = \
<br />
&nbsp;&nbsp; SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
<br />
&nbsp;&nbsp; FROM documents
<br />
<br />
sql_attr_uint&nbsp;&nbsp;&nbsp; = group_id
<br />
sql_attr_timestamp&nbsp;&nbsp; = date_added
<br />
<br />
sql_query_info&nbsp;&nbsp;&nbsp; = SELECT * FROM documents WHERE id=$id
<br />
}
<br />
<br />
<br />
index documents
<br />
{
<br />
source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = documents
<br />
<br />
#path&nbsp;&nbsp; 索引记录存放目录，如 d:/sphinx/data/cgfinal ,实际存放时会存放在 d:/sphinx/data 目录，然后创建多个 cgfinal 名称，不同扩展名的索引文件。
<br />
path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = d:/www/sphinx/data/doc
<br />
docinfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = extern
<br />
enable_star&nbsp;&nbsp;&nbsp;&nbsp; = 1
<br />
<br />
min_word_len&nbsp;&nbsp;&nbsp;&nbsp; = 3
<br />
min_prefix_len&nbsp;&nbsp;&nbsp;&nbsp; = 0
<br />
min_infix_len&nbsp;&nbsp;&nbsp;&nbsp; = 3
<br />
charset_type&nbsp;&nbsp;&nbsp; = sbcs
<br />
<br />
# 其他的配置如 min_word_len, charset_type, charset_table, ngrams_chars, ngram_len 这些则是支持中文检索需要设置的内容。
<br />
# 如果检索的不是中文，则 charset_table, ngrams_chars, min_word_len 就要设置不同的内容，具体官方网站的论坛中有很多，大家可以去搜索看看。
<br />
}
<br />
<br />
# mem_limit 索引使用内存最大限制，根据机器情况而定，默认是32M，太小的会影响索引的性能。
<br />
indexer
<br />
{
<br />
mem_limit&nbsp;&nbsp;&nbsp;&nbsp; = 32M
<br />
}
<br />
<br />
# 搜索的守护进程配置
<br />
# 在进行全文检索过程中，searchd要先开启，mysql在全文检索时才能连接到sphinx，由sphinx进行全文检索，再将结果返回给mysql
<br />
# address 侦听请求的地址，不设置则侦听所有地址
<br />
# port 侦听端口
<br />
searchd
<br />
{
<br />
port&nbsp;&nbsp;&nbsp;&nbsp; = 3312
<br />
log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =d:/www/sphinx/logs/searched_doc.log
<br />
query_log&nbsp;&nbsp;&nbsp;&nbsp; = d:/www/sphinx/logs/query_doc.log
<br />
read_timeout&nbsp;&nbsp;&nbsp; = 5
<br />
max_children&nbsp;&nbsp;&nbsp; = 30
<br />
pid_file&nbsp;&nbsp;&nbsp;&nbsp; = d:/www/sphinx/logs/searched-doc.pid
<br />
max_matches&nbsp;&nbsp;&nbsp;&nbsp; = 1000
<br />
seamless_rotate&nbsp;&nbsp;&nbsp; = 0
<br />
preopen_indexes&nbsp;&nbsp;&nbsp; = 0
<br />
unlink_old&nbsp;&nbsp;&nbsp;&nbsp; = 1
<br />
}
<br />
<br />
<br />
----------------------------------------------------------------------
<br />
<br />
<br />
为了测试，我们的 Sphinx 配置文件已经写好，确保我们的 Mysql 数据库已经启动，如果没有启动则在 cmd 中键入" net start mysql "
<br />
<br />
接下来，我们的测试正式开始：
<br />
<br />
1，生成数据索引或重建索引：
<br />
<br />
（最好再复制一个 sphinx-doc.conf 配置文件，并把它放入 bin 文件夹中，下面的举例 假设我们已经这样做）：
<br />
<br />
在 cmd 模式下：输入：
<br />
<br />
d:/www/sphinx/bin/indexer.exe --config d:/www/sphinx/bin/sphinx-doc.conf documents
<br />
<br />
2，运行检索守护进程 searchd.exe：
<br />
<br />
d:/www/sphinx/bin/searchd.exe --config d:/www/sphinx/bin/sphinx-doc.conf
<br />
<br />
如过这两步没有报错的话，说明我们的 Sphinx 已经正常运行了！可以通过 netstat -an 查看是否 3312 端口是否处如监听状态。
<br />
<br />
3，现在来用 sphinx 自带的工具 search.exe 来测试一下：
<br />
<br />
测试：
<br />
<br />
索引关键字： this is m
<br />
<br />
D:\www\sphinx\bin&gt;search.exe -c d:/www/sphinx/bin/sphinx-doc.conf this is m
<br />
<br />
结果：
<br />
<br />
Sphinx 0.9.8-release (r1371)
<br />
Copyright (c) 2001-2008, Andrew Aksyonoff
<br />
<br />
using config file 'd:/www/sphinx/bin/sphinx-doc.conf'...
<br />
WARNING: index 'documents': invalid morphology option 'extern' - IGNORED
<br />
index 'documents': query 'this is m ': returned 4 matches of 4 total in 0.000 s
<br />
c
<br />
<br />
displaying matches:
<br />
1. document=1, weight=1, group_id=1, date_added=Sat Sep 13 21:37:47 2008
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=1
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id=1
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id2=5
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_added=2008-09-13 21:37:47
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title=test one
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content=this is my test document number one. also checking search withi
<br />
phrases.
<br />
2. document=2, weight=1, group_id=1, date_added=Sat Sep 13 21:37:47 2008
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=2
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id=1
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id2=6
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_added=2008-09-13 21:37:47
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title=test two
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content=this is my test document number two
<br />
3. document=3, weight=1, group_id=2, date_added=Sat Sep 13 21:37:47 2008
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=3
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id=2
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id2=7
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_added=2008-09-13 21:37:47
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title=another doc
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content=this is another group
<br />
4. document=4, weight=1, group_id=2, date_added=Sat Sep 13 21:37:47 2008
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=4
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id=2
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id2=8
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_added=2008-09-13 21:37:47
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title=doc number four
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content=this is to test groups
<br />
<br />
words:
<br />
1. 'this': 4 documents, 4 hits
<br />
<br />
-------------------
<br />
<br />
索引关键字： this is another group
<br />
<br />
D:\www\sphinx\bin&gt;search.exe -c d:/www/sphinx/bin/sphinx-doc.conf this is another group
<br />
<br />
结果：
<br />
<br />
Sphinx 0.9.8-release (r1371)
<br />
Copyright (c) 2001-2008, Andrew Aksyonoff
<br />
<br />
-------------------
<br />
<br />
到此sphinx在win上算正常运行了，sphinx-doc.conf文件配置比较灵活，根据你需要索引的数据库进行灵活配置来达到你需要的效果
<br />
<br />
如果配置过程中出现运行参数配置问题可以查看 doc/sphinx.html文件，里面对各种参数都要详细的说明
<br />
<br />
<br />
using config file 'd:/www/sphinx/bin/sphinx-doc.conf'...
<br />
WARNING: index 'documents': invalid morphology option 'extern' - IGNORED
<br />
index 'documents': query 'this is another group ': returned 1 matches of 1 total
<br />
in 0.000 sec
<br />
<br />
displaying matches:
<br />
1. document=3, weight=4, group_id=2, date_added=Sat Sep 13 21:37:47 2008
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=3
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id=2
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group_id2=7
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date_added=2008-09-13 21:37:47
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title=another doc
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content=this is another group
<br />
<br />
words:
<br />
1. 'this': 4 documents, 4 hits
<br />
2. 'another': 1 documents, 2 hits
<br />
3. 'group': 1 documents, 1 hits
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/347467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-01 14:13 <a href="http://www.blogjava.net/ashutc/archive/2011/04/01/347467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jbpm的两个错误</title><link>http://www.blogjava.net/ashutc/archive/2011/03/24/346933.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 24 Mar 2011 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/03/24/346933.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/346933.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/03/24/346933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/346933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/346933.html</trackback:ping><description><![CDATA[<br />
<span style="color: darkblue;"><strong>1、问题：org.hibernate.exception.ConstraintViolationException: could not delete: [org.jbpm.pvm.internal.model.ExecutionImpl#1]</strong></span>
<br />
连接Mysql5时，jBPM4运行到 End结点时的错误，把 hibernate.dialect 改为 org.hibernate.dialect.MySQLInnoDBDialect
<br />
<br />
<br />
<strong>
<br />
<span style="color: darkblue;">2、问
题：org.hibernate.HibernateException: instance not of expected entity
type: org.jbpm.pvm.internal.type.variable.UnpersistableVariable is not
a: org.jbpm.pvm.internal.type.Variable
<br />
<br />
In case you still got the problem. I also had this error due to the
fact the Object I was adding as a variable was not Serializable.
<br />
<br />
Implementing java.io.Serializable should fix this error.</span></strong>
<br />
<br />
意思是压入上下文的对象要实现 Serializable接口
<br />
<br />
<br />
<span style="color: darkblue;"><strong>3、问题：Caused by: java.lang.ClassNotFoundException: de.odysseus.el.util.SimpleResolver</strong></span>
<br />
<br />
Requirements
<br />
<br />
JUEL requires Java 5 or later.
<br />
<br />
加入juel.jar
<br />
<br />
-------------------------
<br />
I think I get same problem when trying to integrate JBPM4 into my app. And I find out why.
<br />
Because you're using Tomcat 6.0... The lib el-api.jar in
%tomcat_home%/lib conflicts with juel.jar, which exists in
%jbpm4_home%/lib.
<br />
<br />
juel: &lt;http://juel.sourceforge.net/&gt; You will find the 2 jars define the same api for javax/el/ExressionFactory.
<br />
<br />
The solution is that you use Tomcat 5.5 instead of Tomcat 6.0. Because tomcat 5.5 uses commons-el.jar (Tomcat5.5/common/lib)
<br />
<br />
Or you can still use Tomcat 6.0, but you must replace el-api.jar
with juel.jar. And don't forget to remove juel.jar from your app lib(A
duplicate import, if you don't remove).
<br />
<br />
Try it!
<br />
<br />
---------------------------------------------------------
<br />
<strong>总结：删掉tomcat6的el.jar，加入juel.jar,juel-impl.jar,juel-engine.jar</strong>
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/346933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-03-24 11:46 <a href="http://www.blogjava.net/ashutc/archive/2011/03/24/346933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python模块学习 --- urllib</title><link>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 21 Mar 2011 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/346695.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/346695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/346695.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">urllib模块提供的上层接口，使我们可以像读取本地文件一样读取www和ftp上的数据。每当使用这个模块的时候，老是会想起公司产品的客户端，同事用C</span><span style="color: #000000;">++</span><span style="color: #000000;">下载Web上的图片，那种&#8220;痛苦&#8221;的表情。我以前翻译过libcurl教程，这是在C</span><span style="color: #000000;">/</span><span style="color: #000000;">C</span><span style="color: #000000;">++</span><span style="color: #000000;">环境下比较方便实用的网络操作库，相比起&nbsp;libcurl，Python的urllib模块的使用门槛则低多了。可能有些人又会用效率来批评Python，其实在操作网络，或者在集群交互的时候，&nbsp;语言的执行效率绝不是瓶颈。这种情况下，一个比较好的方法是，将python嵌入到C</span><span style="color: #000000;">/</span><span style="color: #000000;">C</span><span style="color: #000000;">++</span><span style="color: #000000;">中，让Python来完成一些不是核心的逻辑处理。又扯远了，废话少说，开始urllib之旅吧</span><span style="color: #000000;">~~</span><span style="color: #000000;">&nbsp;（前几天我用这个模块写了个蜘蛛，感兴趣的同学可以在以前的博客中找到代码）<br />
&nbsp;&nbsp;&nbsp;&nbsp;先看一个例子，这个例子把Google首页的html抓取下来并显示在控制台上：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;#&nbsp;别惊讶，整个程序确实只用了两行代码&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;urllib&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">).read()&nbsp;&nbsp;<br />
<br />
#&nbsp;别惊讶，整个程序确实只用了两行代码<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;urllib<br />
print&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">).read()<br />
<br />
urllib.urlopen(url[,&nbsp;data[,&nbsp;proxies]])&nbsp;:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;创建一个表示远程url的类文件对象，然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径，一般是网址；参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式：post与get。如果你不清楚，也不必太在意，一般情况下很少用到这个参数)；参数proxies用于设置代理（这里不详细讲怎么使用代理，感兴趣的看客可以去翻阅Python手册urllib模块）。urlopen返回&nbsp;一个类文件对象，他提供了如下方法：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read()&nbsp;,&nbsp;readline()&nbsp;,&nbsp;readlines()&nbsp;,&nbsp;fileno()&nbsp;,&nbsp;close()&nbsp;：这些方法的使用方式与文件对象完全一样;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info()：返回一个httplib.HTTPMessage&nbsp;对象，表示远程服务器返回的头信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getcode()：返回Http状态码。如果是http请求，200表示请求成功完成;404表示网址未找到；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;geturl()：返回请求的url；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面来扩充一下上面的例子，看官可以运行一下这个例子，加深对urllib的印象：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;google&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;header:\n</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.info()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;status:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.getcode()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">url:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.geturl()&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;line&nbsp;in&nbsp;google:&nbsp;#&nbsp;就像在操作本地文件&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;line,&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;google.close()&nbsp;&nbsp;<br />
<br />
google&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlopen(</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.google.com</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;header:\n</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.info()<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http&nbsp;status:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.getcode()<br />
print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">url:</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;google.geturl()<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;line&nbsp;in&nbsp;google:&nbsp;#&nbsp;就像在操作本地文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;line,<br />
google.close()<br />
<br />
urllib.urlretrieve(url[,&nbsp;filename[,&nbsp;reporthook[,&nbsp;data]]])：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径（如果未指定该参数，urllib会生成一个临时文件来保存数据）；参数reporthook是一个回调函数，当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函&nbsp;数来显示当前的下载进度，下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,&nbsp;headers)，filename表示保存到本地的路径，header表示服务器的响应头。下面通过例子来演示一下这个方法的使用，这个例子将新浪首页的html抓取到本地，保存在D:\sina.html文件中，同时显示下载的进度。<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;def&nbsp;cbk(a,&nbsp;b,&nbsp;c):&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''''</span><span style="color: #000000;">回调函数&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@a:&nbsp;已经下载的数据块&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@b:&nbsp;数据块的大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@c:&nbsp;远程文件的大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100.0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;c&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;per&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">%.2f%%</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;per&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;url&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.sina.com.cn</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">.&nbsp;local&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\\sina.html</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">.&nbsp;urllib.urlretrieve(url,&nbsp;local,&nbsp;cbk)&nbsp;&nbsp;<br />
<br />
def&nbsp;cbk(a,&nbsp;b,&nbsp;c):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''</span><span style="color: #000000;">回调函数</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@a:&nbsp;已经下载的数据块<br />
&nbsp;&nbsp;&nbsp;&nbsp;@b:&nbsp;数据块的大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;@c:&nbsp;远程文件的大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">'''<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100.0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;b&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;c<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;per&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">%.2f%%</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;per<br />
<br />
url&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">http://www.sina.com.cn</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
local&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\\sina.html</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
urllib.urlretrieve(url,&nbsp;local,&nbsp;cbk)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;上面介绍的两个方法是urllib中最常用的方法，这些方法在获取远程数据的时候，内部会使用URLopener或者&nbsp;FancyURLOpener类。作为urllib的使用者，我们很少会用到这两个类，这里我不想多讲。如果对urllib的实现感兴趣，&nbsp;或者希望urllib支持更多的协议，可以研究这两个类。在Python手册中，urllib的作者还列出了这个模块的缺陷和不足，感兴趣的同学可以打开&nbsp;Python手册了解一下。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;urllib中还提供了一些辅助方法，用于对url进行编码、解码。url中是不能出现一些特殊的符号的，有些符号有特殊的用途。我们知道以get方式提交数据的时候，会在url中添加key</span><span style="color: #000000;">=</span><span style="color: #000000;">value这样的字符串，所以在value中是不允许有</span><span style="color: #000000;">'</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">，因此要对其进行编码；与此同时服务器接收到这些参数的时候，要进行解码，还原成原始的数据。这个时候，这些辅助方法会很有用：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.quote(string[,&nbsp;safe])：对字符串进行编码。参数safe指定了不需要编码的字符;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.unquote(string)&nbsp;：对字符串进行解码；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.quote_plus(string&nbsp;[&nbsp;,&nbsp;safe&nbsp;]&nbsp;)&nbsp;：与urllib.quote类似，但这个方法用</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">来替换</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">，而quote用</span><span style="color: #000000;">'</span><span style="color: #000000;">%20</span><span style="color: #000000;">'</span><span style="color: #000000;">来代替</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.unquote_plus(string&nbsp;)&nbsp;：对字符串进行解码；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.urlencode(query[,&nbsp;doseq])：将dict或者包含两个元素的元组列表转换成url参数。例如&nbsp;字典{</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">}将被转换为</span><span style="color: #000000;">"</span><span style="color: #000000;">name=dark-bull&amp;age=200</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.pathname2url(path)：将本地路径转换成url路径；<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;urllib.url2pathname(path)：将url路径转换成本地路径；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;用一个例子来体验一下这些方法吧</span><span style="color: #000000;">~~</span><span style="color: #000000;">：<br />
view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name&nbsp;=&nbsp;~a+3</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote(data)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;print&nbsp;data1&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">3D</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.unquote(data1)&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;data2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote_plus(data)&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;print&nbsp;data2&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">+%</span><span style="color: #000000;">3D</span><span style="color: #000000;">+%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.unquote_plus(data2)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;data3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlencode({&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">&nbsp;})&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;print&nbsp;data3&nbsp;#&nbsp;result:&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">200</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">dark</span><span style="color: #000000;">-</span><span style="color: #000000;">bull&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">.&nbsp;data4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.pathname2url(r</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\a\b\c\23.php</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">.&nbsp;print&nbsp;data4&nbsp;#&nbsp;result:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">/D|/a/b/c/23.php&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">16</span><span style="color: #000000;">.&nbsp;print&nbsp;urllib.url2pathname(data4)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;D:\a\b\c\</span><span style="color: #000000;">23</span><span style="color: #000000;">.php&nbsp;&nbsp;<br />
<br />
data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name&nbsp;=&nbsp;~a+3</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
<br />
data1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote(data)<br />
print&nbsp;data1&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">3D</span><span style="color: #000000;">%</span><span style="color: #000000;">20</span><span style="color: #000000;">%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3<br />
print&nbsp;urllib.unquote(data1)&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
<br />
data2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.quote_plus(data)<br />
print&nbsp;data2&nbsp;#&nbsp;result:&nbsp;name</span><span style="color: #000000;">+%</span><span style="color: #000000;">3D</span><span style="color: #000000;">+%</span><span style="color: #000000;">7Ea</span><span style="color: #000000;">%</span><span style="color: #000000;">2B3<br />
print&nbsp;urllib.unquote_plus(data2)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">~</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
<br />
data3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.urlencode({&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">dark-bull</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">&nbsp;})<br />
print&nbsp;data3&nbsp;#&nbsp;result:&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">200</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">name</span><span style="color: #000000;">=</span><span style="color: #000000;">dark</span><span style="color: #000000;">-</span><span style="color: #000000;">bull<br />
<br />
data4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;urllib.pathname2url(r</span><span style="color: #000000;">'</span><span style="color: #000000;">d:\a\b\c\23.php</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
print&nbsp;data4&nbsp;#&nbsp;result:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">/D|/a/b/c/23.php</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">print&nbsp;urllib.url2pathname(data4)&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;result:&nbsp;D:\a\b\c\</span><span style="color: #000000;">23</span><span style="color: #000000;">.php<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/346695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-03-21 18:11 <a href="http://www.blogjava.net/ashutc/archive/2011/03/21/346695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0详细配置</title><link>http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 16 Mar 2011 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/346365.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/346365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/346365.html</trackback:ping><description><![CDATA[<br />
<div class="blog_content">
<div id="articleBody" class="articleContent">
<div class="blog_content">
<strong>官方文档 :</strong>
<a href="http://www.mchange.com/projects/c3p0/index.html"><strong><span style="color: #8c5900;">http://www.mchange.com/projects/c3p0/index.html</span>
</strong>
</a>
</div>
<div class="blog_content">&lt;c3p0-config&gt;<br />
&lt;default-config&gt;<br />
<span style="color: #ff0000;">&lt;!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --&gt;<br />
</span>
&lt;property name="acquireIncrement"&gt;3&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --&gt;</span>
<br />
&lt;property name="acquireRetryAttempts"&gt;30&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--两次连接中间隔时间，单位毫秒。Default: 1000 --&gt;</span>
<br />
&lt;property name="acquireRetryDelay"&gt;1000&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--连接关闭时默认将所有未提交的操作回滚。Default: false --&gt;</span>
<br />
&lt;property name="autoCommitOnClose"&gt;false&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么<br />
属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试<br />
使用。Default: null--&gt;<br />
</span>
&lt;property name="automaticTestTable"&gt;Test&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效<br />
保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试<br />
获取连接失败后该数据源将申明已断开并永久关闭。Default: false--&gt;<br />
</span>
&lt;property name="breakAfterAcquireFailure"&gt;false&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出<br />
SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --&gt;<br />
</span>
&lt;property name="checkoutTimeout"&gt;100&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--通过实现ConnectionTester或QueryConnectionTester的类来</span>
<span style="color: #ff0000;">测试连接。类名需制定全路径。<br />
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--&gt;<br />
</span>
&lt;property name="connectionTesterClassName"&gt;&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--指定c3p0 libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可<br />
Default: null--&gt;<br />
</span>
&lt;property name="factoryClassLocation"&gt;null&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.<br />
（文档原文）作者强烈建议不使用的一个属性--&gt;<br />
</span>
&lt;property name="forceIgnoreUnresolvedTransactions"&gt;false&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--每60秒检查所有连接池中的空闲连接。Default: 0 --&gt;<br />
</span>
&lt;property name="idleConnectionTestPeriod"&gt;60&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default: 3 --&gt;<br />
</span>
&lt;property name="initialPoolSize"&gt;3&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --&gt;<br />
</span>
&lt;property name="maxIdleTime"&gt;60&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--连接池中保留的最大连接数。Default: 15 --&gt;<br />
</span>
&lt;property name="maxPoolSize"&gt;15&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements<br />
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。<br />
如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default: 0--&gt;<br />
</span>
&lt;property name="maxStatements"&gt;100&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --&gt;<br />
</span>
&lt;property name="maxStatementsPerConnection"&gt;&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能<br />
通过多线程实现多个操作同时被执行。Default: 3--&gt;</span>
<br />
&lt;property name="numHelperThreads"&gt;3&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0<br />
的数据源时。Default: null--&gt;<br />
</span>
&lt;property name="overrideDefaultUser"&gt;root&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--与overrideDefaultUser参数对应使用的一个参数。Default: null--&gt;<br />
</span>
&lt;property name="overrideDefaultPassword"&gt;password&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--密码。Default: null--&gt;<br />
</span>
&lt;property name="password"&gt;&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意：<br />
测试的表必须在初始数据源的时候就存在。Default: null--&gt;</span>
<br />
&lt;property name="preferredTestQuery"&gt;select id from test where id=1&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--用户修改系统配置参数执行前最多等待300秒。Default: 300 --&gt;<br />
</span>
&lt;property name="propertyCycle"&gt;300&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的<br />
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable<br />
等方法来提升连接测试的性能。Default: false --&gt;<br />
</span>
&lt;property name="testConnectionOnCheckout"&gt;false&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --&gt;<br />
</span>
&lt;property name="testConnectionOnCheckin"&gt;true&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--用户名。Default: null--&gt;<br />
</span>
&lt;property name="user"&gt;root&lt;/property&gt;<br />
<br />
<span style="color: #ff0000;">&lt;!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数<br />
允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始<br />
广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到<br />
支持，但今后可能的版本可能不支持动态反射代理。Default: false--&gt;<br />
</span>
&lt;property name="usesTraditionalReflectiveProxies"&gt;false&lt;/property&gt;<br />
<br />
&lt;property name="automaticTestTable"&gt;con_test&lt;/property&gt;<br />
&lt;property name="checkoutTimeout"&gt;30000&lt;/property&gt;<br />
&lt;property name="idleConnectionTestPeriod"&gt;30&lt;/property&gt;<br />
&lt;property name="initialPoolSize"&gt;10&lt;/property&gt;<br />
&lt;property name="maxIdleTime"&gt;30&lt;/property&gt;<br />
&lt;property name="maxPoolSize"&gt;25&lt;/property&gt;<br />
&lt;property name="minPoolSize"&gt;10&lt;/property&gt;<br />
&lt;property name="maxStatements"&gt;0&lt;/property&gt;<br />
&lt;user-overrides user="swaldman"&gt;<br />
&lt;/user-overrides&gt;<br />
&lt;/default-config&gt;<br />
&lt;named-config name="dumbTestConfig"&gt;<br />
&lt;property name="maxStatements"&gt;200&lt;/property&gt;<br />
&lt;user-overrides user="poop"&gt;<br />
&lt;property name="maxStatements"&gt;300&lt;/property&gt;<br />
&lt;/user-overrides&gt;<br />
&lt;/named-config&gt;<br />
&lt;/c3p0-config&gt;<br />
<br />
<br />
转：<a href="http://www.wujianrong.com/archives/2007/08/c3p0.html"><span style="color: #8c5900;">http://www.wujianrong.com/archives/2007/08/c3p0.html</span>
</a>
</div>
<div class="blog_content">解决MYSQL 8小时问题</div>
<div class="blog_content">
<p>最近的一个项目在Hibernate使用C3P0的连接池，数据库为Mysql。开发测试没有问题，在运行中每个一段长的空闲时间就出现异常:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt">
    <span><span>org.hibernate.exception.JDBCConnectionException: could not execute query</span>
    </span>
    </li>
    <li>
    <span>at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:</span>
    <span class="number">74</span>
    <span>)</span>
    </li>
    <li class="alt">
    <span>at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:</span>
    <span class="number">43</span>
    <span>)</span>
    </li>
    <li>
    <span>.......</span>
    </li>
    <li class="alt">
    <span>Caused by:
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No
    operations allowed after connection closed.Connection was implicitly
    closed due to underlying exception/error:</span>
    </li>
    <li>
    <span>** BEGIN NESTED EXCEPTION **</span>
    </li>
    <li>
    <span>com.mysql.jdbc.CommunicationsException</span>
    </li>
    <li class="alt">
    <span>MESSAGE: Communications link failure due to underlying exception:</span>
    </li>
    <li class="alt">
    <span>** BEGIN NESTED EXCEPTION **</span>
    </li>
    <li class="alt">
    <span>java.net.SocketException</span>
    </li>
    <li>
    <span>MESSAGE: Broken pipe</span>
    </li>
    <li>
    <span>STACKTRACE:</span>
    </li>
    <li>
    <span>java.net.SocketException: Broken pipe</span>
    </li>
    <li class="alt">
    <span>at java.net.SocketOutputStream.socketWrite0(Native Method)</span>
    </li>
    <li>
    <span>......</span>
    </li>
    <li class="alt">
    <span>** END NESTED EXCEPTION **</span>
    </li>
</ol>
</div>
<p>查看了Mysql的文档，以及Connector/J的文档以及在线说明发现，出现这种异常的原因是：</p>
<p>Mysql服务器默认的&#8220;wait_timeout&#8221;是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该
connection。这就是问题的所在，在C3P0
pools中的connections如果空闲超过8小时，Mysql将其断开，而C3P0并不知道该connection已经失效，如果这时有
Client请求connection，C3P0将该失效的Connection提供给Client，将会造成上面的异常。</p>
<p>解决的方法有3种：</p>
<ol>
    <li>增加wait_timeout的时间。 </li>
    <li>减少Connection pools中connection的lifetime。 </li>
    <li>测试Connection pools中connection的有效性。 </li>
</ol>
<p>当然最好的办法是同时综合使用上述3种方法，下面就DBCP和C3P0分别做一说明，假设wait_timeout为默认的8小时</p>
<p>DBCP增加以下配置信息:</p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt">
    <span><span style="color: #008200;"><span class="comment">//set to 'SELECT 1'</span>
    </span>
    </span>
    </li>
    <li>
    <span>validationQuery =</span>
    <span class="string"><span style="color: #0000ff;">"SELECT 1"</span>
    </span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//set to 'true'</span>
    </span>
    </li>
    <li>
    <span>testWhileIdle =</span>
    <span class="string"><span style="color: #0000ff;">"true"</span>
    </span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//some positive integer</span>
    </span>
    </li>
    <li>
    <span>timeBetweenEvictionRunsMillis =</span>
    <span class="number">3600000</span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//set to something smaller than 'wait_timeout'</span>
    </span>
    </li>
    <li>
    <span>minEvictableIdleTimeMillis =</span>
    <span class="number">18000000</span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//if you don't mind a hit for every getConnection(), set to "true"</span>
    </span>
    </li>
    <li>
    <span>testOnBorrow =</span>
    <span class="string"><span style="color: #0000ff;">"true"</span>
    </span>
    </li>
</ol>
</div>
<p>C3P0增加以下配置信息:</p>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt">
    <span><span style="color: #008200;"><span class="comment">//获取connnection时测试是否有效</span>
    </span>
    </span>
    </li>
    <li>
    <span>testConnectionOnCheckin = true</span>
    </li>
    <li><span>//自动测试的table名称<br />
    </span>
    </li>
    <li><span>automaticTestTable=C3P0TestTable<br />
    </span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//set to something much less than wait_timeout, prevents connections from going stale</span>
    </span>
    </li>
    <li>
    <span>idleConnectionTestPeriod =</span>
    <span class="number">18000</span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out</span>
    </span>
    </li>
    <li>
    <span>maxIdleTime =</span>
    <span class="number">25000</span>
    </li>
    <li class="alt">
    <span style="color: #008200;"><span class="comment">//if you can take the performance 'hit', set to "true"</span>
    </span>
    </li>
    <li>
    <span>testConnectionOnCheckout =</span>
    <span class="keyword"><strong><span style="color: #7f0055;">true</span>
    </strong>
    </span>
    </li>
</ol>
</div>
<p>更多的配置信息大家可以查看C3P0文档，Connector/J文档，以及DBCP的文档。</p>
<p>转: <a href="http://www.javaeye.com/article/38506"><span style="color: #8c5900;">http://www.javaeye.com/article/38506</span>
</a>
</p>
<p>我自己的配置:</p>
<p>jdbc.driverClass=com.mysql.jdbc.Driver<br />
jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test<br />
jdbc.user = root<br />
jdbc.password = 12345<br />
jdbc.miniPoolSize = 1<br />
jdbc.maxPoolSize = 20<br />
jdbc.initialPoolSize = 1<br />
jdbc.maxIdleTime = 25000<br />
jdbc.acquireIncrement = 1</p>
<p>jdbc.acquireRetryAttempts = 30<br />
jdbc.acquireRetryDelay = 1000<br />
jdbc.testConnectionOnCheckin = true<br />
jdbc.automaticTestTable = c3p0TestTable<br />
jdbc.idleConnectionTestPeriod = 18000<br />
jdbc.checkoutTimeout=3000</p>
<p>&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br />
&nbsp;&nbsp; &lt;property name="driverClass" value="${jdbc.driverClass}" /&gt;<br />
&nbsp;&nbsp; &lt;property name="jdbcUrl" value="${jdbc.jdbcUrl}" /&gt;<br />
&nbsp;&nbsp; &lt;property name="user" value="${jdbc.user}" /&gt;<br />
&nbsp;&nbsp; &lt;property name="password" value="${jdbc.password}" /&gt;<br />
&nbsp;&nbsp; &lt;property name="minPoolSize" value="${jdbc.miniPoolSize}" /&gt;<br />
&nbsp;&nbsp; &lt;property name="maxPoolSize" value="${jdbc.maxPoolSize}"/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &lt;property name="initialPoolSize" value="${jdbc.initialPoolSize}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="maxIdleTime" value="${jdbc.maxIdleTime}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="acquireIncrement" value="${jdbc.acquireIncrement}"/&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; &lt;property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="automaticTestTable" value="${jdbc.automaticTestTable}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/&gt;<br />
&nbsp;&nbsp; &lt;property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/&gt;</p>
<p>&lt;/bean&gt;</p>
<p>+++++++++++</p>
<p>报错误： <br />
APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! <br />
<br />
一般设置maxStatements=0解决该问题 <br />
但是： <br />
把max_statements设置为0。 <br />
c3p0在同时关闭statement和connection的时候，或者关闭他们之间的时间很短的时候，有时候connection并没有被关闭，因为有些preparedstatement还在被cached住。这是c3p0的作者自己说的。 <br />
http://forum.hibernate.org/viewtopic.php?t=947246&amp;highlight=apparent+deadlock+c3p0 <br />
<br />
C3P0增加以下配置信息: <br />
<br />
<br />
//set to 'SELECT 1'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span class="hilite1">preferredTestQuery</span>
= 'SELECT 1'&nbsp;&nbsp;&nbsp;&nbsp; <br />
//set to something much less than wait_timeout, prevents connections from going stale&nbsp;&nbsp;&nbsp; <br />
idleConnectionTestPeriod = 18000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out&nbsp;&nbsp;&nbsp; <br />
maxIdleTime = 25000&nbsp;&nbsp;&nbsp;&nbsp; <br />
//if you can take the performance 'hit', set to "true"&nbsp;&nbsp;&nbsp; <br />
testConnectionOnCheckout = true&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
<br />
A
c3p0 pool with the settings you have should recover from a database
reset, but that doesn't mean you will never see an Exception. Stale
Connections from the old database session will still be broken, and if
those Connections have already been checked out, or if they are in the
pool and not tested on checkout, the application will see the broken
Connection, in the form of an Exception. <br />
<br />
You can use c3p0 to
minimize the likelihood that your application will see a stale
Connection on database shutdown/restart. The most reliable means of
preventing this is to set hibernate.c3p0.validate to true (in a
hibernate application -- all other c3p0 apps should use the c3p0-native
property c3p0.testConnectionOnCheckout). If you set this property to
true, c3p0 will test Connections prior to checkout, and your app will
never see a stale Connection on database restart unless the Connection
had already been checked out when the database went down. <br />
<br />
Another
less reliable, but potentially less expensive, strategy is to set
c3p0.testConnectionsOnCheckin and hibernate.c3p0.idle_test_period
(c3p0-native c3p0.idleConnectionTestPeriod) to a low value, in which
case all connection tests are asynchronous and you are guanteed that no
Connection will be checked out that hasn't been tested in the last
idle_test_period seconds. Thus, your app will only see broken
Connections from the pool if Connections are checked out during a short
window of time. <br />
<br />
In either case, I recommend setting "c3p0.<span class="hilite1">preferredTestQuery</span>
" or "c3p0.automaticTestTable" in your c3p0 properties file, as c3p0's default Connection test is often slow. <br />
<br />
See "Configuring Connection Testing" in c3p0's docs for more information. <br />
<br />
<br />
<br />
在
使用c3p0作为连接池时，其中的一些配置参数需要修改。主要是maxIdleTime和idleConnectionTestPeriod。
MySQL默认是8小时（28800秒）后自动关闭已打开的连接，所以c3p0要在8小时内关闭不使用的连接，上面的2参数要小于28800秒。附上在
hibernate中配置c3p0的关键字。 <br />
<br />
c3p0-native property name hibernate configuration key <br />
c3p0.acquireIncrement hibernate.c3p0.acquire_increment <br />
c3p0.idleConnectionTestPeriod hibernate.c3p0.idle_test_period <br />
c3p0.initialPoolSize not available -- uses minimum size <br />
c3p0.maxIdleTime hibernate.c3p0.timeout <br />
c3p0.maxPoolSize hibernate.c3p0.max_size <br />
c3p0.maxStatements hibernate.c3p0.max_statements <br />
c3p0.minPoolSize hibernate.c3p0.min_size</p>
<p><strong>转载自：http://handawei.javaeye.com/blog/651046</strong>
</p>
</div>
</div>
</div>
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/346365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-03-16 10:31 <a href="http://www.blogjava.net/ashutc/archive/2011/03/16/346365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在win平台正常，在linux平台乱码</title><link>http://www.blogjava.net/ashutc/archive/2011/03/14/346191.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 14 Mar 2011 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/03/14/346191.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/346191.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/03/14/346191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/346191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/346191.html</trackback:ping><description><![CDATA[<p>export LANG=ZH_cn.GBK<br />
nohup /home/jdk1.6.0_17/bin/java -Dfile.encoding=GBK -Xms200m -Xmx400m -classpath "/home/icehome/search2010/classes" -Djava.ext.dirs=/home/icehome/search2010/lib com.tmg.search.service.indexer.IndexSpider &amp;<br />
<br />
</p>
<p>在startIndexer2010.sh中添加环境变量-Dfile.encoding=GBK&nbsp;&nbsp;&nbsp; 问题解决。</p>
<p>其原因在于String.getBytes()时实际调用StringCoding.encode(value, offset,
count)方法，其中使用默认编码Charset.defaultCharset().name()。defaultCharset从环境变量
file.encoding中取值。</p>
<p>故设置环境变量-Dfile.encoding=GBK&nbsp;改变默认编码</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/346191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-03-14 10:45 <a href="http://www.blogjava.net/ashutc/archive/2011/03/14/346191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb 嵌套查询 for java</title><link>http://www.blogjava.net/ashutc/archive/2011/02/18/344602.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 18 Feb 2011 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/02/18/344602.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/344602.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/02/18/344602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/344602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/344602.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;DBCollection&nbsp;col&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;db.getCollection(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBObject&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BasicDBObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">$in</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Object[]&nbsp;{&nbsp;ids&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBCursor&nbsp;ite&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;col.find(query);</span></div>
<img src ="http://www.blogjava.net/ashutc/aggbug/344602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-02-18 11:07 <a href="http://www.blogjava.net/ashutc/archive/2011/02/18/344602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从MySQL到MongoDB简易对照表</title><link>http://www.blogjava.net/ashutc/archive/2011/02/18/344600.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 18 Feb 2011 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/02/18/344600.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/344600.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/02/18/344600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/344600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/344600.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">查询：<br />
MySQL:<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user<br />
Mongo:<br />
db.user.find()<br />
<br />
MySQL:<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8217;starlee&#8217;<br />
Mongo:<br />
db.user.find({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;})<br />
<br />
插入：<br />
MySQL:<br />
INSERT&nbsp;INOT&nbsp;user&nbsp;(`name`,&nbsp;`age`)&nbsp;values&nbsp;(&#8217;starlee&#8217;,</span><span style="color: #000000;">25</span><span style="color: #000000;">)<br />
Mongo:<br />
db.user.insert({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;,&nbsp;&#8216;age&#8217;&nbsp;:&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">})<br />
<br />
如果你想在MySQL里添加一个字段，你必须：<br />
ALTER&nbsp;TABLE&nbsp;user&#8230;.<br />
但在MongoDB里你只需要：<br />
db.user.insert({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;,&nbsp;&#8216;age&#8217;&nbsp;:&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">,&nbsp;&#8216;email&#8217;&nbsp;:&nbsp;&#8217;starlee@starlee.com&#8217;})<br />
<br />
删除：<br />
MySQL:<br />
DELETE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user<br />
Mongo:<br />
db.user.remove({})<br />
<br />
MySQL:<br />
DELETE&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;age&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;"><br />
Mongo:<br />
db.user.remove({&#8216;age&#8217;&nbsp;:&nbsp;{$lt&nbsp;:&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">}})<br />
<br />
$gt&nbsp;:&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;;&nbsp;$gte&nbsp;:&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;;&nbsp;$lt&nbsp;:&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;;&nbsp;$lte&nbsp;:&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;;&nbsp;$ne&nbsp;:&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;"><br />
<br />
更新:<br />
<br />
MySQL:<br />
UPDATE&nbsp;user&nbsp;SET&nbsp;`age`&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">36</span><span style="color: #000000;">&nbsp;WHERE&nbsp;`name`&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8217;starlee&#8217;<br />
Mongo:<br />
db.user.update({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;},&nbsp;{$set&nbsp;:&nbsp;{&#8216;age&#8217;&nbsp;:&nbsp;</span><span style="color: #000000;">36</span><span style="color: #000000;">}})<br />
<br />
MySQL:<br />
UPDATE&nbsp;user&nbsp;SET&nbsp;`age`&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;`age`&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;WHERE&nbsp;`name`&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8217;starlee&#8217;<br />
Mongo:<br />
db.user.update({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;},&nbsp;{$inc&nbsp;:&nbsp;{&#8216;age&#8217;&nbsp;:&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">}})<br />
<br />
MySQL:<br />
SELECT&nbsp;COUNT(</span><span style="color: #000000;">*</span><span style="color: #000000;">)&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;`name`&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&#8217;starlee&#8217;<br />
Mongo:<br />
db.user.find({&#8216;name&#8217;&nbsp;:&nbsp;&#8217;starlee&#8217;}).count()<br />
<br />
MySQL:<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user&nbsp;limit&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">20</span><span style="color: #000000;"><br />
Mongo:<br />
db.user.find().skip(</span><span style="color: #000000;">10</span><span style="color: #000000;">).limit(</span><span style="color: #000000;">20</span><span style="color: #000000;">)<br />
<br />
MySQL:<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;`age`&nbsp;IN&nbsp;(</span><span style="color: #000000;">25</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">35</span><span style="color: #000000;">,</span><span style="color: #000000;">45</span><span style="color: #000000;">)<br />
Mongo:<br />
db.user.find({&#8216;age&#8217;&nbsp;:&nbsp;{$in&nbsp;:&nbsp;[</span><span style="color: #000000;">25</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">35</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">45</span><span style="color: #000000;">]}})<br />
<br />
MySQL:<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;user&nbsp;ORDER&nbsp;BY&nbsp;age&nbsp;DESC<br />
Mongo:<br />
db.user.find().sort({&#8216;age&#8217;&nbsp;:&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
<br />
MySQL:<br />
SELECT&nbsp;DISTINCT(name)&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;age&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;"><br />
Mongo:<br />
db.user.distinct(&#8216;name&#8217;,&nbsp;{&#8216;age&#8217;:&nbsp;{$lt&nbsp;:&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">}})<br />
<br />
MySQL:<br />
SELECT&nbsp;name,&nbsp;sum(marks)&nbsp;FROM&nbsp;user&nbsp;GROUP&nbsp;BY&nbsp;name<br />
Mongo:<br />
db.user.group({<br />
key&nbsp;:&nbsp;{&#8216;name&#8217;&nbsp;:&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">},<br />
cond:&nbsp;{&#8216;name&#8217;&nbsp;:&nbsp;&#8216;foo&#8217;},<br />
reduce:&nbsp;function(obj,prev)&nbsp;{&nbsp;prev.msum&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;obj.marks;&nbsp;},<br />
initial:&nbsp;{msum&nbsp;:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">}<br />
});<br />
<br />
MySQL:<br />
SELECT&nbsp;name&nbsp;FROM&nbsp;user&nbsp;WHERE&nbsp;age&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;"><br />
Mongo:<br />
db.user.find(&#8216;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">&#8242;,&nbsp;{name&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
<br />
发现很多人在搜MongoDB循环插入数据，下面把MongoDB循环插入数据的方法添加在下面：<br />
<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(var&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">100</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)db.test.insert({uid:i,uname:&#8217;nosqlfan&#8217;</span><span style="color: #000000;">+</span><span style="color: #000000;">i});<br />
<br />
上面一次性插入一百条数据，大概结构如下：<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6b8&#8243;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">55</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan55&#8243;&nbsp;}<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6b9&#8243;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">56</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan56&#8243;&nbsp;}<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6ba&#8221;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">57</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan57&#8243;&nbsp;}<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6bb&#8221;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">58</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan58&#8243;&nbsp;}<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6bc&#8221;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">59</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan59&#8243;&nbsp;}<br />
{&nbsp;&#8220;_id&#8221;&nbsp;:&nbsp;ObjectId(&#8220;4c876e519e86023a30dde6bd&#8221;),&nbsp;&#8220;uid&#8221;&nbsp;:&nbsp;</span><span style="color: #000000;">60</span><span style="color: #000000;">,&nbsp;&#8220;uname&#8221;&nbsp;:&nbsp;&#8220;nosqlfan60&#8243;&nbsp;}</span></div>
简易对照表<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">SQL&nbsp;Statement&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; Mongo&nbsp;Query&nbsp;Language&nbsp;Statement&nbsp;<br />
CREATE&nbsp;TABLE&nbsp;USERS&nbsp;(a&nbsp;Number,&nbsp;b&nbsp;Number)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; implicit;&nbsp;can&nbsp;be&nbsp;done&nbsp;explicitly&nbsp;<br />
<br />
INSERT&nbsp;INTO&nbsp;USERS&nbsp;VALUES(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">)&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; db.users.insert({a:</span><span style="color: #000000;">1</span><span style="color: #000000;">,b:</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
SELECT&nbsp;a,b&nbsp;FROM&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({},&nbsp;{a:</span><span style="color: #000000;">1</span><span style="color: #000000;">,b:</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #000000;">db.users.find()<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({age:</span><span style="color: #000000;">33</span><span style="color: #000000;">})<br />
SELECT&nbsp;a,b&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({age:</span><span style="color: #000000;">33</span><span style="color: #000000;">},&nbsp;{a:</span><span style="color: #000000;">1</span><span style="color: #000000;">,b:</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">=</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;ORDER&nbsp;BY&nbsp;name&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({age:</span><span style="color: #000000;">33</span><span style="color: #000000;">}).sort({name:</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:{$gt:</span><span style="color: #000000;">33</span><span style="color: #000000;">}})})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:{$lt:</span><span style="color: #000000;">33</span><span style="color: #000000;">}})})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;name&nbsp;LIKE&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%Joe%</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({name:</span><span style="color: #000000;">/</span><span style="color: #000000;">Joe</span><span style="color: #000000;">/</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;name&nbsp;LIKE&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Joe%</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({name:</span><span style="color: #000000;">/^</span><span style="color: #000000;">Joe</span><span style="color: #000000;">/</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;age</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">33</span><span style="color: #000000;">&nbsp;AND&nbsp;age</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">40</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">age</span><span style="color: #000000;">'</span><span style="color: #000000;">:{$gt:</span><span style="color: #000000;">33</span><span style="color: #000000;">,$lte:</span><span style="color: #000000;">40</span><span style="color: #000000;">}})})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;ORDER&nbsp;BY&nbsp;name&nbsp;DESC&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find().sort({name:</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
CREATE&nbsp;INDEX&nbsp;myindexname&nbsp;ON&nbsp;users(name)&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp; db.users.ensureIndex({name:</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
CREATE&nbsp;INDEX&nbsp;myindexname&nbsp;ON&nbsp;users(name,ts&nbsp;DESC)&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp; db.users.ensureIndex({name:</span><span style="color: #000000;">1</span><span style="color: #000000;">,ts:</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;and&nbsp;b</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({a:</span><span style="color: #000000;">1</span><span style="color: #000000;">,b:</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">})<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;LIMIT&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;SKIP&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find().limit(</span><span style="color: #000000;">10</span><span style="color: #000000;">).skip(</span><span style="color: #000000;">20</span><span style="color: #000000;">)<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;or&nbsp;b</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find(&nbsp;{&nbsp;$or&nbsp;:&nbsp;[&nbsp;{&nbsp;a&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;}&nbsp;,&nbsp;{&nbsp;b&nbsp;:&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;}&nbsp;]&nbsp;}&nbsp;)<br />
SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;LIMIT&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #000000;">db.users.findOne()<br />
EXPLAIN&nbsp;SELECT&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;z</span><span style="color: #000000;">=</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({z:</span><span style="color: #000000;">3</span><span style="color: #000000;">}).explain()<br />
SELECT&nbsp;DISTINCT&nbsp;last_name&nbsp;FROM&nbsp;users&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.distinct(</span><span style="color: #000000;">'</span><span style="color: #000000;">last_name</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
SELECT&nbsp;COUNT(</span><span style="color: #000000;">*</span><span style="color: #000000;">y) FROM&nbsp;users&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.count()<br />
SELECT&nbsp;COUNT(</span><span style="color: #000000;">*</span><span style="color: #000000;">y) FROM&nbsp;users&nbsp;where&nbsp;AGE&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({age:&nbsp;{</span><span style="color: #000000;">'</span><span style="color: #000000;">$gt</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">}}).count()<br />
SELECT&nbsp;COUNT(AGE)&nbsp;from&nbsp;users&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #000000;">db.users.find({age:&nbsp;{</span><span style="color: #000000;">'</span><span style="color: #000000;">$exists</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">}}).count()<br />
UPDATE&nbsp;users&nbsp;SET&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;WHERE&nbsp;b</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.users.update({b:</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">},&nbsp;{$set:{a:</span><span style="color: #000000;">1</span><span style="color: #000000;">}},&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
UPDATE&nbsp;users&nbsp;SET&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #000000;">a</span><span style="color: #000000;">+</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;WHERE&nbsp;b</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp; db.users.update({b:</span><span style="color: #000000;">'</span><span style="color: #000000;">q</span><span style="color: #000000;">'</span><span style="color: #000000;">},&nbsp;{$inc:{a:</span><span style="color: #000000;">2</span><span style="color: #000000;">}},&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
DELETE&nbsp;FROM&nbsp;users&nbsp;WHERE&nbsp;z</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">abc</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; </span><span style="color: #000000;">db.users.remove({z:</span><span style="color: #000000;">'</span><span style="color: #000000;">abc</span><span style="color: #000000;">'</span><span style="color: #000000;">});<br />
<br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/344600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-02-18 10:28 <a href="http://www.blogjava.net/ashutc/archive/2011/02/18/344600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javaMail两个版本</title><link>http://www.blogjava.net/ashutc/archive/2011/01/20/343260.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 20 Jan 2011 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/01/20/343260.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/343260.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/01/20/343260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/343260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/343260.html</trackback:ping><description><![CDATA[<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">beans&nbsp;xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/aop</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.5.xsd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mailSender</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.mail.javamail.JavaMailSenderImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">host</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">127.0</span><span style="color: #000000;">.</span><span style="color: #000000;">0.1</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;&lt;!--</span><span style="color: #000000;">&nbsp;本地服务器&nbsp;&nbsp;如果是其他，请填如：smtp.sohu.com</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">javaMailProperties</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">props</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">prop&nbsp;key</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mail.smtp.auth</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">prop</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">prop&nbsp;key</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mail.smtp.timeout</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">25000</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">prop</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">props</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">username</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">postmaster@mai.com</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;我这里用本地的邮箱名</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">password</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">123456</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
然后建立一个java文件<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.fantlam.spring;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.ApplicationContext;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.mail.SimpleMailMessage;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.mail.javamail.JavaMailSender;<br />
<br />
&nbsp;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SpringMail1&nbsp;{<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;args[]){<br />
<br />
&nbsp;ApplicationContext&nbsp;ctx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;JavaMailSender&nbsp;sender&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(JavaMailSender)&nbsp;ctx.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">mailSender</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;SimpleMailMessage&nbsp;mail&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleMailMessage();<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">这里SimpleMailMessage只能用来发送text格式的邮件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;mail.setTo(</span><span style="color: #000000;">"</span><span style="color: #000000;">fantlam@163.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">接收者&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;mail.setFrom(</span><span style="color: #000000;">"</span><span style="color: #000000;">sohu@mai.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">按前面讲的，可以随便起</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;mail.setSubject(</span><span style="color: #000000;">"</span><span style="color: #000000;">spring&nbsp;mail&nbsp;test!</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">主题&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;mail.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">springMail的简单发送测试</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">邮件内容&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;sender.send(mail);&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;}&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;<br />
<br />
}<br />
<br />
}</span></div>
<br />
<br />
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.mail.Message;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.mail.Session;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.mail.Transport;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.mail.internet.InternetAddress;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.mail.internet.MimeMessage;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SendMail&nbsp;{<br />
&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Properties&nbsp;props&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;System.getProperties();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置smtp服务器&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">mail.smtp.host</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">smtp.126.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;现在的大部分smpt都需要验证了&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">mail.smtp.auth</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Session.getInstance(props);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;为了查看运行时的信息&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.setDebug(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;由邮件会话新建一个消息对象&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MimeMessage&nbsp;message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MimeMessage(s);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;发件人&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetAddress&nbsp;from&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InternetAddress(</span><span style="color: #000000;">"</span><span style="color: #000000;">ashutc@126.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setFrom(from);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;收件人&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InternetAddress&nbsp;to&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InternetAddress(</span><span style="color: #000000;">"</span><span style="color: #000000;">ashutc@126.com</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setRecipient(Message.RecipientType.TO,&nbsp;to);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;邮件标题&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setSubject(</span><span style="color: #000000;">"</span><span style="color: #000000;">test</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;content&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">测试内容</span><span style="color: #000000;">"</span><span style="color: #000000;">;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;邮件内容,也可以使纯文本"text/plain"&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setContent(content,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">text/html;charset=GBK</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;">**下面代码是发送附件******&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;"d:\\hello.txt";&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MimeBodyPart&nbsp;messageBodyPart&nbsp;=&nbsp;new&nbsp;MimeBodyPart();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setText("Hi");&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Multipart&nbsp;multipart&nbsp;=&nbsp;new&nbsp;MimeMultipart();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart&nbsp;=&nbsp;new&nbsp;MimeBodyPart();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;source&nbsp;=&nbsp;new&nbsp;FileDataSource(fileName);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setDataHandler(new&nbsp;DataHandler(source));&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setFileName(fileName);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setContent(multipart);</span><span style="color: #008000;">*/</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.saveChanges();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transport&nbsp;transport&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;s.getTransport(</span><span style="color: #000000;">"</span><span style="color: #000000;">smtp</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;smtp验证，就是你用来发邮件的邮箱用户名密码&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.connect(</span><span style="color: #000000;">"</span><span style="color: #000000;">smtp.126.com</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ashutc</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">*******</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;发送&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.sendMessage(message,&nbsp;message.getAllRecipients());&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transport.close();&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/343260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-01-20 15:16 <a href="http://www.blogjava.net/ashutc/archive/2011/01/20/343260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB+java+spirng+morphia</title><link>http://www.blogjava.net/ashutc/archive/2011/01/12/342819.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 12 Jan 2011 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/01/12/342819.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/342819.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/01/12/342819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/342819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/342819.html</trackback:ping><description><![CDATA[<span style="color: #000000;">Hotle.java</span><br />
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;test_yu.morphiaSpring;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.annotations.Embedded;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.annotations.Entity;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.annotations.Id;<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;yu<br />
&nbsp;*&nbsp;创建了两个领域Hotel,Address,前者为实体存在,有自己的生命周期,后者则为内嵌在实体之中,没有独立的生命周期<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
@Entity<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Hotle&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Id<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;stars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Embedded<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Address&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getStars()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;stars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setStars(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;stars)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.stars&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;stars;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Address&nbsp;getAddress()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAddress(Address&nbsp;address)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.address&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
@Embedded<br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Address&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;postCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getStreet()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setStreet(String&nbsp;street)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.street&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;street;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getCity()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setCity(String&nbsp;city)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.city&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;city;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getPostCode()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;postCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPostCode(String&nbsp;postCode)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.postCode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;postCode;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getCountry()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setCountry(String&nbsp;country)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.country&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;country;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
MorphiaBean.java<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;test_yu.morphiaSpring;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.Datastore;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.Morphia;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.mongodb.Mongo;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MorphiaBean&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Morphia&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Mongo&nbsp;mongo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;dbName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Datastore&nbsp;getDatastore(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mongo</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">||</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbName</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;createDatastore(mongo,&nbsp;dbName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Mongo&nbsp;getMongo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;mongo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMongo(Mongo&nbsp;mongo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mongo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;mongo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getDbName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;dbName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setDbName(String&nbsp;dbName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.dbName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dbName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
<span style="color: #000000;">MorphiaTest.java</span><br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;test_yu.morphiaSpring;<br />
<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.UnknownHostException;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.ApplicationContext;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.google.code.morphia.Datastore;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MorphiaTest&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;UnknownHostException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MorphiaBean&nbsp;morphiaBean</span><span style="color: #000000;">=</span><span style="color: #000000;">(MorphiaBean)&nbsp;context.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">morphia</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Datastore&nbsp;ds</span><span style="color: #000000;">=</span><span style="color: #000000;">morphiaBean.getDatastore();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向数据库中添加多条记录</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addManyArticles(ds);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printLine();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Article&nbsp;single&nbsp;=&nbsp;ds.get(Article.class,9);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("single&nbsp;=&nbsp;"&nbsp;+&nbsp;single);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printLine();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查询文章大于5，编辑id大于106的文章<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Article&gt;&nbsp;articles=&nbsp;ds.find(Article.class,"id&nbsp;&gt;",5).filter("editor.id&nbsp;&gt;",106).asList();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayArticleList(articles);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printLine();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">更新id=123的文章标题和编辑名称<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.update(ds.createQuery(Article.class).where("id&nbsp;=&nbsp;123"),ds.createUpdateOperations(Article.class).set("title","修改后的标题").set("editor.name","yumeng"));<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printLine();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">所有id号大于5的文章的编辑id号+1<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.update(ds.createQuery(Article.class).where("id&nbsp;&gt;&nbsp;5"),ds.createUpdateOperations(Article.class).inc("editor.id"));<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printLine();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">向id为123的文章的关键词列表中新增一个关键词<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.update(ds.createQuery(Article.class).filter("id",123),ds.createUpdateOperations(Article.class).add("keywords",&nbsp;"宏基"));<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">批量添加关键词<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&nbsp;&gt;&nbsp;keys&nbsp;=&nbsp;new&nbsp;ArrayList&lt;String&gt;();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys.add("苍天");<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys.add("大地");<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.update(ds.createQuery(Article.class).filter("id",123),ds.createUpdateOperations(Article.class).addAll("keywords",keys,false));<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">列出所有数据<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&lt;Article&gt;&nbsp;query&nbsp;=&nbsp;ds.find(Article.class);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayQueryRusult(query);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;printLine()&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("-------------------------------------");<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;displayArticleList(List&lt;Article&gt;&nbsp;articles)&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Article&nbsp;article&nbsp;:&nbsp;articles)&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("article&nbsp;=&nbsp;"&nbsp;+&nbsp;article);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;displayQueryRusult(Query&lt;Article&gt;&nbsp;query)&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&lt;Article&gt;&nbsp;it&nbsp;=&nbsp;query.fetch().iterator();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(it.hasNext())&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Article&nbsp;article&nbsp;=&nbsp;&nbsp;it.next();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("article.toString()&nbsp;=&nbsp;"&nbsp;+&nbsp;article.toString());<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addManyArticles(Datastore&nbsp;ds)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hotle&nbsp;hotle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hotle();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Address&nbsp;address</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Address();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setCity(</span><span style="color: #000000;">"</span><span style="color: #000000;">北京</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setCountry(</span><span style="color: #000000;">"</span><span style="color: #000000;">中国</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setPostCode(</span><span style="color: #000000;">"</span><span style="color: #000000;">100080</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address.setStreet(</span><span style="color: #000000;">"</span><span style="color: #000000;">海淀中街</span><span style="color: #000000;">"</span><span style="color: #000000;">);<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotle.setId(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotle.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">悦来酒店</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotle.setStars(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hotle.setAddress(address);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds.save(hotle);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<br />
applicationContext.xml<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">beans&nbsp;xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:p</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/p</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">propertyConfigurer</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.beans.factory.config.PropertyPlaceholderConfigurer</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">locations</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;/</span><span style="color: #000000;">config.properties</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mongo</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.mongodb.Mongo</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">constructor</span><span style="color: #000000;">-</span><span style="color: #000000;">arg&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">String</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">219.239.88.200</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">constructor</span><span style="color: #000000;">-</span><span style="color: #000000;">arg</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">constructor</span><span style="color: #000000;">-</span><span style="color: #000000;">arg&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">int</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">27017</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">constructor</span><span style="color: #000000;">-</span><span style="color: #000000;">arg</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">morphia</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">test_yu.morphiaSpring.MorphiaBean</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mongo</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">mongo</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dbName</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">address</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span></div>
<br />
<br />
需要几个支持包<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/342819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-01-12 10:09 <a href="http://www.blogjava.net/ashutc/archive/2011/01/12/342819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中Quartz的配置</title><link>http://www.blogjava.net/ashutc/archive/2011/01/04/342284.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 04 Jan 2011 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/01/04/342284.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/342284.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/01/04/342284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/342284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/342284.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">jar包:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quartz.1.6.0.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jta.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commons-collection-3.2.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spring3.0的系列jar包<br />
<br />
</span><br />
<span style="color: #000000;"><br />
<br />
Quartz是一个强大的企业级任务调度框架，Spring中继承并简化了Quartz，下面就看看在Spring中怎样配置Quartz：<br />
首先我们来写一个被调度的类：<br />
</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.kay.quartz;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;QuartzJob<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;work()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Quartz的任务调度！！！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
Spring的配置文件：<br />
</span><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">-//SPRING//DTD&nbsp;BEAN//EN</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/dtd/spring-beans.dtd</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;要调用的工作类&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">quartzJob</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.kay.quartz.QuartzJob</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;定义调用对象和调用对象的方法&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jobtask</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;调用的类&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">targetObject</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">quartzJob</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;调用类中的方法&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">targetMethod</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">work</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;定义触发时间&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">doTime</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.scheduling.quartz.CronTriggerBean</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jobDetail</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">jobtask</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;cron表达式&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">cronExpression</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">,</span><span style="color: #000000;">15</span><span style="color: #000000;">,</span><span style="color: #000000;">20</span><span style="color: #000000;">,</span><span style="color: #000000;">25</span><span style="color: #000000;">,</span><span style="color: #000000;">30</span><span style="color: #000000;">,</span><span style="color: #000000;">35</span><span style="color: #000000;">,</span><span style="color: #000000;">40</span><span style="color: #000000;">,</span><span style="color: #000000;">45</span><span style="color: #000000;">,</span><span style="color: #000000;">50</span><span style="color: #000000;">,</span><span style="color: #000000;">55</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;总管理类&nbsp;如果将lazy</span><span style="color: #000000;">-</span><span style="color: #000000;">init</span><span style="color: #000000;">=</span><span style="color: #000000;">'</span><span style="color: #000000;">false</span><span style="color: #000000;">'</span><span style="color: #000000;">那么容器启动就会执行调度程序&nbsp;&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">startQuertz</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;lazy</span><span style="color: #000000;">-</span><span style="color: #000000;">init</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">false</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;autowire</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">no</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.scheduling.quartz.SchedulerFactoryBean</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">triggers</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">doTime</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
测试程序：<br />
</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.kay.quartz;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.ApplicationContext;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MainTest<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Test&nbsp;start.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;context&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000;">"</span><span style="color: #000000;">quartz-config.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">如果配置文件中将startQuertz&nbsp;bean的lazy-init设置为false&nbsp;则不用实例化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">context.getBean("startQuertz");</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">Test&nbsp;end..</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
我们需要把log4j的配置文件放入src目录下，启动main类就可以了。<br />
<br />
关于cron表达式（来自网络）：<br />
<br />
Cron&nbsp;表达式包括以下&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;个字段：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;秒<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;分<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;小时<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;月内日期<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;月<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;周内日期<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;年（可选字段）<br />
<br />
特殊字符<br />
<br />
Cron&nbsp;触发器利用一系列特殊字符，如下所示：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;反斜线（</span><span style="color: #000000;">/</span><span style="color: #000000;">）字符表示增量值。例如，在秒字段中&#8220;</span><span style="color: #000000;">5</span><span style="color: #000000;">/</span><span style="color: #000000;">15</span><span style="color: #000000;">&#8221;代表从第&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;秒开始，每&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;秒一次。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;问号（</span><span style="color: #000000;">?</span><span style="color: #000000;">）字符和字母&nbsp;L&nbsp;字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以，如果指定月内日期，可以在周内日期字段中插入&#8220;</span><span style="color: #000000;">?</span><span style="color: #000000;">&#8221;，表示周内日期值无关紧要。字母&nbsp;L&nbsp;字符是&nbsp;last&nbsp;的缩写。放在月内日期字段中，表示安排在当月最后一天执行。在周内日期字段中，如果&#8220;L&#8221;单独存在，就等于&#8220;</span><span style="color: #000000;">7</span><span style="color: #000000;">&#8221;，否则代表当月内周内日期的最后一个实例。所以&#8220;</span><span style="color: #000000;">0L</span><span style="color: #000000;">&#8221;表示安排在当月的最后一个星期日执行。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在月内日期字段中的字母（W）字符把执行安排在最靠近指定值的工作日。把&#8220;1W&#8221;放在月内日期字段中，表示把执行安排在当月的第一个工作日内。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;井号（#）字符为给定月份指定具体的工作日实例。把&#8220;MON#</span><span style="color: #000000;">2</span><span style="color: #000000;">&#8221;放在周内日期字段中，表示把任务安排在当月的第二个星期一。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;星号（</span><span style="color: #000000;">*</span><span style="color: #000000;">）字符是通配字符，表示该字段可以接受任何可能的值。<br />
<br />
字段&nbsp;允许值&nbsp;允许的特殊字符<br />
秒&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">-</span><span style="color: #000000;">59</span><span style="color: #000000;">&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
分&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">-</span><span style="color: #000000;">59</span><span style="color: #000000;">&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
小时&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">-</span><span style="color: #000000;">23</span><span style="color: #000000;">&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
日期&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">-</span><span style="color: #000000;">31</span><span style="color: #000000;">&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;L&nbsp;W&nbsp;C<br />
月份&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">-</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;或者&nbsp;JAN</span><span style="color: #000000;">-</span><span style="color: #000000;">DEC&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
星期&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">-</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;或者&nbsp;SUN</span><span style="color: #000000;">-</span><span style="color: #000000;">SAT&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;L&nbsp;C&nbsp;#<br />
年（可选）&nbsp;留空,&nbsp;</span><span style="color: #000000;">1970</span><span style="color: #000000;">-</span><span style="color: #000000;">2099</span><span style="color: #000000;">&nbsp;,&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;"><br />
<br />
表达式意义<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;0&nbsp;12&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每天中午12点触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;*</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每天上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每天上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;*</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每天上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;2005</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;2005年的每天上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;*&nbsp;14&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;在每天下午2点到下午2:59期间的每1分钟触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;0/5&nbsp;14&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;在每天下午2点到下午2:55期间的每5分钟触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;0/5&nbsp;14,18&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;0-5&nbsp;14&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;在每天下午2点到下午2:05期间的每1分钟触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;10,44&nbsp;14&nbsp;?&nbsp;3&nbsp;WED</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每年三月的星期三的下午2:10和2:44触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;MON-FRI</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;周一至周五的上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;15&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每月15日上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;L&nbsp;*&nbsp;?</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每月最后一日的上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每月的最后一个星期五上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L&nbsp;2002-2005</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;2002年至2005年的每月的最后一个星期五上午10:15触发<br />
</span><span style="color: #000000;">"</span><span style="color: #000000;">0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6#3</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;每月的第三个星期五上午10:15触发<br />
每天早上6点<br />
<br />
</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;"><br />
<br />
每两个小时<br />
<br />
</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*/</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;"><br />
晚上11点到早上8点之间每两个小时，早上八点<br />
<br />
</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">23</span><span style="color: #000000;">-</span><span style="color: #000000;">7</span><span style="color: #000000;">/</span><span style="color: #000000;">2</span><span style="color: #000000;">，</span><span style="color: #000000;">8</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;"><br />
<br />
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点<br />
<br />
</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">-</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />
1月1日早上4点<br />
<br />
</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span></div>
<br />
<div>一个cron表达式有至少6个（也可能7个）有空格分隔的时间元素。<br /> <h4>按顺序依次为 </h4> <h4>秒（0~59） </h4> <p>分钟（0~59） </p> <p>小时（0~23） </p> <p>天（月）（0~31，但是你需要考虑你月的天数） </p> <p>月（0~11） </p> <p>天（星期）（1~7 1=SUN 或 SUN，MON，TUE，WED，THU，FRI，SAT） </p> <p>7.年份（1970－2099）<br /> <br /> 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. </p> <p>0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br /> 0 0/30 9-17 * * ?&nbsp;&nbsp; 朝九晚五工作时间内每半小时<br /> 0 0 12 ? * WED 表示每个星期三中午12点 <br /> "0&nbsp;0&nbsp;12&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天中午12点触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;*"&nbsp;每天上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;*"&nbsp;每天上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;2005"&nbsp;2005年的每天上午10:15触发&nbsp;<br /> "0&nbsp;*&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:59期间的每1分钟触发&nbsp;<br /> "0&nbsp;0/5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:55期间的每5分钟触发&nbsp;<br /> "0&nbsp;0/5&nbsp;14,18&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发&nbsp;<br /> "0&nbsp;0-5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:05期间的每1分钟触发&nbsp;<br /> "0&nbsp;10,44&nbsp;14&nbsp;?&nbsp;3&nbsp;WED"&nbsp;每年三月的星期三的下午2:10和2:44触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;MON-FRI"&nbsp;周一至周五的上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;15&nbsp;*&nbsp;?"&nbsp;每月15日上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;L&nbsp;*&nbsp;?"&nbsp;每月最后一日的上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L"&nbsp;每月的最后一个星期五上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L&nbsp;2002-2005"&nbsp;2002年至2005年的每月的最后一个星期五上午10:15触发&nbsp;<br /> "0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6#3"&nbsp;每月的第三个星期五上午10:15触发&nbsp;<br /> </p> <p>有些子表达式能包含一些范围或列表 </p> <p>例如：子表达式（<strong>天（星期）</strong>）可以为 &#8220;MON-FRI&#8221;，&#8220;MON，WED，FRI&#8221;，&#8220;MON-WED,SAT&#8221; </p> <p>&#8220;*&#8221;字符代表所有可能的值 </p> <p>因此，&#8220;*&#8221;在子表达式（<strong>月</strong>）里表示每个月的含义，&#8220;*&#8221;在子表达式（<strong>天（星期）</strong>）表示星期的每一天 </p> <p>&nbsp;</p> <p>&#8220;/&#8221;字符用来指定数值的增量 </p> <p>例如：在子表达式（分钟）里的&#8220;0/15&#8221;表示从第0分钟开始，每15分钟 </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 在子表达式（分钟）里的&#8220;3/20&#8221;表示从第3分钟开始，每20分钟（它和&#8220;3，23，43&#8221;）的含义一样 </p> <p><br /> &#8220;？&#8221;字符仅被用于天（月）和天（星期）两个子表达式，表示不指定值 </p> <p>当2个子表达式其中之一被指定了值以后，为了避免冲突，需要将另一个子表达式的值设为&#8220;？&#8221; </p> <p>&nbsp;</p> <p>&#8220;L&#8221; 字符仅被用于天（月）和天（星期）两个子表达式，它是单词&#8220;last&#8221;的缩写 </p> <p>但是它在两个子表达式里的含义是不同的。 </p> <p>在天（月）子表达式中，&#8220;L&#8221;表示一个月的最后一天 </p> <p>在天（星期）自表达式中，&#8220;L&#8221;表示一个星期的最后一天，也就是SAT </p> <p>如果在&#8220;L&#8221;前有具体的内容，它就具有其他的含义了 </p> <p>例如：&#8220;6L&#8221;表示这个月的倒数第６天，&#8220;ＦＲＩＬ&#8221;表示这个月的最一个星期五 </p> <p>注意：在使用&#8220;L&#8221;参数时，不要指定列表或范围，因为这会导致问题 </p> <p>&nbsp;</p> <p> </p>               <table cellspacing="8"><tbody><tr>             <th align="left">字段</th>             <th align="left">&nbsp;</th>             <th align="left">允许值</th>             <th align="left">&nbsp;</th>             <th align="left">允许的特殊字符</th>         </tr>         <tr>             <td align="left"><code>秒</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>0-59</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * /</code></td>         </tr>         <tr>             <td align="left"><code>分</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>0-59</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * /</code></td>         </tr>         <tr>             <td align="left"><code>小时</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>0-23</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * /</code></td>         </tr>         <tr>             <td align="left"><code>日期</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>1-31</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * ? / L W C</code></td>         </tr>         <tr>             <td align="left"><code>月份</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>1-12&nbsp;或者 JAN-DEC</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * /</code></td>         </tr>         <tr>             <td align="left"><code>星期</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>1-7&nbsp;或者 SUN-SAT</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * ? / L C #</code></td>         </tr>         <tr>             <td align="left"><code>年（可选）</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>留空, 1970-2099</code></td>             <td align="left">&nbsp; </td>             <td align="left"><code>, - * /</code></td></tr></tbody></table></div><br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/342284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-01-04 15:06 <a href="http://www.blogjava.net/ashutc/archive/2011/01/04/342284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB 正则表达式 regex 查询</title><link>http://www.blogjava.net/ashutc/archive/2010/12/21/341264.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 21 Dec 2010 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/21/341264.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/341264.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/21/341264.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/341264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/341264.html</trackback:ping><description><![CDATA[<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">条件查询&nbsp;&nbsp;模糊查询</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;john&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Pattern.compile(</span><span style="color: #000000;">"</span><span style="color: #000000;">586190</span><span style="color: #000000;">"</span><span style="color: #000000;">,Pattern.CASE_INSENSITIVE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicDBObject&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BasicDBObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">url</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;john);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;finds&nbsp;all&nbsp;people&nbsp;with&nbsp;"name"&nbsp;matching&nbsp;/joh?n/i&nbsp;DBCursor&nbsp;cursor&nbsp;=&nbsp;collection.find(query);</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBCursor&nbsp;ite&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;col.find(query);</span></div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/341264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-21 17:48 <a href="http://www.blogjava.net/ashutc/archive/2010/12/21/341264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb查询的语法</title><link>http://www.blogjava.net/ashutc/archive/2010/12/21/341263.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 21 Dec 2010 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/21/341263.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/341263.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/21/341263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/341263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/341263.html</trackback:ping><description><![CDATA[<br />
<br />
<a target="_blank" href="http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ConditionalOperators%3A%3C%2C%3C%3D%2C%3E%2C%3E%3D">http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ConditionalOperators%3A%3C%2C%3C%3D%2C%3E%2C%3E%3D</a><br />
<br />
1 ) . 大于，小于，大于或等于，小于或等于<br />
<br />
$gt:大于<br />
$lt:小于<br />
$gte:大于或等于<br />
$lte:小于或等于<br />
<br />
例子：<br />
<br />
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.collection.find({ <span class="code-quote">"field"</span> : { $gt: value } } );   <span class="code-comment">// greater than  : field &gt; value<br />
</span>db.collection.find({ <span class="code-quote">"field"</span> : { $lt: value } } );   <span class="code-comment">// less than  :  field &lt; value<br />
</span>db.collection.find({ <span class="code-quote">"field"</span> : { $gte: value } } );  <span class="code-comment">// greater than or equal to : field &gt;= value<br />
</span>db.collection.find({ <span class="code-quote">"field"</span> : { $lte: value } } );  <span class="code-comment">// less than or equal to : field &lt;= value</span></pre>
</div>
</div>
<p>如查询j大于3,小于4:</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find({j : {$lt: 3}});<br />
db.things.find({j : {$gte: 4}});</pre>
</div>
</div>
<p>也可以合并在一条语句内:</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.collection.find({ <span class="code-quote">"field"</span> : { $gt: value1, $lt: value2 } } );    <span class="code-comment">// value1 &lt; field &lt; value</span></pre>
</div>
</div>
<p> </p>
<p> </p>
<p>2) 不等于 $ne</p>
<p>例子：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { x : { $ne : 3 } } );</pre>
</div>
</div>
<p> </p>
<p> </p>
<br />
<br />
3) in 和 not in ($in $nin)<br />
<br />
语法：<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.collection.find( { <span class="code-quote">"field"</span> : { $in : array } } );</pre>
</div>
</div>
<p>例子：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find({j:{$in: [2,4,6]}});</pre>
</div>
</div>
<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find({j:{$nin: [2,4,6]}});</pre>
</div>
</div>
<br />
<br />
<br />
4) 取模运算$mod<br />
<br />
如下面的运算：<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( <span class="code-quote">"<span class="code-keyword">this</span>.a % 10 == 1"</span>)</pre>
</div>
</div>
<p>可用$mod代替：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a : { $mod : [ 10 , 1 ] } } )</pre>
</div>
</div>
<br />
<br />
<br />
5)&nbsp; $all<br />
<br />
$all和$in类似，但是他需要匹配条件内所有的值：<br />
<br />
如有一个对象：<br />
<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">{ a: [ 1, 2, 3 ] }</pre>
</div>
</div>
<p>下面这个条件是可以匹配的：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a: { $all: [ 2, 3 ] } } );</pre>
</div>
</div>
<p>但是下面这个条件就不行了：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a: { $all: [ 2, 3, 4 ] } } );</pre>
</div>
</div>
<br />
<br />
6)&nbsp; $size<br />
<br />
$size是匹配数组内的元素数量的，如有一个对象：{<tt>a:["foo"]</tt>}，他只有一个元素：<br />
<br />
下面的语句就可以匹配：
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a : { $size: 1 } } );</pre>
</div>
</div>
<p>官网上说不能用来匹配一个范围内的元素，如果想找$size&lt;5之类的，他们建议创建一个字段来保存元素的数量。</p>
<p>You cannot use <tt>$size</tt> to find a range of sizes (for example:  arrays with more than 1 element).  If you need to query for a range,  create an extra <tt>size</tt> field that you increment when you add  elements.</p>
<p> </p>
<p>7）$exists</p>
<p>$exists用来判断一个元素是否存在：</p>
<p>如：</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a : { $exists : <span class="code-keyword">true</span> } } ); <span class="code-comment">// <span class="code-keyword">如果存在</span></span><span class="code-comment"><span class="code-keyword">元素</span></span><span class="code-comment"><span class="code-keyword">a,就返回</span><br />
</span>db.things.find( { a : { $exists : <span class="code-keyword">false</span> } } ); <span class="code-comment">// <span class="code-keyword">如果不存在元素a，就返回</span></span></pre>
</div>
</div>
<br />
<br />
8)&nbsp; $type<br />
<br />
<p><tt>$type</tt> 基于 <a href="http://bsonspec.org/">bson</a> type来匹配一个元素的类型，像是按照类型ID来匹配，不过我没找到bson类型和id对照表。</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a : { $type : 2 } } ); <span class="code-comment">// matches <span class="code-keyword">if</span> a is a string<br />
</span>db.things.find( { a : { $type : 16 } } ); <span class="code-comment">// matches <span class="code-keyword">if</span> a is an <span class="code-object">int</span></span></pre>
</div>
</div>
<br />
9）正则表达式<br />
<br />
mongo支持正则表达式，如：<br />
<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.customers.find( { name : /acme.*corp/i } ); // 后面的i的意思是区分大小写</pre>
</div>
</div>
<br />
<br />
10)&nbsp; 查询数据内的值<br />
<br />
下面的查询是查询colors内red的记录，如果colors元素是一个数据,数据库将遍历这个数组的元素来查询。
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { colors : <span class="code-quote">"red"</span> } );</pre>
</div>
</div>
<br />
<br />
11) $elemMatch<br />
<br />
如果对象有一个元素是数组，那么$elemMatch可以匹配内数组内的元素：<br />
<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">&gt; t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )&nbsp;<br />
{ <span class="code-quote">"_id"</span> : ObjectId(<span class="code-quote">"4b5783300334000000000aa9"</span>),  <span class="code-quote"><br />
"x"</span> : [ { <span class="code-quote">"a"</span> : 1, <span class="code-quote">"b"</span> : 3 }, 7, { <span class="code-quote">"b"</span> : 99 }, { <span class="code-quote">"a"</span> : 11 } ]<br />
}</pre>
</div>
</div>
<pre class="code-java">$elemMatch : { a : 1, b : { $gt : 1 } } 所有的条件都要匹配上才行。</pre>
<p>注意，上面的语句和下面是不一样的。</p>
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">&gt; t.find( { <span class="code-quote">"x.a"</span> : 1, <span class="code-quote">"x.b"</span> : { $gt : 1 } } )</pre>
</div>
</div>
<br />
$elemMatch是匹配{ <span class="code-quote">"a"</span> : 1, <span class="code-quote">"b"</span> : 3 }，而后面一句是匹配{ <span class="code-quote">"b"</span> : 99 }, { <span class="code-quote">"a"</span> : 11 } <br />
<br />
<br />
12)&nbsp; 查询嵌入对象的值<br />
<br />
<div style="border-width: 1px;" class="code panel">
<div class="codeContent panelContent">
<pre class="code-java">db.postings.find( { <span class="code-quote">"author.name"</span> : <span class="code-quote">"joe"</span> } );</pre>
</div>
</div>
<p>注意用法是<span class="code-quote">author.name</span>，用一个点就行了。更详细的可以看这个链接： <a title="Dot Notation (Reaching into Objects)" href="http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29">dot notation</a></p>
<p>举个例子：</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">&gt; db.blog.save({ title : <span class="code-quote">"My First Post"</span>, author: {name : <span class="code-quote">"Jane"</span>, id : 1}})</pre>
</div>
</div>
<p>如果我们要查询 authors name 是Jane的, 我们可以这样：</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">&gt; db.blog.findOne({<span class="code-quote">"author.name"</span> : <span class="code-quote">"Jane"</span>})</pre>
</div>
</div>
<p>如果不用点，那就需要用下面这句才能匹配：</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.blog.findOne({<span class="code-quote">"author"</span> : {<span class="code-quote">"name"</span> : <span class="code-quote">"Jane"</span>, <span class="code-quote">"id"</span> : 1}})</pre>
</div>
</div>
<p>下面这句：</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.blog.findOne({<span class="code-quote">"author"</span> : {<span class="code-quote">"name"</span> : <span class="code-quote">"Jane"</span>}})</pre>
</div>
</div>
<p>是不能匹配的，因为mongodb对于子对象，他是精确匹配。</p>
<p> </p>
<p>13) 元操作符 $not 取反</p>
<p>如：</p>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.customers.find( { name : { $not : /acme.*corp/i } } );</pre>
</div>
</div>
<div class="code panel" style="border-width: 1px;">
<div class="codeContent panelContent">
<pre class="code-java">db.things.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );</pre>
</div>
</div>
<h3> </h3>
mongodb还有很多函数可以用，<tt>如排序，统计等，请参考原文。<br />
<br />
mongodb目前没有或(or)操作符，只能用变通的办法代替，可以参考下面的链接：<br />
<br />
<a href="http://www.mongodb.org/display/DOCS/OR+operations+in+query+expressions" target="_blank">http://www.mongodb.org/display/DOCS/OR+operations+in+query+expressions</a></tt><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/341263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-21 17:47 <a href="http://www.blogjava.net/ashutc/archive/2010/12/21/341263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb python</title><link>http://www.blogjava.net/ashutc/archive/2010/12/20/341163.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 20 Dec 2010 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/20/341163.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/341163.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/20/341163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/341163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/341163.html</trackback:ping><description><![CDATA[<a href="http://www.mongodb.org/" target="_blank">http://www.mongodb.org</a> 下载mongodb版本<br />
<br />
安装pymongo模块。<a href="http://api.mongodb.org/python/" target="_blank">http://api.mongodb.org/python/</a><br />
按照版本安装相应模块。自动默认到python安装目录<br />
<pre>
<div><span style="color: #008000;">#</span><span style="color: #008000;">coding=utf-8</span><span style="color: #008000;"><br />
<br />
</span><span style="color: #0000ff;">from</span><span style="color: #000000;"> pymongo </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> Connection<br />
<br />
conn </span><span style="color: #000000;">=</span><span style="color: #000000;"> Connection(</span><span style="color: #800000;">"</span><span style="color: #800000;">localhost</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
<br />
db </span><span style="color: #000000;">=</span><span style="color: #000000;"> conn.foo<br />
<br />
test </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #800000;">"</span><span style="color: #800000;">id</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">1</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">novle</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"测试一下</span><span style="color: #800000;">"</span><span style="color: #000000;">}<br />
<br />
db.foo.save(test)<br />
<br />
cursor </span><span style="color: #000000;">=</span><span style="color: #000000;"> db.foo.find()<br />
<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;"> i </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> cursor:<br />
<br />
</span><span style="color: #0000ff;">print</span><span style="color: #000000;"> i</span></div>
<br />
</pre>
<p>虽然报错，不影响执行<br />
</p>
<p>out</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>
<div><span style="color: #000000;">{u</span><span style="color: #800000;">'</span><span style="color: #800000;">_id</span><span style="color: #800000;">'</span><span style="color: #000000;">: ObjectId(</span><span style="color: #800000;">'</span><span style="color: #800000;">4bc193c11724bc0cc4000000</span><span style="color: #800000;">'</span><span style="color: #000000;">), u</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span><span style="color: #000000;">: </span><span style="color: #000000;">1</span><span style="color: #000000;">, u</span><span style="color: #800000;">'</span><span style="color: #800000;">novle</span><span style="color: #800000;">'</span><span style="color: #000000;">: u</span><span style="color: #800000;">'</span><span style="color: #800000;">\ufffd\ufffd\ufffd\ufffd</span><span style="color: #800000;">'</span><span style="color: #000000;">}<br />
<br />
</span></div>
<br />
</pre>
</div>
<p>&nbsp;</p>
<p>OK 测试成功</p>
<p>&nbsp;</p>
<p>下次 &nbsp;就是讲 怎么在DJANGO里面 使用mongodb了</p>
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/341163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-20 14:32 <a href="http://www.blogjava.net/ashutc/archive/2010/12/20/341163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB入门简介</title><link>http://www.blogjava.net/ashutc/archive/2010/12/20/341161.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 20 Dec 2010 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/20/341161.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/341161.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/20/341161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/341161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/341161.html</trackback:ping><description><![CDATA[<br />
<p>MongoDB把数据存储在文件中（默认路径为：/data/db），为提高效率使用内存映射文件进行管理。</p>
<p>安装：<br />
Linux/OS X下:<br />
1 建立数据目录<br />
&nbsp;mkdir -p /data/db<br />
2 下载压缩包<br />
&nbsp;curl -O <a href="http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz">http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz</a><br />
3 解压缩文件<br />
&nbsp;tar xzf mongodb-linux-i386-latest.tgz<br />
4 启动服务<br />
&nbsp;bin/mongod run &amp;<br />
5 使用自带客户端连接<br />
&nbsp;/bin/mongo<br />
6 测试<br />
&nbsp;db.foo.save( { a : 1 } )<br />
&nbsp;db.foo.findOne()</p>
<p>windows下：<br />
1 建立数据目录c:\data\db<br />
2 下载压缩包，解压文件<br />
3 启动服务<br />
&nbsp;bin\mongod.exe run<br />
4 自带客户端<br />
&nbsp;bin\mongon.exe</p>
<p>在LINUX和WINDOWS系统下的使用大同小异，不同的地方主要是默认的数据存储目录。LINUX类系统下存放在/data/db下，而WINDOWS</p>
<p>会存放在C:\data\db下。可以在启动时使用--dbpath参数指定存储目录并启动。如：bin\mongod.exe --dbpath d:\data\mongo</p>
<p>常用启动参数：<br />
run 直接启动。例：./mongod run<br />
--dbpath 指定特定存储目录启动，若目录不存在则创建。例：./mongod --dbpath /var/data/mongo<br />
--port 指定端口启动。例：./mongod --port 12345</p>
<p>停止MONGO服务：<br />
方法1：服务端停止，可使用Ctrl+C<br />
方法2：在客户端停止，可先连接客户端<br />
&nbsp;./mongo<br />
&nbsp;并使用命令<br />
&nbsp;db.shutdownerver()<br />
&nbsp;然后退出客户端<br />
&nbsp;exit</p>
<p>使用JAVA语言操作MONGODB非常简单，只要将驱动文件加入到CLASSPATH中就可以使用。</p>
<p>1 建立连接<br />
&nbsp; 要建立MongoDB的连接，你只要指定要连接到的数据库就可以。这个数据库不一定存在，如果不存在，MongoDB会先为你建立这个</p>
<p>库。同时，在连接时你也可以具体指定要连接到的网络地址和端口。下面的是连接本机数据库的一些例子：</p>
<p>import com.mongodb.Mongo;<br />
import com.mongodb.DBCollection;<br />
import com.mongodb.BasicDBObject;<br />
import com.mongodb.DBObject;<br />
import com.mongodb.DBCursor;<br />
import com.mongodb.MongoAdmin;</p>
<p>Mongo db = new Mongo("mydb");<br />
Mongo db = new Mongo("localhost", "mydb");<br />
Mongo db = new Mongo("localhost", 27017, "mydb");</p>
<p>2 安全验证（非必选）<br />
MongoDB服务可以在安全模式运行，此时任何客户端要连接数据库时需使用用户名和密码。在JAVA中可使用如下方法连接：</p>
<p>boolean auth = db.authenticate(userName, password);</p>
<p>如果用户名密码验证通过，返回值为true，否则为false</p>
<p>3 获取集合列表<br />
每个数据库都存在零个或多个集合，需要时你可以获得他们的列表：</p>
<p>Set&lt;String&gt; colls = db.getCollectionNames();<br />
for(String s : colls){<br />
&nbsp;System.out.println(s);<br />
}</p>
<p>4 获得一个集合<br />
要获得某个特定集合，你可以指定集合的名字，并使用getCollection()方法：</p>
<p>DBCollection coll = db.getCollection("testCollection");</p>
<p>当你获取了这个集合对象，你就可以对数据进行增删查改之类的操作。</p>
<p>5 插入文档<br />
当你获得了一个集合对象，你就可以把文档插入到这个对象中。例如，存在一个JSON式的小文档：<br />
{<br />
&nbsp;"name" : "MongoDB",<br />
&nbsp;"type" : "database",<br />
&nbsp;"count" : 1,<br />
&nbsp;"info" : {<br />
&nbsp;&nbsp;&nbsp;x : 203,<br />
&nbsp;&nbsp;&nbsp;y : 102<br />
&nbsp;&nbsp;}<br />
}<br />
请注意，这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档，并且使用insert()方法方便地将它插入到集</p>
<p>合中。</p>
<p>BasicDBObject doc = new BasicDBObject();<br />
doc.put("name", "MongoDB");<br />
doc.put("type", "database");<br />
doc.put("count", 1);</p>
<p>BasicDBObject info = new BasicDBObject();<br />
info.put("x", 203);<br />
info.put("y", 102);</p>
<p>doc.put("info", info);</p>
<p>coll.insert(doc);</p>
<p>6 使用findOne()查找集合中第一个文档<br />
要查找我们上一步插入的那个文档，可以简单地使用findOne()操作来获取集合中第一个文档。这个方法返回一个单一文档（这是相对于使用DBCursor的find()操作的返回），这对于只有一个文档或我们刚插入第一个文档时很有用，因为此时并不需要使用光标。</p>
<p>DBObject myDoc = coll.findOne();<br />
System.out.println(myDoc);</p>
<p>返回类似：<br />
{<br />
&nbsp;"_id" : "ac907a1f5b9d5e4a233ed300" ,<br />
&nbsp;"name" : "MongoDB" ,<br />
&nbsp;"type" : 1 , <br />
&nbsp;"info" : { <br />
&nbsp;&nbsp;"x" : 203 ,<br />
&nbsp;&nbsp;"y" : 102} , <br />
&nbsp;"_ns" : "testCollection"<br />
}</p>
<p>注意_id和_ns元素是由MongoDB自动加入你的文档。记住：MongoDB内部存储使用的元素名是以&#8220;_&#8221;做为开始。</p>
<p>7 加入多种文档<br />
为了做更多有趣的查询试验，让我们向集合中加入多种文档类型，象：<br />
{<br />
&nbsp;"i" : value<br />
}<br />
可以通过循环来实现</p>
<p>for(int i = 0; i &lt; 100; i++){<br />
&nbsp;coll.insert(new BasicDBObject().append("i", i));<br />
}</p>
<p>注意我们可以在一个集合中插入不同类型的文档，这就是我们所说的&#8220;模式自由&#8221;（schema-free）。</p>
<p>8 统计文档数量<br />
&nbsp;使用getCount()方法</p>
<p>System.out.println(coll.getCount());</p>
<p>9 使用光标（cursor）来获取全部文档<br />
为了获取集合中的所有文档，我们可以使用find()方法。这个方法返回一上DBCursor对象，来允许我们将符合查询条件的文档迭代</p>
<p>出来。</p>
<p>DBCursor cur = coll.find();<br />
while(cur.hasNext()){<br />
&nbsp;System.out.println(cur.next());<br />
}</p>
<p>10 在查询中获取单一文档<br />
我们可以创建一个查询，并传递给find()方法来获取集合中所有文档的一个子集。例如，我们想要查询域名为"i"，并且值为71的文档：</p>
<p>BasicDBObject query = new BasicDBObject();<br />
query.put("i", 71);<br />
cur = coll.find(query);<br />
while(cur.hasNext()){<br />
&nbsp;System.out.println(cur.next());<br />
}</p>
<p>11 使用条件查询获取集合<br />
例如，我们想要查询所有i&gt;50的文档：</p>
<p>BasicDBObject query = new BasicDBObject();<br />
query.put("i", new BasicDBObject("$gt", 50));<br />
cur = coll.find(query);<br />
while(cur.hasNext()){<br />
&nbsp;System.out.println(cur.next());<br />
}</p>
<p>当然，我们也可以做20 &lt; i &lt;= 30的查询</p>
<p>BasicDBObject query = new BasicDBObject();<br />
query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30));<br />
cur = coll.find(query);<br />
while(cur.hasNext()){<br />
&nbsp;System.out.println(cur.next());<br />
}</p>
<p>12 创建索引<br />
MongoDB支持索引，而且很容易在集合上增加索引。要创建索引，只需要指定要加索引的属性，并且指定升序（1）或降序即可（-1）。</p>
<p>coll.createIndex(new BasicDBObject("i", 1));</p>
<p>13 获取索引列表</p>
<p>List&lt;DBObject&gt; list = coll.getIndexInfo();<br />
for(DBObject o : list){<br />
&nbsp;System.out.println(o);<br />
}</p>
<p>14 MongoDB管理函数<br />
管理函数在com.mongodb.MongoAdmin类中定义。<br />
例A：获取数据库列表<br />
&nbsp;MongoAdmin admin = new MongoAdmin();<br />
&nbsp;for(String s : admin.getDatabaseNames()){<br />
&nbsp;&nbsp;System.out.println(s);<br />
&nbsp;}</p>
<p>例B：获取数据库对象<br />
&nbsp;Mongo m = admin.getDB("mydb");</p>
<p>例C：删除数据库<br />
&nbsp;admin.dropDatabase("mydb");</p>
<p>15 用DBObject存储JAVA对象<br />
MongoDB for JAVA驱动中提供了用于向数据库中存储普通对象的接口DBObject<br />
例如，存在一个需要存储的对象类Tweet<br />
public class Tweet implements DBObject{<br />
&nbsp;/*...*/<br />
}<br />
可以使用如下代码：</p>
<p>Tweet myTweet = new Tweet();<br />
myTweet.put("user", userId);<br />
myTweet.put("message", message);<br />
myTweet.put("date", new Date());</p>
<p>collection.insert(myTweet);</p>
<p>当一个文档从MongoDB中取出时，它会自动把文档转换成DBObject接口类型，要将它实例化为你的对象，需使用</p>
<p>DBCollection.setObjectClass()。<br />
collection.setObjectClass(Tweet);<br />
Tweet myTweet = (Tweet)collection.findOne();</p>
<p>16 JAVA驱动的并发性<br />
JAVA的MongoDB驱动是线程安全的。如果你将它用在WEB服务中，可以创建它的一个单例，并在所有请求中使用它。</p>
<p>然而，如果你需要在一个会话（例如HTTP请求）中保证事务一致性，也许你会希望在这个会话中对驱动使用同一个端口。这仅仅在</p>
<p>请求量非常大的环境中，例如你经常会读取刚写入的数据。<br />
为了这一点，你需要使用如下代码：<br />
Mongo m;<br />
m.restartStart();</p>
<p>// code.........</p>
<p>m.requestDone();</p>
<p><br />
以上介绍了简单的mongoDB使用，更多信息请查阅MongoDB API for Java。</p>
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/341161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-20 14:28 <a href="http://www.blogjava.net/ashutc/archive/2010/12/20/341161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDb 命令</title><link>http://www.blogjava.net/ashutc/archive/2010/12/20/341160.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 20 Dec 2010 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/20/341160.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/341160.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/20/341160.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/341160.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/341160.html</trackback:ping><description><![CDATA[查询所有数据库列表<br />
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; show dbs</code><br />
如果想查看当前连接在哪个数据库下面，可以直接输入db
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; db<br />
Admin</code>想切换到test数据库下面
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; use test<br />
switched to db test<br />
&gt; db<br />
Test</code>想查看test下有哪些表或者叫collection，可以输入
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; show collections<br />
system.indexes<br />
user</code>想知道mongodb支持哪些命令，可以直接输入help
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; help<br />
HELP<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>show dbs&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>show database names<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>show collections&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> show collections in current database<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>show users&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> show users in current database<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>show profile&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>show most recent system.profile entries with time &gt;= 1ms<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>use &lt;db name&gt;&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> set curent database to &lt;db name&gt;<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.help()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>help on DB methods<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.help()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> help on collection methods<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> list objects in collection foo<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find( { a : 1 } )&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>list objects in foo where a == 1<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>it&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>result of the last line evaluated; use to further iterate</code>如果想知道当前数据库支持哪些方法：
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; db.help();<br />
DB methods:<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.addUser(username, password) 添加数据库授权用户<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.auth(username, password)&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> 访问认证<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.cloneDatabase(fromhost) 克隆数据库<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.commandHelp(name) returns the help for the command<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.copyDatabase(fromdb, todb, fromhost)&nbsp;<wbr>&nbsp;<wbr>复制数据库<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.createCollection(name, { size : ..., capped : ..., max : ... } ) 创建表<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.currentOp() displays the current operation in the db<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.dropDatabase()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>删除当前数据库<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.eval_r(func, args) run code server-side<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getCollection(cname) same as db['cname'] or db.cname<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getCollectionNames()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>获取当前数据库的表名<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getLastError() - just returns the err msg string<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getLastErrorObj() - return full status object<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getMongo() get the server connection object<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getName()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getPrevError()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getProfilingLevel()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getReplicationInfo()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.getSisterDB(name) get the db at the same server as this onew<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.killOp() kills the current operation in the db<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.printCollectionStats()&nbsp;<wbr> &nbsp;<wbr>打印各表的状态信息<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.printReplicationInfo()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>打印主数据库的复制状态信息<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.printSlaveReplicationInfo()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>打印从数据库的复制状态信息<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.printShardingStatus()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> 打印分片状态信息<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.removeUser(username) 删除数据库用户<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.repairDatabase() 修复数据库<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.resetError()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.runCommand(cmdObj) run a database command.&nbsp;<wbr>&nbsp;<wbr>if cmdObj is a string, turns it into { cmdObj : 1 }<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.setProfilingLevel(level) 0=off 1=slow 2=all<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.shutdownServer()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.version() current version of the server</code>如果想知道当前数据库下的表或者表collection支持哪些方法，可以使用一下命令如：
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; db.user.help();&nbsp;<wbr>&nbsp;<wbr>user为表名<br />
DBCollection help<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.count()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> 统计表的行数<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.dataSize()&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>统计表数据的大小<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.distinct( key ) - eg. db.foo.distinct( 'x' )&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> 按照给定的条件除重<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.drop() drop the collection 删除表<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.dropIndex(name)&nbsp;<wbr>&nbsp;<wbr>删除指定索引<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.dropIndexes() 删除所有索引<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups&nbsp;<wbr>&nbsp;<wbr>增加索引<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find( [query] , [fields]) -
first parameter is an optional query filter. second parameter is
optional set of fields to return. 根据条件查找数据<br />
-----------------------<br />
<wbr>通过条件查询： db.foo.find( { x : 77 } , { name : 1 , x : 1 } )<br />
-----------------------------<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find(...).count()<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find(...).limit(n) 根据条件查找数据并返回指定记录数<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find(...).skip(n)<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.find(...).sort(...) 查找排序<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.findOne([query]) 根据条件查询只查询一条数据<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.getDB() get DB object associated with collection&nbsp;<wbr>&nbsp;<wbr>返回表所属的库<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.getIndexes() 显示表的所有索引<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) 根据条件分组<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.mapReduce( mapFunction , reduceFunction , &lt;optional params&gt; )<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.remove(query) 根据条件删除数据<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.renameCollection( newName ) renames the collection&nbsp;<wbr>&nbsp;<wbr>重命名表<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.save(obj) 保存数据<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.stats()&nbsp;<wbr>&nbsp;<wbr>查看表的状态<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.storageSize() - includes free space allocated to this collection 查询分配到表空间大小<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.totalIndexSize() - size in bytes of all the indexes 查询所有索引的大小<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.totalSize() - storage allocated for all data and indexes 查询表的总大小<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.update(query, object[, upsert_bool]) 根据条件更新数据<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.validate() - SLOW 验证表的详细信息<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>db.foo.getShardVersion() - only for use with sharding</code>Mongodb的备份工具mongodump<br />
<br />
如果想备份数据库test 如：
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">[falcon@www.fwphp.cn&nbsp;<wbr>&nbsp;<wbr>~/mongodb/bin]$ ./mongodump --help<br />
options:<br />
<wbr>&nbsp;<wbr>--help&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> produce help message<br />
<wbr>&nbsp;<wbr>-h [ --host ] arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>mongo host to connect to<br />
<wbr>&nbsp;<wbr>-d [ --db ] arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> database to use<br />
<wbr>&nbsp;<wbr>-c [ --collection ] arg&nbsp;<wbr>&nbsp;<wbr>collection to use (some commands)<br />
<wbr>&nbsp;<wbr>-u [ --username ] arg&nbsp;<wbr> &nbsp;<wbr> username<br />
<wbr>&nbsp;<wbr>-p [ --password ] arg&nbsp;<wbr> &nbsp;<wbr> password<br />
<wbr>&nbsp;<wbr>--dbpath arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> directly access mongod data files in this path,<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>instead of connecting to a mongod instance<br />
<wbr>&nbsp;<wbr>-v [ --verbose ]&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>be more verbose (include multiple times for more<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>verbosity e.g. -vvvvv)<br />
<wbr>&nbsp;<wbr>-o [ --out ] arg (=dump) output directory<br />
[falcon@www.fwphp.cn&nbsp;<wbr>&nbsp;<wbr>~/mongodb/bin]$ [color=Blue]./mongodump -d test -o test/[/color]<br />
connected to: 127.0.0.1<br />
DATABASE: test&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>to&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>test/test<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>test.user to test/test/user.bson<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>100000 objects<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>test.system.indexes to test/test/system.indexes.bson<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>1 objects<br />
[falcon@www.fwphp.cn&nbsp;<wbr>&nbsp;<wbr>~/mongodb/bin]$ ls<br />
2&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>mongo&nbsp;<wbr> &nbsp;<wbr>mongodump&nbsp;<wbr> &nbsp;<wbr> mongofiles&nbsp;<wbr> &nbsp;<wbr>mongorestore&nbsp;<wbr>&nbsp;<wbr>mongosniff<br />
dump&nbsp;<wbr>&nbsp;<wbr>mongod&nbsp;<wbr>&nbsp;<wbr>mongoexport&nbsp;<wbr>&nbsp;<wbr>mongoimport&nbsp;<wbr>&nbsp;<wbr>mongos&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>test</code>MongoDB的数据恢复工具mongorestore<br />
<br />
查看test库中的表
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; show collections<br />
system.indexes<br />
User</code>删除user表
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; db.user.drop();<br />
True<br />
<br />
&gt; show collections<br />
System.indexes</code>现在利用mongorestore表恢复刚才利用mongodump备份的数据
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">[falcon@www.fwphp.cn&nbsp;<wbr>&nbsp;<wbr>~/mongodb/bin]$ ./mongorestore --help<br />
usage: ./mongorestore [options] [directory or filename to restore from]<br />
options:<br />
<wbr>&nbsp;<wbr>--help&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>produce help message<br />
<wbr>&nbsp;<wbr>-h [ --host ] arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> mongo host to connect to<br />
<wbr>&nbsp;<wbr>-d [ --db ] arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>database to use<br />
<wbr>&nbsp;<wbr>-c [ --collection ] arg collection to use (some commands)<br />
<wbr>&nbsp;<wbr>-u [ --username ] arg&nbsp;<wbr> &nbsp;<wbr>username<br />
<wbr>&nbsp;<wbr>-p [ --password ] arg&nbsp;<wbr> &nbsp;<wbr>password<br />
<wbr>&nbsp;<wbr>--dbpath arg&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>directly access mongod data files in this path,<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>instead of connecting to a mongod instance<br />
<wbr>&nbsp;<wbr>-v [ --verbose ]&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>be more verbose (include multiple times for more<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>verbosity e.g. -vvvvv)<br />
<br />
[falcon@www.fwphp.cn&nbsp;<wbr>&nbsp;<wbr>~/mongodb/bin]$ ./mongorestore -d test -c user test/test/user.bson<br />
connected to: 127.0.0.1<br />
test/test/user.bson<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>going into namespace [test.user]<br />
<br />
<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>100000 objects</code>User表中的10w条记录已经恢复
<p style="margin: 1em 1em 0px; font-weight: bold;">CODE:</p>
<code style="border: 1px solid #cccccc; padding: 0.5em; margin: 0px 1em 1em; display: block; font: 12px/1.8em Courier,monospace;">&gt; show collections<br />
system.indexes<br />
user<br />
&gt; db.user.find();<br />
{ "_id" : ObjectId("4b9c8db08ead0e3347000000<wbr>"), "uid" : 1, "username" : "Falcon.C-1" }<br />
{ "_id" : ObjectId("4b9c8db08ead0e3347010000<wbr>"), "uid" : 2, "username" : "Falcon.C-2" }<br />
{ "_id" : ObjectId("4b9c8db08ead0e3347020000<wbr>"), "uid" : 3, "username" : "Falcon.C-3" }<br />
{ "_id" : ObjectId("4b9c8db08ead0e3347030000<wbr>"), "uid" : 4, "username" : "Falcon.C-4" }<br />
{ "_id" : ObjectId("4b9c8db08ead0e3347040000<wbr>"), "uid" : 5, "username" : "Falcon.C-5" }<br />
.................<br />
has more<br />
<br />
</code><br />
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;超级用户相关：</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;"> #增加或修改用户密码<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;"> db.addUser(</span><span style="color: #000000;">'</span><span style="color: #000000;">admin</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">pwd</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;"> #查看用户列表<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.system.users.find()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#用户认证<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.auth(</span><span style="color: #000000;">'</span><span style="color: #000000;">admin</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">pwd</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">#删除用户<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.removeUser(</span><span style="color: #000000;">'</span><span style="color: #000000;">mongodb</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看所有用户<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">show&nbsp;users<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看所有数据库<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">show&nbsp;dbs<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看所有的collection<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">show&nbsp;collections<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看各collection的状态<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.printCollectionStats()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看主从复制状态<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.printReplicationInfo()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#修复数据库<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.repairDatabase()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#设置记录profiling，</span><span style="color: #000000;">0</span><span style="color: #000000;">=</span><span style="color: #000000;">off&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">=</span><span style="color: #000000;">slow&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">=</span><span style="color: #000000;">all<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.setProfilingLevel(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看profiling<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">show&nbsp;profile<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#拷贝数据库<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.copyDatabase(</span><span style="color: #000000;">'</span><span style="color: #000000;">mail_addr</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">mail_addr_tmp</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#删除collection<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.mail_addr.drop()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#删除当前的数据库<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.dropDatabase()<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;客户端连接<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">local</span><span style="color: #000000;">/</span><span style="color: #000000;">mongodb</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">mongo&nbsp;user_addr&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">u&nbsp;user&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">pwd</span><span style="color: #000000;">'</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;增删改<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;"> #存储嵌套的对象<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.save({</span><span style="color: #000000;">'</span><span style="color: #000000;">name</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">ysz</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">address</span><span style="color: #000000;">'</span><span style="color: #000000;">:{</span><span style="color: #000000;">'</span><span style="color: #000000;">city</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">beijing</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">post</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">100096</span><span style="color: #000000;">},</span><span style="color: #000000;">'</span><span style="color: #000000;">phone</span><span style="color: #000000;">'</span><span style="color: #000000;">:[</span><span style="color: #000000;">138</span><span style="color: #000000;">,</span><span style="color: #000000;">139</span><span style="color: #000000;">]})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#存储数组对象<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.user_addr.save({</span><span style="color: #000000;">'</span><span style="color: #000000;">Uid</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">yushunzhi@sohu.com</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">Al</span><span style="color: #000000;">'</span><span style="color: #000000;">:[</span><span style="color: #000000;">'</span><span style="color: #000000;">test-1@sohu.com</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">test-2@sohu.com</span><span style="color: #000000;">'</span><span style="color: #000000;">]})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#根据query条件修改，如果不存在则插入，允许修改多条记录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.update({</span><span style="color: #000000;">'</span><span style="color: #000000;">yy</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">5</span><span style="color: #000000;">},{</span><span style="color: #000000;">'</span><span style="color: #000000;">$set</span><span style="color: #000000;">'</span><span style="color: #000000;">:{</span><span style="color: #000000;">'</span><span style="color: #000000;">xx</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">2</span><span style="color: #000000;">}},upsert</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,multi</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#删除yy</span><span style="color: #000000;">=</span><span style="color: #000000;">5的记录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.remove({</span><span style="color: #000000;">'</span><span style="color: #000000;">yy</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">5</span><span style="color: #000000;">})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#删除所有的记录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.remove()<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;索引<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">增加索引：</span><span style="color: #000000;">1</span><span style="color: #000000;">(ascending),</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">(descending)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.things.ensureIndex({firstname:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;lastname:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">},&nbsp;{unique:&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#索引子对象<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.user_addr.ensureIndex({</span><span style="color: #000000;">'</span><span style="color: #000000;">Al.Em</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看索引信息<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.getIndexes()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.getIndexKeys()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#根据索引名删除索引<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.user_addr.dropIndex(</span><span style="color: #000000;">'</span><span style="color: #000000;">Al.Em_1</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;查询<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">查找所有<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.find()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查找一条记录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.findOne()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#根据条件检索10条记录<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">msg</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">Hello&nbsp;1</span><span style="color: #000000;">'</span><span style="color: #000000;">}).limit(</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#sort排序<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">From</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">yushunzhi@sohu.com</span><span style="color: #000000;">'</span><span style="color: #000000;">}).sort({</span><span style="color: #000000;">'</span><span style="color: #000000;">Dt</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.find().sort({</span><span style="color: #000000;">'</span><span style="color: #000000;">Ct</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">}).limit(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#count操作<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.user_addr.count()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#distinct操作<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.distinct(</span><span style="color: #000000;">'</span><span style="color: #000000;">msg</span><span style="color: #000000;">'</span><span style="color: #000000;">)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">操作<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.find({</span><span style="color: #000000;">"</span><span style="color: #000000;">timestamp</span><span style="color: #000000;">"</span><span style="color: #000000;">:&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">$gte</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">}})<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#子对象的查找<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.foo.find({</span><span style="color: #000000;">'</span><span style="color: #000000;">address.city</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;">'</span><span style="color: #000000;">beijing</span><span style="color: #000000;">'</span><span style="color: #000000;">})<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;管理<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">查看collection数据的大小<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.dataSize()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查看colleciont状态<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.stats()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">#查询所有索引的大小<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">db.deliver_status.totalIndexSize()<br />
<br />
<br />
<br />
<br />
<br />
<br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/341160.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-20 14:25 <a href="http://www.blogjava.net/ashutc/archive/2010/12/20/341160.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java23种设计模式（代码版转）</title><link>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 14 Dec 2010 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/340667.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/340667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/340667.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;package&nbsp;&nbsp;&nbsp;lq.test;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;impor...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/340667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-14 17:03 <a href="http://www.blogjava.net/ashutc/archive/2010/12/14/340667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux常用命令</title><link>http://www.blogjava.net/ashutc/archive/2010/12/08/340053.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 08 Dec 2010 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/12/08/340053.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/340053.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/12/08/340053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/340053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/340053.html</trackback:ping><description><![CDATA[<br />
<br />
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><span lang="EN-US"><span>1、<span style="font: 7pt &quot;Times New Roman&quot;;">&nbsp; </span></span></span><span style="font-family: 宋体;">基本命令：</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">cd</span><span style="font-family: 宋体;">：进入目录</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">pwd</span><span style="font-family: 宋体;">：显示当前路径</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">ls</span><span style="font-family: 宋体;">：列出目录下的文件和目录。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">cp</span><span style="font-family: 宋体;">：复制文件或目录</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">touch</span><span style="font-family: 宋体;">：新建文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">vi</span><span style="font-family: 宋体;">：编辑文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">mkdir</span><span style="font-family: 宋体;">：新建目录</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">rm</span><span style="font-family: 宋体;">：删除文件或目录</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">mv</span><span style="font-family: 宋体;">：移动文件或目录</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">ln</span><span style="font-family: 宋体;">：添加软连</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">cat</span><span style="font-family: 宋体;">：从头到尾的顺序显示整个文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">tac</span><span style="font-family: 宋体;">：从尾到头的顺序显示文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">more</span><span style="font-family: 宋体;">：按屏显示文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">less</span><span style="font-family: 宋体;">：安屏显示文件，显示过程中可以上下查看</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">ps</span><span style="font-family: 宋体;">：显示当前运行的进程信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">su</span><span style="font-family: 宋体;">：改变登录用户</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">chmod</span><span style="font-family: 宋体;">：对目录或文件授权</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">chown</span><span style="font-family: 宋体;">：修改文件或目录的属主</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">chgrp</span><span style="font-family: 宋体;">：修改文件或目录的属组</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">which</span><span style="font-family: 宋体;">：显示命令的完整路径</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">grep</span><span style="font-family: 宋体;">：选择匹配条件的行</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">awk</span><span style="font-family: 宋体;">：处理文本或数据</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">sed</span><span style="font-family: 宋体;">：流编辑器</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">sort</span><span style="font-family: 宋体;">：排序</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">uniq</span><span style="font-family: 宋体;">：去重</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">tail</span><span style="font-family: 宋体;">：输出文件的尾部</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">wc</span><span style="font-family: 宋体;">：统计行数</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">find</span><span style="font-family: 宋体;">：查找文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">kill</span><span style="font-family: 宋体;">：杀死进程</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">tar</span><span style="font-family: 宋体;">：文件压缩或解压</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">unzip</span><span style="font-family: 宋体;">：解压文件</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">netstat</span><span style="font-family: 宋体;">：输出连接状态或统计信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">w</span><span style="font-family: 宋体;">：显示登录的用户</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">last</span><span style="font-family: 宋体;">：显示用户登录列表</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">du</span><span style="font-family: 宋体;">：统计文件空间使用</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">top</span><span style="font-family: 宋体;">：显示运行任务信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">free</span><span style="font-family: 宋体;">：显示内存的使用信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">vmstat</span><span style="font-family: 宋体;">：显示虚拟内存统计信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">iostat</span><span style="font-family: 宋体;">：显示</span><span lang="EN-US">IO</span><span style="font-family: 宋体;">信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">sar</span><span style="font-family: 宋体;">：收集、报告和保存系统活动信息</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span lang="EN-US">man</span><span style="font-family: 宋体;">：显示命令手册。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">2</span><span style="font-family: 宋体;">、软件安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(1)RPM</span><span style="font-family: 宋体;">安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm
&#8211;ivh *.rpm (</span><span style="font-family: 宋体;">安装到默认目录</span><span lang="EN-US">)</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm
-ivh --prefix=</span><span style="font-family: 宋体;">目录</span><span lang="EN-US"> *.rpm (</span><span style="font-family: 宋体;">安装到指定目录</span><span lang="EN-US">)</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm
-ivh --replacepkg --prefix=</span><span style="font-family: 宋体;">目录</span><span lang="EN-US"> *.rpm (</span><span style="font-family: 宋体;">如果已经安装，重新安装到指定目录</span><span lang="EN-US">)</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">更新安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm
&#8211;Uvh *.rpm</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span></span><span style="font-family: 宋体;">参数说明：</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">-i</span><span style="font-family: 宋体;">：安装软件</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">-u</span><span style="font-family: 宋体;">：更新软件</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US">-h</span><span style="font-family: 宋体;">：安装时输出</span><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US">hash</span><span style="font-family: 宋体;">记号</span><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US"> (``#'')</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US">-v</span><span style="font-family: 宋体;">：显示附加信息</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US">--replacepkgs</span><span style="font-family: 宋体;">：强制重新安装已经安装的软件包</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;" lang="EN-US">--prefix</span><span style="font-family: 宋体;">：将软件包安装到由</span><span style="font-family: &quot;ˎ̥&quot;,&quot;serif&quot;;">
</span><span style="font-family: 宋体;">指定的路径下</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(2)</span><span style="font-family: 宋体;">源码安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">①<span lang="EN-US">.tar.gz</span>或<span lang="EN-US">.tgz</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -zxvf *.tar.gz (</span><span style="font-family: 宋体;">解压到当前目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -zxvf *.tar.gz -C </span><span style="font-family: 宋体;">目录<span lang="EN-US"> (</span>解压到指定目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>./configure &#8211;-help</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>./configure &#8211;-prefix=</span><span style="font-family: 宋体;">目录 选项</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>make &amp;&amp; make install</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 31.5pt;"><span style="font-family: 宋体;">②<span lang="EN-US">.tar.bz2</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -jxvf *.tar.gz (</span><span style="font-family: 宋体;">解压到当前目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -jxvf *.tar.gz -C </span><span style="font-family: 宋体;">目录<span lang="EN-US"> (</span>解压到指定目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>./configure &#8211;prefix=</span><span style="font-family: 宋体;">目录 选项</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>make &amp;&amp; make install</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">③<span lang="EN-US">.src.rpm</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm -i your-package.src.rpm</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cd /usr/src/redhat/SPECS</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rpmbuild -bb your-package.specs</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cd /usr/src/redhat/RPM/i386/</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm -i new-package.rpm</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(3)</span><span style="font-family: 宋体;">二进制安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">①<span lang="EN-US">.tar.gz (tomcat)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -zxvf *.tar.gz (</span><span style="font-family: 宋体;">解压到当前目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tar -zxvf *.tar.gz -C </span><span style="font-family: 宋体;">目录<span lang="EN-US"> (</span>解压到指定目录<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 31.5pt;"><span style="font-family: 宋体;">②<span lang="EN-US">.bin</span></span></p>
<p class="MsoNormal" style="text-indent: 31.5pt;"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp; </span><span>&nbsp;</span>chmod 755 *.bin</span></p>
<p class="MsoNormal" style="text-indent: 31.5pt;"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;
</span>./*.bin</span></p>
<p class="MsoNormal" style="text-indent: 31.5pt;"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">然后把解压的目录拷贝到想放置的目录。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">3</span><span style="font-family: 宋体;">、软件卸载：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp; </span>(1)RPM</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm -e *.rpm (</span><span style="font-family: 宋体;">一般卸载<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>rpm -e --nodeps *.rpm (</span><span style="font-family: 宋体;">有依赖软件的卸载<span lang="EN-US">)</span></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp; </span>(2)</span><span style="font-family: 宋体;">源码安装的卸载：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;" lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">查</span><span style="font-family: 宋体;">看解压文件目录下</span><span lang="EN-US">README</span><span style="font-family: 宋体;">和</span><span lang="EN-US">INSTALL</span><span style="font-family: 宋体;">文件，一般的情况下都有说明，但大多软件没有提供源码包的卸载方法。</span><span style="font-family: 宋体;">如果指定目录安装，直接删除目录。</span><span style="font-family: 宋体;">有些软件要在解压安装目录中执行</span><span lang="EN-US"> make
uninstall </span><span style="font-family: 宋体;">，就可以卸载。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">4</span><span style="font-family: 宋体;">、查看软件包是否已经安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span>rpm
&#8211;qa </span><span style="font-family: 宋体;">软件包名</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">5</span><span style="font-family: 宋体;">、常用软件安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(1)apache</span><span style="font-family: 宋体;">：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>http://www.apache.org</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>./configure --prefix=/home/apache2 --with-mpm=worker --enable-rewrite
--enable-proxy --enable-expires --enable-headers --enable-deflate --enable-so</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>make &amp;&amp; make install</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(2)mysql:</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>http://www.mysql.com</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>./configure --prefix=/home/mysql --with-extra-charsets=all
--enable-thread-safe-client --enable-assembler --with-big-tables --with-mysqld-ldflags=-all-static</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>make &amp;&amp; make install</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span lang="EN-US">(3)php:</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span lang="EN-US"><span>&nbsp;&nbsp; </span>http://www.php.net</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span lang="EN-US"><span>&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span lang="EN-US"><span>&nbsp;&nbsp; </span>./configure --prefix=/home/php
</span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-apxs2=/home /apache2/bin/apxs </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-mysql=/home /mysql </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-config-file-path=/home /php/etc </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-freetype-dir=/usr/local/include/freetype2 </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-jpeg-dir=/home/jpeg6 </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-png-dir=/home /libpng </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-gd=/home/gd2 </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--with-zlib </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-sysvsem </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-sysvshm </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-inline-optimization </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-xml </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-mbstring</span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">--enable-sockets </span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">make &amp;&amp; make install</span></p>
<p class="MsoNormal" style="text-indent: 36.75pt;"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span>(4)tomcat</span><span style="font-family: 宋体;">：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>http://tomcat.apache.org/</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>tar &#8211;axvf apache-tomcat-7.0.0.tar.gz</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>mv apache-tomcat-7.0.0 /home/ apache-tomcat-7.0.0</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span>(5)jdk:</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>http://java.sun.com/javase/downloads/index.jsp</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>chmod 755 jdk-6u20-linux-i586.bin</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;</span>./jdk-6u20-linux-i586.bin</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>mv jdk1.6.0_20 /home/</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(6)jk:</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>http://tomcat.apache.org/connectors-doc/</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">常用安装：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>tar &#8211;zxvf tomcat-connectors-1.2.30-src.tar.gz</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>cd tomcat-connectors-1.2.30-src/native</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>./configure --with-apxs=/home/apache2/bin/apxs</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>make &amp;&amp; make install</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p class="MsoNormal"><span lang="EN-US">6</span><span style="font-family: 宋体;">、查看连接状态：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(1)</span><span style="font-family: 宋体;">显示服务器打开的端口：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>netstat &#8211;nultp</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(2)</span><span style="font-family: 宋体;">显示当前的所有连接：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>netstat &#8211;an</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(3)</span><span style="font-family: 宋体;">显示连接状态统计</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span><span>&nbsp;</span></span><span style="font-size: 10pt; font-family: &quot;Cambria&quot;,&quot;serif&quot;; color: black;" lang="EN-US">netstat
-an | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}'</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;
</span>(4)</span><span style="font-family: 宋体;">显示某个端口的信息：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>netstat &#8211;nultp|grep </span><span style="font-family: 宋体;">端口</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>netstat &#8211;an|grep </span><span style="font-family: 宋体;">端口</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-size: 10pt; font-family: &quot;Cambria&quot;,&quot;serif&quot;; color: black;" lang="EN-US">netstat -an | grep </span><span style="font-size: 10pt; font-family: 宋体; color: black;">端口</span><span style="font-size: 10pt; font-family: &quot;Cambria&quot;,&quot;serif&quot;; color: black;" lang="EN-US">|awk
'/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}'</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp; </span>TCP</span><span style="font-family: 宋体;">状态：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(1)CLOSED</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(2)LISTEN</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(3)SYN-SENT</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(4)SYN-RECEIVED</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(5)ESTABLISHED</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(6)CLOSE-WAIT</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(7)LAST-ACK</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(8)FIN-WAIT-1</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(9)FIN-WAIT-2</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(10)CLOSING</span></p>
<p class="MsoNormal"><span lang="EN-US"><span>&nbsp;
</span>(11)TIME-WAIT</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/340053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-12-08 11:53 <a href="http://www.blogjava.net/ashutc/archive/2010/12/08/340053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>