﻿<?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-Kevin.Zhong</title><link>http://www.blogjava.net/sway/</link><description>彪悍的人生不需要解释，彪悍的代码不需要测试。</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 03:35:37 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 03:35:37 GMT</pubDate><ttl>60</ttl><item><title>spring2.5基于事务的单元测试</title><link>http://www.blogjava.net/sway/archive/2009/06/05/280224.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Fri, 05 Jun 2009 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2009/06/05/280224.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/280224.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2009/06/05/280224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/280224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/280224.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">@RunWith(SpringJUnit4ClassRunner.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">@ContextConfiguration(locations&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">"</span><span style="color: #000000;">/applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/com/jl/sinter/service/spring/conf/quality_spring_dao.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/com/jl/sinter/service/spring/conf/quality_spring_service.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/com/jl/sinter/service/spring/conf/common_spring.xml</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">})<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">@TransactionConfiguration(transactionManager&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">transactionManager</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;defaultRollback&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">@Transactional<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ConsumeFacadeTest&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">@Test<br />
</span><span style="color: #008080;">13</span>&nbsp;<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;getConsumeInfoByFilter()&nbsp;{<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MonitorQueryFilter&nbsp;filter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MonitorQueryFilter();<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter.setQueryDate(</span><span style="color: #000000;">"</span><span style="color: #000000;">2009-02-16</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter.setDutyClassId(</span><span style="color: #000000;">"</span><span style="color: #000000;">3</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter.setDutyShiftId(</span><span style="color: #000000;">"</span><span style="color: #000000;">2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter.setSinterId(</span><span style="color: #000000;">"</span><span style="color: #000000;">xxxxxxxxxxxxxxxxxxxxxxxxxxxxx001</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PowerConsumption</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;pcList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;consumeFacade.getConsumeInfoByFilter(filter);<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(CollectionUtils.isNotEmpty(pcList))&nbsp;{<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(PowerConsumption&nbsp;pc&nbsp;:&nbsp;pcList)&nbsp;{<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pc);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">}</span></div>
<span style="font-size: 12pt;">
</span>
<img src ="http://www.blogjava.net/sway/aggbug/280224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2009-06-05 15:56 <a href="http://www.blogjava.net/sway/archive/2009/06/05/280224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse快捷键全</title><link>http://www.blogjava.net/sway/archive/2009/01/09/250643.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Fri, 09 Jan 2009 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2009/01/09/250643.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/250643.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2009/01/09/250643.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/250643.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/250643.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: myeclipse 7.0 快捷键全.&nbsp;&nbsp;<a href='http://www.blogjava.net/sway/archive/2009/01/09/250643.html'>阅读全文</a><img src ="http://www.blogjava.net/sway/aggbug/250643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2009-01-09 11:44 <a href="http://www.blogjava.net/sway/archive/2009/01/09/250643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java对象序列化所引起的循环引用的思考</title><link>http://www.blogjava.net/sway/archive/2009/01/05/249867.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Mon, 05 Jan 2009 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2009/01/05/249867.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/249867.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2009/01/05/249867.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/249867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/249867.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java对象序列化所引起的循环引用的思考&nbsp;&nbsp;<a href='http://www.blogjava.net/sway/archive/2009/01/05/249867.html'>阅读全文</a><img src ="http://www.blogjava.net/sway/aggbug/249867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2009-01-05 11:17 <a href="http://www.blogjava.net/sway/archive/2009/01/05/249867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出REST[转载]</title><link>http://www.blogjava.net/sway/archive/2008/12/09/245155.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Tue, 09 Dec 2008 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/12/09/245155.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/245155.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/12/09/245155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/245155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/245155.html</trackback:ping><description><![CDATA[<div>
<a id="viewpost1_TitleUrl" class="postTitle2" href="../../rain1102/articles/243016.html">深入浅出REST[转载]</a>
</div>
<p>作者 <strong>Stefan Tilkov</strong>译者 <strong>苑永凯</strong> 发布于 2007年12月25日 下午10时10分 </p>
<p>不知你是否意识到，围绕着什么才是实现异构的应用到应用通信的&#8220;正确&#8221;方式，一场争论正进行的如火如荼：虽然当前主流的方式明显地集中在基于
SOAP、WSDL和WS-*规范的Web
Services领域，但也有少数人用细小但洪亮的声音主张说更好的方式是REST，表述性状态转移（REpresentational State
Transfer）的简称。在本文中，我不会涉及争论的话题，而是尝试对REST和RESTful
HTTP应用集成做实用性的介绍。以我的经验，有些话题一旦触及就会引来众多的讨论，当涉及到这方面话题的时候，我会深入详细地阐述。</p>
<h2>REST关键原则</h2>
<p>大部分对REST的介绍是以其正式的定义和背景作为开场的。但这儿且先按下不表，我先提出一个简单扼要的定义：REST定义了应该如何正确地使用
（这和大多数人的实际使用方式有很大不同）Web标准，例如HTTP和URI。如果你在设计应用程序时能坚持REST原则，那就预示着你将会得到一个使用
了优质Web架构（这将让你受益）的系统。总之，五条关键原则列举如下：</p>
<ul>
    <li>为所有&#8220;事物&#8221;定义ID
    </li>
    <li>将所有事物链接在一起
    </li>
    <li>使用标准方法
    </li>
    <li>资源多重表述
    </li>
    <li>无状态通信 </li>
</ul>
<p>下面让我们进一步审视这些原则。</p>
<h2>为所有&#8220;事物&#8221;定义ID </h2>
<p>在这里我使用了&#8220;事物&#8221;来代替更正式准确的术语&#8220;资源&#8221;，因为一条如此简单的原则，不应该被淹没在术语当中。思考一下人们构建的系统，通常会找到一
系列值得被标识的关键抽象。每个事物都应该是可标识的，都应该拥有一个明显的ID——在Web中，代表ID的统一概念是：URI。URI构成了一个全局命
名空间，使用URI标识你的关键资源意味着它们获得了一个唯一、全局的ID。 </p>
<p>对事物使用一致的命名规则（naming
scheme）最主要的好处就是你不需要提出自己的规则——而是依靠某个已被定义，在全球范围中几乎完美运行，并且能被绝大多数人所理解的规则。想一下你
构建的上一个应用（假设它不是采用RESTful方式构建的）中的任意一个高级对象（high-level
object），那就很有可能看到许多从使用唯一标识中受益的用例。比如，如果你的应用中包含一个对顾客的抽象，那么我可以相当肯定，用户会希望将一个指
向某个顾客的链接，能通过电子邮件发送到同事那里，或者加入到浏览器的书签中，甚至写到纸上。更透彻地讲：如果在一个类似于Amazon.com的在线商
城中，没有用唯一的ID（一个URI）标识它的每一件商品，可想而知这将是多么可怕的业务决策。</p>
<p>当面对这个原则时，许多人惊讶于这是否意味着需要直接向外界暴露数据库记录（或者数据库记录ID）——自从多年以来面向对象的实践告诫我们，要将持
久化的信息作为实现细节隐藏起来之后，哪怕是刚有点想法都常会使人惊恐。但是这条原则与隐藏实现细节两者之间并没有任何冲突：通常，值得被URI标识的事
物——资源——要比数据库记录抽象的多。例如，一个定单资源可以由定单项、地址以及许多其它方面（可能不希望作为单独标识的资源暴露出来）组成。标识所有
值得标识的事物，领会这个观念可以进一步引导你创造出在传统的应用程序设计中不常见的资源：一个流程或者流程步骤、一次销售、一次谈判、一份报价请求——
这都是应该被标识的事物的示例。同样，这也会导致创建比非RESTful设计更多的持久化实体。 </p>
<p>下面是一些你可能想到的URI的例子：</p>
<pre>http://example.com/customers/1234<br />
<br />
http://example.com/orders/2007/10/776654<br />
<br />
http://example.com/products/4554<br />
<br />
http://example.com/processes/salary-increase-234 </pre>
<p>正如我选择了创建便于阅读的URI——这是个有用的观点，尽管不是RESTful设计所必须的——应该能十分容易地推测出URI的含义：它们明显地标识着单一&#8220;数据项&#8221;。但是再往下看：</p>
<pre>http://example.com/orders/2007/11<br />
<br />
http://example.com/products?color=green </pre>
<p>首先，这两个URI看起来与之前的稍有不同——毕竟，它们不是对一件事物的标识，而是对一类事物集合的标识（假定第一个URI标识了所有在2007年11月份提交的定单，第二个则是绿颜色产品的集合）。但是这些集合自身也是事物（资源），也应该被标识。</p>
<p>注意，使用唯一、全局统一的命名规则的好处，既适用于浏览器中的Web应用，也适用于机对机（machine-to-machine，m2m）通信。</p>
<p>来对第一个原则做下总结：使用URI标识所有值得标识的事物，特别是应用中提供的所有&#8220;高级&#8221;资源，无论这些资源代表单一数据项、数据项集合、虚拟亦或实际的对象还是计算结果等。</p>
<h2>将所有事物链接在一起 </h2>
<p>接下来要讨论的原则有一个有点令人害怕的正式描述：&#8220;超媒体被当作应用状态引擎（Hypermedia as the engine of application state）&#8221;，有时简写为HATEOAS。（严格地说，这不是我说的。）这个描述的核心是<strong>超媒体</strong>概念，换句话说：是<strong>链接</strong>的思想。链接是我们在HTML中常见的概念，但是它的用处绝不局限于此（用于人们网络浏览）。考虑一下下面这个虚构的XML片段： </p>
<pre><order self="http://example.com/customers/1234">&lt;order self="http://example.com/customers/1234"&gt; <br />
<br />
&nbsp;&lt;amount&gt;23&lt;/amount&gt;<br />
<br />
&nbsp;&lt;product ref="http://example.com/products/4554"&gt;<br />
<br />
&nbsp; &lt;customer ref="http://example.com/customers/1234"&gt;<br />
<br />
&nbsp; &lt;/customer&gt;<br />
<br />
&nbsp;&lt;/product&gt;<br />
<br />
&lt;/order&gt;   <customer ref="http://example.com/customers/1234"> <br />
<br />
</customer> </order></pre>
如果你观察文档中product和customer的链接，就可以很容易地想象到，应用程序（已经检索过文档）如何&#8220;跟随&#8221;链接检索更多的信息。当然，如果使用一个遵守专用命名规范的简单&#8220;id&#8221;属性作为链接，
也是可行的——<strong>但是仅限于应用环境之内</strong>。使用URI表示链接的优雅之处在于，链接可以指向由不同应用、不同服务器甚至位于另一个大陆上的不同公司提供的资源——因为URI命名规范是全球标准，构成Web的所有资源都可以互联互通。
<p>超媒体原则还有一个更重要的方面——应用&#8220;状态&#8221;。简而言之，实际上服务器端（如果你愿意，也可以叫服务提供者）为客户端（服务消费者）提供一组链
接，使客户端能通过链接将应用从一个状态改变为另一个状态。稍后我们会在另一篇文章中探究这个方面的影响；目前，只需要记住：链接是构成动态应用的非常有
效的方式。</p>
<p>对此原则总结如下：任何可能的情况下，使用链接指引可以被标识的事物（资源）。也正是超链接造就了现在的Web。</p>
<h2>使用标准方法 </h2>
<p>在前两个原则的讨论中暗含着一个假设：接收URI的应用程序可以通过URI明确地<strong>做</strong>一些有意义的事情。如果你在公共汽车上看到一个URI，你可以将它输入浏览器的地址栏中并回车——但是你的浏览器如何知道需要对这个URI做些什么呢？</p>
<p>它知道如何去处理URI的原因在于所有的资源都支持同样的接口，一套同样的方法（只要你乐意，也可以称为操作）集合。在HTTP中这被叫做动词
（verb），除了两个大家熟知的（GET和POST）之外，标准方法集合中还包含PUT、DELETE、HEAD和OPTIONS。这些方法的含义连同
行为许诺都一起定义在HTTP规范之中。如果你是一名OO开发人员，就可以想象到RESTful
HTTP方案中的所有资源都继承自类似于这样的一个类（采用类Java、C#的伪语法描述，请注意关键的方法）：</p>
<pre>class Resource {<br />
<br />
Resource(URI u);<br />
<br />
Response get();<br />
<br />
Response post(Request r);<br />
<br />
Response put(Request r);<br />
<br />
Response delete();<br />
<br />
} </pre>
<p>由于所有资源使用了同样的接口，你可以依此使用GET方法检索一个<strong>表述</strong>（representation）——也
就是对资源的描述。因为规范中定义了GET的语义，所以可以肯定当你调用它的时候不需要对后果负责——这就是为什么可以&#8220;安全&#8221;地调用此方法。GET方法
支持非常高效、成熟的缓存，所以在很多情况下，你甚至不需要向服务器发送请求。还可以肯定的是，GET方法具有<strong>幂等性</strong>[译
注：指多个相同请求返回相同的结果]——如果你发送了一个GET请求没有得到结果，你可能不知道原因是请求未能到达目的地，还是响应在反馈的途中丢失了。
幂等性保证了你可以简单地再发送一次请求解决问题。幂等性同样适用于PUT（基本的含义是&#8220;更新资源数据，如果资源不存在的话，则根据此URI创建一个新
的资源&#8221;）和DELETE（你完全可以一遍又一遍地操作它，直到得出结论——删除不存在的东西没有任何问题）方法。POST方法，通常表示&#8220;创建一个新资
源&#8221;，也能被用于调用任意过程，因而它既不安全也不具有幂等性。</p>
<p>如果你采用RESTful的方式暴露应用功能（如果你乐意，也可以称为服务功能），<strong>那这条原则和它的约束同样也适用于你</strong>。如果你已经习惯于另外的设计方式，则很难去接受这条原则——毕竟，你很可能认为你的应用包含了超出这些操作表达范围的逻辑。请允许我花费一些时间来让你相信不存在这样的情况。 </p>
<p>来看下面这个简单的采购方案例子： </p>
<p><img alt="Sample Scenario" src="http://www.infoq.com/resource/articles/rest-introduction/zh/resources/figure1.jpg" _href="img://figure1.jpg" width="200" /></p>
<p>可以看到，例子中定义了两个服务程序（没有包含任何实现细节）。这些服务程序的接口都是为了完成任务（正是我们讨论的
OrderManagement和CustomerManagement服务）而定制的。如果客户端程序试图使用这些服务，那它必须针对这些特定接口进行
编码——不可能在这些接口定义之前，使用客户程序去有目的地和接口协作。这些接口定义了服务程序的应用协议（application
protocol）。</p>
<p>在RESTful HTTP方式中，你将通过组成<strong>HTTP应用协议</strong>的通用接口访问服务程序。你可能会想出像这样的方式：</p>
<p><img alt="Sample Scenario, done RESTfully" src="http://www.infoq.com/resource/articles/rest-introduction/zh/resources/figure2.jpg" _href="img://figure2.jpg" width="400" /></p>
<p>可以看到，服务程序中的特定操作被映射成为标准的HTTP方法——为了消除歧义，我创建了一组全新的资源。&#8220;这是骗人的把戏&#8221;，我听见你叫嚷着。
不，这不是欺骗。标识一个顾客的URI上的GET方法正好相当于getCustomerDetails操作。有人用三角形形象化地说明了这一点：</p>
<p><img alt="Knobs one can turn" src="http://www.infoq.com/resource/articles/rest-introduction/zh/resources/figure3.jpg" _href="img://figure3.jpg" width="200" /></p>
<p>把三个顶点想象为你可以调节的按钮。可以看到在第一种方法中，你拥有许多操作，许多种类的数据以及固定数量的&#8220;实例&#8221;（本质上和你拥有的服务程序数
量一致）。在第二种方法中，你拥有固定数量的操作，许多种类的数据和许多调用固定方法的对象。它的意义在于，证明了通过这两种方式，你基本上可以表示任何
你喜欢的事情。</p>
<p>为什么使用标准方法如此重要？从根本上说，它使你的应用成为Web的一部分——应用程序为Web变成Internet上最成功的应用所做的贡献，与
它添加到Web中的资源数量成比例。采用RESTful方式，一个应用可能会向Web中添加数以百万计的客户URI；如果采用CORBA技术并维持应用的
原有设计方式，那它的贡献大抵只是一个&#8220;端点（endpoint）&#8221;——就好比一个非常小的门，仅仅允许有钥匙的人进入其中的资源域。</p>
<p>统一接口也使得所有理解HTTP应用协议的组件能与你的应用交互。通用客户程序（generic client）就是从中受益的组件的例子，例如curl、wget、代理、缓存、HTTP服务器、网关还有Google、Yahoo!、MSN等等。 </p>
<p>总结如下：为使客户端程序能与你的资源相互协作，资源应该正确地实现默认的应用协议（HTTP），也就是使用标准的GET、PUT、POST和DELETE方法。</p>
<h2>资源多重表述 </h2>
<p>到目前为止我们一直忽略了一个稍微复杂的问题：客户程序如何知道该怎样处理检索到的数据，比如作为GET或者POST请求的结果？原因是，HTTP
采取的方式是允许数据处理和操作调用之间关系分离的。换句话说，如果客户程序知道如何处理一种特定的数据格式，那就可以与所有提供这种表述格式的资源交
互。让我们再用一个例子来阐明这个观点。利用HTTP内容协商（content negotiation），客户程序可以请求一种特定格式的表述：</p>
<pre>GET /customers/1234 HTTP/1.1<br />
<br />
Host: example.com <br />
<br />
Accept: application/vnd.mycompany.customer+xml  </pre>
<p>请求的结果可能是一些由公司专有的XML格式表述的客户信息。假设客户程序发送另外一个不同的请求，就如下面这样：</p>
<pre>GET /customers/1234 HTTP/1.1<br />
<br />
Host: example.com <br />
<br />
Accept: text/x-vcard </pre>
<p>结果则可能是VCard格式的客户地址。（在这里我没有展示响应的内容，在其HTTP
Content-type头中应该包含着关于数据类型的元数据。）这说明为什么理想的情况下，资源表述应该采用标准格式——如果客户程序对HTTP应用协
议和一组数据格式都有所&#8220;了解&#8221;，那么它就可以用一种有意义的方式<strong>与世界上任意一个RESTful HTTP应用交互</strong>。
不幸的是，我们不可能拿到所有东西的标准格式，但是，或许我们可以想到在公司或者一些合作伙伴中使用标准格式来营造一个小环境。当然以上情况不仅适用于从
服务器端到客户端的数据，反之既然——倘若从客户端传来的数据符合应用协议，那么服务器端就可以使用特定的格式处理数据，而不去关心客户端的类型。 </p>
<p id="scroll_to_here">在实践中，资源多重表述还有着其它重要的好处：如果你为你的资源提供HTML和XML两种表述方式，那这些资源不仅可以被你的应用所用，还可以被任意标准Web浏览器所用——也就是说，你的应用信息可以被所有会使用Web的人获取到。</p>
<p>资源多重表述还有另外一种使用方式：你可以将应用的Web UI纳入到Web
API中——毕竟，API的设计通常是由UI可以提供的功能驱动的，而UI也是通过API执行动作的。将这两个任务合二为一带来了令人惊讶的好处，这使得
使用者和调用程序都能得到更好的Web接口。</p>
<p>总结：针对不同的需求提供资源多重表述。</p>
<h2>无状态通信</h2>
<p><strong>无状态通信</strong>是我要讲到的最后一个原则。首先，需要着重强调的是，虽然REST包含无状态性（statelessness）的观念，但这并不是说暴露功能的应用不能有状态——<br />
事实上，在大部分情况下这会导致整个做法没有任何用处。REST要求状态要么被放入资源状态中，要么保存在客户端上。或者换句话说，服务器端不能保持除了
单次请求之外的，任何与其通信的客户端的通信状态。这样做的最直接的理由就是可伸缩性——
如果服务器需要保持客户端状态，那么大量的客户端交互会严重影响服务器的内存可用空间（footprint）。（注意，要做到无状态通信往往需要需要一些
重新设计——不能简单地将一些session状态绑缚在URI上，然后就宣称这个应用是RESTful。）</p>
<p>但除此以外，其它方面可能显得更为重要：无状态约束使服务器的变化对客户端是不可见的，因为在两次连续的请求中，客户端并不依赖于同一台服务器。一
个客户端从某台服务器上收到一份包含链接的文档，当它要做一些处理时，这台服务器宕掉了，可能是硬盘坏掉而被拿去修理，可能是软件需要升级重启——如果这
个客户端访问了从这台服务器接收的链接，它不会察觉到后台的服务器已经改变了。</p>
<h2>理论上的REST</h2>
<p>我承认：以上我所说的REST不是真正的REST，而且我可能有点过多地热衷于简单化。但因为我想有一个与众不同的开场，所以没有在一开始就介绍其正式的定义和背景。现在就让我们稍微简要地介绍一下这方面的内容。</p>
<p>首先，先前我并没有明确地区分HTTP、RESTful HTTP和REST。要理解这些不同方面之间的关系，我们要先来看看REST的历史。</p>
<p><a title="Roy T. Fielding" href="http://www.ics.uci.edu/%7Efielding/">Roy T. Fielding</a>在他的<a id="ewd-" title="博士学位论文" href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm">博士学位论文</a>（实际上你应该访问这个链接——至少对于一篇学术论文来说，它是相当易读的。此论文已被翻译成<a id="nev8" title="中文" href="http://www.redsaga.com/opendoc/REST_cn.pdf">中文</a>）
中定义了术语REST。Roy曾是许多基本Web协议的主要设计者，其中包括HTTP和URIs，并且他在论文中对这些协议提出了很多想法。（这篇论文被
誉为&#8220;REST圣经&#8221;，这是恰当的——毕竟，是作者发明了这个术语，所以在定义上，他写的任何内容都被认为是权威的。）在论文中，Roy首先定义一种方法
论来谈论<strong>架构风格</strong>——高级、抽象的模式，来表达架构方法背后的核心理念。每一个架构风格由一系列的<strong>约束</strong>（constraints）定义形成。架构风格的例子包括&#8220;没有风格&#8221;（根本没有任何约束）、管道和过滤器（pipe and filter）、客户端/服务器、分布式对象以及——你猜到它了——REST。</p>
<p>如果对你来说这些听起来都太抽象了，那就对了——REST在本质上是一个可以被许多不同技术实现的高层次的风格，而且可以被实例化——通过为它的抽
象特性赋上不同的值。比如，REST中包含资源和统一接口的概念——也就是说，所有资源都应该对这些相同的方法作出反应。但是REST并没有说明是哪些方
法，或者有多少方法。</p>
<p>REST风格的一个&#8220;化身&#8221;便是HTTP（以及一套相关的一套标准，比如URI），或者稍微抽象一些：Web架构自身。接着上面的例子，HTTP使
用HTTP动词作为REST统一接口的&#8220;实例&#8221;。由于Fielding是在Web已经（或者至少是大部分）&#8220;完善&#8221;了之后才定义的REST风格，有人可能
会争论两者是不是100%的匹配。但是无论如何，整体上来说Web、HTTP和URI仅仅是REST风格的一个主要实现。不过，由于Roy
Fielding即是REST论文的作者，又对Web架构设计有过深远的影响，两者相似也在情理之中。</p>
<p>最后，我在前面一次又一次地使用着术语&#8220;RESTful
HTTP&#8221;，原因很简单：许多使用HTTP的应用因为一些理由并没有遵循REST原则，有人会说使用HTTP而不遵循REST原则就等同于滥用HTTP。
当然这听起来有点狂热——事实上违反REST约束的原因通常是，仅仅因为每个约束带来的设计权衡可能不适合于一些特殊情况。但通常，违背REST约束的原
因可归咎于对其好处认知的缺乏。来看一个明显的反面案例：使用HTTP
GET调用类似于删除对象的操作，这违反了REST的安全约束和一般性常识（客户程序不应为此负责，服务器端开发人员大概不是有意而为之）。但在随后的文
章中，我会提及更多这样或那样的对HTTP的滥用。</p>
<h2>总结 </h2>
<p>本文试图对REST（Web架构）背后的概念提供快速的介绍。RESTful HTTP暴露功能的方式与RPC、分布式对象以及Web
Services是不相同的；要真正理解这些不同是需要一些心态的转变。不管你构建的应用是仅仅想暴露Web
UI还是想把API变成Web的一份子，了解下REST的原则还是有好处的。</p>
<p><a href="http://www.innoq.com/blog/st/"><strong>Stefan Tilkov</strong></a><strong>是InfoQ SOA社区的首席编辑，并且是位于德国和瑞士的</strong><a id="hdph" title="innoQ" href="http://www.innoq.com/"><strong>innoQ</strong></a><strong>公司的共同创始人、首席顾问和REST狂热分子首领。</strong> </p>
<strong>查看英文原文</strong>：<a id="mxm5" title="A Brief Introduction to REST" href="http://www.infoq.com/articles/rest-introduction">A Brief Introduction to REST</a>
<img src ="http://www.blogjava.net/sway/aggbug/245155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-12-09 10:04 <a href="http://www.blogjava.net/sway/archive/2008/12/09/245155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP的状态码</title><link>http://www.blogjava.net/sway/archive/2008/12/08/245042.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Mon, 08 Dec 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/12/08/245042.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/245042.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/12/08/245042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/245042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/245042.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;"><span style="font-size: 8pt;"><span style="font-size: 12pt;">
完整的 HTTP 1.1规范说明书来自于RFC 2616，你可以在http://www.rfc-editor.org/在线查阅。HTTP
1.1的状态码被标记为新特性，因为许多浏览器只支持 HTTP 1.0。你应只把状态码发送给支持 HTTP
1.1的客户端，支持协议版本可以通过调用request.getRequestProtocol来检查。 <br />
<br />
本部分余下的内容会详细地介绍 HTTP 1.1中的状态码。这些状态码被分为五大类： <br />
<br />
100-199 用于指定客户端应相应的某些动作。 <br />
200-299 用于表示请求成功。 <br />
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 <br />
400-499 用于指出客户端的错误。 <br />
500-599 用于支持服务器错误。 <br />
<br />
HttpServletResponse
中的常量代表关联不同标准消息的状态码。在servlet程序中，你会更多地用到这些常量的标识来使用状态码。例如：你一般会使用
response.setStatus(response.SC_NO_CONTENT)而不是
response.setStatus(204)，因为后者不易理解而且容易导致错误。但是，你应当注意到服务器允许对消息轻微的改变，而客户端只注意状
态码的数字值。所以服务器可能只返回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK。 <br />
<br />
100 (Continue/继续)<br />
如
果服务器收到头信息中带有100-continue的请求，这是指客户端询问是否可以在后续的请求中发送附件。在这种情况下，服务器用
100(SC_CONTINUE)允许客户端继续或用417 (Expectation Failed)告诉客户端不同意接受附件。这个状态码是
HTTP 1.1中新加入的。 <br />
<br />
101 (Switching Protocols/转换协议)<br />
101 (SC_SWITCHING_PROTOCOLS)状态码是指服务器将按照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新加入的。 <br />
<br />
200 (OK/正常)<br />
200 (SC_OK)的意思是一切正常。一般用于相应GET和POST请求。这个状态码对servlet是缺省的；如果没有调用setStatus方法的话，就会得到200。 <br />
<br />
201 (Created/已创建)<br />
201 (SC_CREATED)表示服务器在请求的响应中建立了新文档；应在定位头信息中给出它的URL。<br />
<br />
202 (Accepted/接受)<br />
202 (SC_ACCEPTED)告诉客户端请求正在被执行，但还没有处理完。 <br />
<br />
203 (Non-Authoritative Information/非官方信息)<br />
状态码203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文档被正常的返回，但是由于正在使用的是文档副本所以某些响应头信息可能不正确。这是 HTTP 1.1中新加入的。 <br />
<br />
204 (No Content/无内容)<br />
在并没有新文档的情况下，204 (SC_NO_CONTENT)确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页非常有用，并且你可以确定先前的页面是否已经更新。例如，某个servlet可能作如下操作： <br />
int pageVersion =Integer.parseInt(request.getParameter("pageVersion"));<br />
if (pageVersion &gt;;= currentVersion) {<br />
&nbsp;&nbsp; response.setStatus(response.SC_NO_CONTENT);<br />
} else {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Create regular page<br />
}<br />
但
是，这种方法对通过刷新响应头信息或等价的HTML标记自动重载的页面起作用，因为它会返回一个204状态码停止以后的重载。但基于JavaScript
脚本的自动重载在这种情况下仍然需要能够起作用。可以阅读本书7.2 ( HTTP 1.1 Response Headers and Their
Meaning/HTTP 1.1响应头信息以及他们的意义)部分的详细讨论。 <br />
<br />
205 (Reset Content/重置内容)<br />
重置内容205 (SC_RESET_CONTENT)的意思是虽然没有新文档但浏览器要重置文档显示。这个状态码用于强迫浏览器清除表单域。这是 HTTP 1.1中新加入的。 <br />
<br />
206 (Partial Content/局部内容)<br />
206 (SC_PARTIAL_CONTENT)是在服务器完成了一个包含Range头信息的局部请求时被发送的。这是 HTTP 1.1中新加入的。 <br />
<br />
300 (Multiple Choices/多重选择)<br />
300 (SC_MULTIPLE_CHOICES)表示被请求的文档可以在多个地方找到，并将在返回的文档中列出来。如果服务器有首选设置，首选项将会被列于定位响应头信息中。 <br />
<br />
301 (Moved Permanently)<br />
301 (SC_MOVED_PERMANENTLY)状态是指所请求的文档在别的地方；文档新的URL会在定位响应头信息中给出。浏览器会自动连接到新的URL。 <br />
<br />
302 (Found/找到)<br />
与
301有些类似，只是定位头信息中所给的URL应被理解为临时交换地址而不是永久的。注意：在 HTTP 1.0中，消息是临时移动(Moved
Temporarily)的而不是被找到，因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我们以为
的SC_FOUND。 <br />
<br />
注意<br />
代表状态码302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND。 <br />
<br />
状
态码302是非常有用的因为浏览器自动连接在定为响应头信息中给出的新URL。这非常有用，而且为此有一个专门的方法——sendRedirect。使用
response.sendRedirect(url)比调用
response.setStatus(response.SC_MOVED_TEMPORARILY)和
response.setHeader("Location",
url)多几个好处。首先，response.sendRedirect(url)方法明显要简单和容易。第二，servlet自动建立一页保存这一连接
以提供给那些不能自动转向的浏览器显示。最后，在servlet
2.2版本（J2EE中的版本）中，sendRedirect能够处理相对路径，自动转换为绝对路径。但是你只能在2.1版本中使用绝对路径。 <br />
<br />
如
果你将用户转向到站点的另一页中，你要用 HttpServletResponse 中的 encodeURL
方法传送URL。这么做可预防不断使用基于URL重写的会话跟踪的情况。URL重写是一种在你的网站跟踪不使用 cookies
的用户的方法。这是通过在每一个URL尾部附加路径信息实现的，但是 servlet
会话跟踪API会自动的注意这些细节。会话跟踪在第九章讨论，并且养成使用 encodeURL 的习惯会使以后添加会话跟踪的功能更容易很多。 <br />
<br />
核心技巧<br />
如
果你将用户转向到你的站点的其他页面，用 response.sendRedirect(response.encodeURL(url))
的方式事先计划好会话跟踪(session tracking)要比只是调用 response.sendRedirect(url) 好的多。 <br />
<br />
这
个状态码有时可以与301交换使用。例如，如果你错误的访问了http://host/~user（路径信息不完整），有些服务器就会回复301状态码而
有些则回复302。从技术上说，如果最初的请求是GET浏览器只是被假定自动转向。如果想了解更多细节，请看状态码307的讨论。 <br />
<br />
303 (See Other/参见其他信息)<br />
这个状态码和 301、302 相似，只是如果最初的请求是 POST，那么新文档（在定位头信息中给出）药用 GET 找回。这个状态码是新加入 HTTP 1.1中的。 <br />
<br />
304 (Not Modified/为修正)<br />
当
客户端有一个缓存的文档，通过提供一个 If-Modified-Since
头信息可指出客户端只希望文档在指定日期之后有所修改时才会重载此文档，用这种方式可以进行有条件的请求。304
(SC_NOT_MODIFIED)是指缓冲的版本已经被更新并且客户端应刷新文档。另外，服务器将返回请求的文档及状态码
200。servlet一般情况下不会直接设置这个状态码。它们会实现getLastModified方法并根据修正日期让默认服务方法处理有条件的请
求。这个方法的例程已在2.8部分(An Example Using Servlet Initialization and Page
Modification Dates/一个使用servlet初始化和页面修正日期的例子)给出。 <br />
<br />
305 (Use Proxy/使用代理)<br />
305 (SC_USE_PROXY)表示所请求的文档要通过定位头信息中的代理服务器获得。这个状态码是新加入 HTTP 1.1中的。 <br />
<br />
307 (Temporary Redirect/临时重定向)<br />
浏
览器处理307状态的规则与302相同。307状态被加入到 HTTP
1.1中是由于许多浏览器在收到302响应时即使是原始消息为POST的情况下仍然执行了错误的转向。只有在收到303响应时才假定浏览器会在POST请
求时重定向。添加这个新的状态码的目的很明确：在响应为303时按照GET和POST请求转向；而在307响应时则按照GET请求转向而不是POST请
求。注意：由于某些原因在HttpServletResponse中还没有与这个状态对应的常量。该状态码是新加入HTTP 1.1中的。 <br />
<br />
注意<br />
在 HttpServletResponse 中没有 SC_TEMPORARY_REDIRECT 常量，所以你只能显示的使用307状态码。 <br />
<br />
400 (Bad Request/错误请求)<br />
400 (SC_BAD_REQUEST)指出客户端请求中的语法错误。 <br />
<br />
401 (Unauthorized/未授权)<br />
401
(SC_UNAUTHORIZED)表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个响应必须包含一个WWW-
Authenticate的授权信息头。例如，在本书4.5部分中的&#8220;Restricting Access to Web
Pages./限制访问Web页。&#8221; <br />
<br />
403 (Forbidden/禁止)<br />
403 (SC_FORBIDDEN)的意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。 <br />
<br />
404 (Not Found/未找到)<br />
404
(SC_NOT_FOUND)状态每个网络程序员可能都遇到过，他告诉客户端所给的地址无法找到任何资源。它是表示&#8220;没有所访问页面&#8221;的标准方式。这个状
态码是常用的响应并且在HttpServletResponse类中有专门的方法实现它：sendError("message")。相对于
setStatus使用sendError得好处是：服务器会自动生成一个错误页来显示错误信息。但是，Internet Explorer
5浏览器却默认忽略你发挥的错误页面并显示其自定义的错误提示页面，虽然微软这么做违反了 HTTP
规范。要关闭此功能，在工具菜单里，选择Internet选项，进入高级标签页，并确认&#8220;显示友好的 HTTP
错误信息&#8221;选项（在我的浏览器中是倒数第8各选项）没有被选。但是很少有用户知道此选项，因此这个特性被IE5隐藏了起来使用户无法看到你所返回给用户的
信息。而其他主流浏览器及IE4都完全的显示服务器生成的错误提示页面。可以参考图6-3及6-4中的例子。 <br />
<br />
核心警告<br />
默认情况下，IE5忽略服务端生成的错误提示页面。 <br />
<br />
405 (Method Not Allowed/方法未允许)<br />
405 (SC_METHOD_NOT_ALLOWED)指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不允许使用。该状态码是新加入 HTTP 1.1中的。 <br />
<br />
406 (Not Acceptable/无法访问)<br />
406
(SC_NOT_ACCEPTABLE)表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。见本书7.2部分中的表
7.1(HTTP 1.1 Response Headers and Their Meaning/HTTP
1.1响应头信息以及他们的意义)中对MIME类型的介绍。406是新加入 HTTP 1.1中的。 <br />
<br />
407 (Proxy Authentication Required/代理服务器认证要求)<br />
407
(SC_PROXY_AUTHENTICATION_REQUIRED)与401状态有些相似，只是这个状态用于代理服务器。该状态指出客户端必须通过代
理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端，这会引起客户端使用带有Proxy-
Authorization请求的头信息重新连接。该状态码是新加入 HTTP 1.1中的。 <br />
<br />
408 (Request Timeout/请求超时)<br />
408 (SC_REQUEST_TIMEOUT)是指服务端等待客户端发送请求的时间过长。该状态码是新加入 HTTP 1.1中的。 <br />
<br />
409 (Conflict/冲突)<br />
该状态通常与PUT请求一同使用，409 (SC_CONFLICT)状态常被用于试图上传版本不正确的文件时。该状态码是新加入 HTTP 1.1中的。 <br />
<br />
410 (Gone/已经不存在)<br />
410 (SC_GONE)告诉客户端所请求的文档已经不存在并且没有更新的地址。410状态不同于404，410是在指导文档已被移走的情况下使用，而404则用于未知原因的无法访问。该状态码是新加入 HTTP 1.1中的。 <br />
<br />
411 (Length Required/需要数据长度)<br />
411 (SC_LENGTH_REQUIRED)表示服务器不能处理请求（假设为带有附件的POST请求），除非客户端发送Content-Length头信息指出发送给服务器的数据的大小。该状态是新加入 HTTP 1.1的。 <br />
<br />
412 (Precondition Failed/先决条件错误)<br />
412 (SC_PRECONDITION_FAILED)状态指出请求头信息中的某些先决条件是错误的。该状态是新加入 HTTP 1.1的。 <br />
<br />
413 (Request Entity Too Large/请求实体过大)<br />
413 (SC_REQUEST_ENTITY_TOO_LARGE)告诉客户端现在所请求的文档比服务器现在想要处理的要大。如果服务器认为能够过一段时间处理，则会包含一个Retry-After的响应头信息。该状态是新加入 HTTP 1.1的。 <br />
<br />
414 (Request URI Too Long/请求URI过长)<br />
414
(SC_REQUEST_URI_TOO_LONG)状态用于在URI过长的情况时。这里所指的&#8220;URI&#8221;是指URL中主机、域名及端口号之后的内容。例
如：在URL--http://www.y2k-disaster.com:8080/we/look/silly/now/中URI是指/we
/look/silly/now/。该状态是新加入 HTTP 1.1的。 <br />
<br />
415 (Unsupported Media Type/不支持的媒体格式)<br />
415 (SC_UNSUPPORTED_MEDIA_TYPE)意味着请求所带的附件的格式类型服务器不知道如何处理。该状态是新加入 HTTP 1.1的。 <br />
<br />
416 (Requested Range Not Satisfiable/请求范围无法满足)<br />
416表示客户端包含了一个服务器无法满足的Range头信息的请求。该状态是新加入 HTTP 1.1的。奇怪的是，在servlet 2.1版本API的HttpServletResponse中并没有相应的常量代表该状态。 <br />
<br />
注意<br />
在servlet 2.1的规范中，类HttpServletResponse并没有SC_REQUESTED_RANGE_NOT_SATISFIABLE 这样的常量，所以你只能直接使用416。在servlet 2.2版本之后都包含了此常量。 <br />
<br />
417 (Expectation Failed/期望失败)<br />
如
果服务器得到一个带有100-continue值的Expect请求头信息，这是指客户端正在询问是否可以在后面的请求中发送附件。在这种情况下，服务器
也会用该状态(417)告诉浏览器服务器不接收该附件或用100 (SC_CONTINUE)状态告诉客户端可以继续发送附件。该状态是新加入
HTTP 1.1的。 <br />
<br />
500 (Internal Server Error/内部服务器错误)<br />
500 (SC_INTERNAL_SERVER_ERROR) 是常用的&#8220;服务器错误&#8221;状态。该状态经常由CGI程序引起也可能（但愿不会如此！）由无法正常运行的或返回头信息格式不正确的servlet引起。 <br />
<br />
501 (Not Implemented/未实现)<br />
501 (SC_NOT_IMPLEMENTED)状态告诉客户端服务器不支持请求中要求的功能。例如，客户端执行了如PUT这样的服务器并不支持的命令。 <br />
<br />
502 (Bad Gateway/错误的网关)<br />
502 (SC_BAD_GATEWAY)被用于充当代理或网关的服务器；该状态指出接收服务器接收到远端服务器的错误响应。 <br />
<br />
503 (Service Unavailable/服务无法获得)<br />
状
态码503
(SC_SERVICE_UNAVAILABLE)表示服务器由于在维护或已经超载而无法响应。例如，如果某些线程或数据库连接池已经没有空闲则
servlet会返回这个头信息。服务器可提供一个Retry-After头信息告诉客户端什么时候可以在试一次。 <br />
<br />
504 (Gateway Timeout/网关超时)<br />
该状态也用于充当代理或网关的服务器；它指出接收服务器没有从远端服务器得到及时的响应。该状态是新加入 HTTP 1.1的。 <br />
<br />
505 (HTTP Version Not Supported/不支持的 HTTP 版本)<br />
505 (SC_HTTP_VERSION_NOT_SUPPORTED)状态码是说服务器并不支持在请求中所标明 HTTP 版本。该状态是新加入 HTTP 1.1的。
</span></span></span>
<img src ="http://www.blogjava.net/sway/aggbug/245042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-12-08 15:51 <a href="http://www.blogjava.net/sway/archive/2008/12/08/245042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>checkstyle常用的输出结果解释</title><link>http://www.blogjava.net/sway/archive/2008/11/06/238983.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Thu, 06 Nov 2008 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/11/06/238983.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/238983.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/11/06/238983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/238983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/238983.html</trackback:ping><description><![CDATA[1 Type is missing a javadoc commentClass  缺少类型说明 <br />
2&#8220;{&#8221; should be on the previous line &#8220;{&#8221; 应该位于前一行 <br />
3Methos is missing a javadoc comment方法前面缺少javadoc注释 <br />
4Expected @throws tag for &#8220;Exception&#8221;在注释中希望有@throws的说明 <br />
5&#8220;.&#8221; Is preceeded with whitespace &#8220;.&#8221; 前面不能有空格 <br />
6&#8220;.&#8221; Is followed by whitespace&#8220;.&#8221; 后面不能有空格 <br />
7&#8220;=&#8221; is not preceeded with whitespace&#8220;=&#8221; 前面缺少空格 <br />
8&#8220;=&#8221; is not followed with whitespace&#8220;=&#8221; 后面缺少空格 <br />
9&#8220;}&#8221; should be on the same line&#8220;}&#8221; 应该与下条语句位于同一行 <br />
10Unused @param tag for &#8220;unused&#8221;没有参数&#8220;unused&#8221;，不需注释 <br />
11Variable &#8220;CA&#8221; missing javadoc变量&#8220;CA&#8221;缺少javadoc注释 <br />
12Line longer than 80characters行长度超过80 <br />
13Line contains a tab character行含有&#8221;tab&#8221; 字符 <br />
14Redundant &#8220;Public&#8221; modifier冗余的&#8220;public&#8221; modifier <br />
15Final modifier out of order with the JSL suggestionFinal modifier的顺序错误 <br />
16Avoid using the &#8220;.*&#8221; form of importImport格式避免使用&#8220;.*&#8221; <br />
17Redundant import from the same package从同一个包中Import内容 <br />
18Unused import-java.util.listImport进来的java.util.list没有被使用 <br />
19Duplicate import to line 13重复Import同一个内容 <br />
20Import from illegal package从非法包中 Import内容 <br />
21&#8220;while&#8221; construct must use &#8220;{}&#8221;&#8220;while&#8221; 语句缺少&#8220;{}&#8221; <br />
22Variable &#8220;sTest1&#8221; must be private and have accessor method变量&#8220;sTest1&#8221;应该是private的，并且有调用它的方法 <br />
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; <br />
24&#8220;(&#8221; is followed by whitespace&#8220;(&#8221; 后面不能有空格 25&#8220;)&#8221; is proceeded by whitespace&#8220;)&#8221; 前面不能有空格
<img src ="http://www.blogjava.net/sway/aggbug/238983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-11-06 11:27 <a href="http://www.blogjava.net/sway/archive/2008/11/06/238983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate二级缓存攻略(javaeye)</title><link>http://www.blogjava.net/sway/archive/2008/11/05/238864.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Wed, 05 Nov 2008 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/11/05/238864.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/238864.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/11/05/238864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/238864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/238864.html</trackback:ping><description><![CDATA[很多人对二级缓存都不太了解，或者是有错误的认识，我一直想写一篇文章介绍一下hibernate的二级缓存的，今天终于忍不住了。
<br />
我的经验主要来自hibernate2.1版本，基本原理和3.0、3.1是一样的，请原谅我的顽固不化。
<br />
<br />
hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。
<br />
<br />
二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是
<br />
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
<br />
如果使用查询缓存，加上
<br />
hibernate.cache.use_query_cache=true
<br />
<br />
<br />
缓存可以简单的看成一个Map，通过key在缓存里面找value。
<br />
<br />
<strong>Class的缓存</strong>
<br />
对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是
iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select
id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置：
<br />
&amp;lt;cache usage="read-write"/&amp;gt;
<br />
如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml
<br />
&amp;lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500"
eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600"
overflowToDisk="true" /&amp;gt;
<br />
其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如
果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put
的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。
<br />
每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。
<br />
当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。
<br />
这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候
是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次
iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为
iterate没有什么用，总是会有1+N的问题。
<br />
（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select
id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择
若干字段，比iterate第一条select
id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是
list快。）
<br />
如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了
<br />
<br />
<strong>查询缓存</strong>
<br />
首先需要配置hibernate.cache.use_query_cache=true
<br />
如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了
<br />
&amp;lt;cache name="net.sf.hibernate.cache.StandardQueryCache"
<br />
&nbsp;&nbsp; maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
<br />
&nbsp;&nbsp; timeToLiveSeconds="7200" overflowToDisk="true"/&amp;gt;
<br />
&amp;lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache"
<br />
&nbsp;&nbsp; maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/&amp;gt;
<br />
然后
<br />
query.setCacheable(true);//激活查询缓存
<br />
query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选
<br />
第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它：
<br />
&amp;lt;cache name="myCacheRegion" maxElementsInMemory="10"
eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" /&amp;gt;
<br />
如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache
<br />
<br />
对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。
<br />
比如hql：
<br />
from Cat c where c.name like ?
<br />
生成大致如下的sql：
<br />
select * from cat c where c.name like ?
<br />
参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）：
<br />
select * from cat c where c.name like ? , parameter:tiger%
<br />
这样，保证了同样的查询、同样的参数等条件下具有一样的key。
<br />
现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方
法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的
行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是
一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。
<br />
可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。
<br />
<strong>这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！</strong>相同
条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和
class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么
list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时
间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意
了。
<br />
<br />
另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。
<br />
<br />
当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？
<br />
hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。
<br />
当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时
间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这
些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。
<br />
可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。
<br />
<br />
<strong>Collection缓存</strong>
<br />
需要在hbm的collection里面设置
<br />
&amp;lt;cache usage="read-write"/&amp;gt;
<br />
假如class是Cat，collection叫children，那么ehcache里面配置
<br />
&amp;lt;cache name="com.xxx.pojo.Cat.children"
<br />
&nbsp;&nbsp; maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
<br />
&nbsp;&nbsp; overflowToDisk="true" /&amp;gt;
<br />
Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。
<br />
这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。
<br />
<br />
<strong>缓存策略</strong>
<br />
只读缓存（read-only）：没有什么好说的
<br />
读/写缓存（read-write）:程序可能要的更新数据
<br />
不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好
<br />
事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过
<br />
<br />
读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。
<br />
在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。
<br />
不严格读写缓存不锁定缓存中的数据。
<br />
<br />
<br />
<strong>使用二级缓存的前置条件</strong>
<br />
你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过
hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删
除是不更新二级缓存的，但是据说3.1已经解决了这个问题。
<br />
这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。
<br />
SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是：
<br />
void evict(Class persistentClass)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict all entries from the second-level cache.
<br />
void evict(Class persistentClass, Serializable id)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict an entry from the second-level cache.
<br />
void evictCollection(String roleName)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict all entries from the second-level cache.
<br />
void evictCollection(String roleName, Serializable id)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict an entry from the second-level cache.
<br />
void evictQueries()
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict any query result sets cached in the default query cache region.
<br />
void evictQueries(String cacheRegion)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Evict any query result sets cached in the named query cache region.
<br />
不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用
evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class
persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的
jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？
<br />
<br />
----------------------------------------------------
<br />
<br />
<strong>总结：</strong>
<br />
不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。
<br />
如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。
<br />
在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为
底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。
<br />
<br />
<br />
终于写完了，好累&#8230;&#8230;
<img src ="http://www.blogjava.net/sway/aggbug/238864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-11-05 17:59 <a href="http://www.blogjava.net/sway/archive/2008/11/05/238864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0属性详解</title><link>http://www.blogjava.net/sway/archive/2008/11/05/238860.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Wed, 05 Nov 2008 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/11/05/238860.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/238860.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/11/05/238860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/238860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/238860.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">c3p0-config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">default-config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:&nbsp;3&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="acquireIncrement"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">3</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">定义在从数据库获取新连接失败后重复尝试的次数。Default:&nbsp;30&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="acquireRetryAttempts"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">30</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">两次连接中间隔时间，单位毫秒。Default:&nbsp;1000&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="acquireRetryDelay"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1000</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">连接关闭时默认将所有未提交的操作回滚。Default:&nbsp;false&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="autoCommitOnClose"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">c3p0将建一张名为Test的空表，并使用其自带的查询语句进行测试。如果定义了这个参数那么<br />
属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作，它将只供c3p0测试<br />
使用。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="automaticTestTable"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Test</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效<br />
保留，并在下次调用getConnection()的时候继续尝试获取连接。如果设为true，那么在尝试<br />
获取连接失败后该数据源将申明已断开并永久关闭。Default:&nbsp;false</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="breakAfterAcquireFailure"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">当连接池用完时客户端调用getConnection()后等待获取新连接的时间，超时后将抛出<br />
SQLException,如设为0则无限期等待。单位毫秒。Default:&nbsp;0&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="checkoutTimeout"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">100</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。<br />
Default:&nbsp;com.mchange.v2.c3p0.impl.DefaultConnectionTester</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="connectionTesterClassName"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">指定c3p0&nbsp;libraries的路径，如果（通常都是这样）在本地即可获得那么无需设置，默认null即可<br />
Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="factoryClassLocation"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">null</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">Strongly&nbsp;disrecommended.&nbsp;Setting&nbsp;this&nbsp;to&nbsp;true&nbsp;may&nbsp;lead&nbsp;to&nbsp;subtle&nbsp;and&nbsp;bizarre&nbsp;bugs.<br />
（文档原文）作者强烈建议不使用的一个属性</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="forceIgnoreUnresolvedTransactions"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">每60秒检查所有连接池中的空闲连接。Default:&nbsp;0&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="idleConnectionTestPeriod"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">60</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">初始化时获取三个连接，取值应在minPoolSize与maxPoolSize之间。Default:&nbsp;3&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="initialPoolSize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">3</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default:&nbsp;0&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxIdleTime"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">60</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">连接池中保留的最大连接数。Default:&nbsp;15&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxPoolSize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">15</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">JDBC的标准参数，用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements<br />
属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。<br />
如果maxStatements与maxStatementsPerConnection均为0，则缓存被关闭。Default:&nbsp;0</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxStatements"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">100</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default:&nbsp;0&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxStatementsPerConnection"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">c3p0是异步操作的，缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能<br />
通过多线程实现多个操作同时被执行。Default:&nbsp;3</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="numHelperThreads"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">3</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0<br />
的数据源时。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="overrideDefaultUser"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">root</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">与overrideDefaultUser参数对应使用的一个参数。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="overrideDefaultPassword"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">password</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">密码。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意：<br />
测试的表必须在初始数据源的时候就存在。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="preferredTestQuery"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">select&nbsp;id&nbsp;from&nbsp;test&nbsp;where&nbsp;id=1</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">用户修改系统配置参数执行前最多等待300秒。Default:&nbsp;300&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="propertyCycle"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">300</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的<br />
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable<br />
等方法来提升连接测试的性能。Default:&nbsp;false&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="testConnectionOnCheckout"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">如果设为true那么在取得连接的同时将校验连接的有效性。Default:&nbsp;false&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="testConnectionOnCheckin"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">true</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">用户名。Default:&nbsp;null</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="user"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">root</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数<br />
允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始<br />
广泛的被使用，所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到<br />
支持，但今后可能的版本可能不支持动态反射代理。Default:&nbsp;false</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="usesTraditionalReflectiveProxies"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">false</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="automaticTestTable"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">con_test</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="checkoutTimeout"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">30000</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="idleConnectionTestPeriod"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">30</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="initialPoolSize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">10</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxIdleTime"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">30</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxPoolSize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">25</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="minPoolSize"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">10</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxStatements"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">user-overrides&nbsp;</span><span style="color: #ff0000;">user</span><span style="color: #0000ff;">="swaldman"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">user-overrides</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">default-config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">named-config&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dumbTestConfig"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxStatements"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">200</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">user-overrides&nbsp;</span><span style="color: #ff0000;">user</span><span style="color: #0000ff;">="poop"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="maxStatements"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">300</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">user-overrides</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">named-config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">c3p0-config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
<img src ="http://www.blogjava.net/sway/aggbug/238860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-11-05 17:29 <a href="http://www.blogjava.net/sway/archive/2008/11/05/238860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 参数设置一览表 </title><link>http://www.blogjava.net/sway/archive/2008/11/05/238836.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Wed, 05 Nov 2008 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/11/05/238836.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/238836.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/11/05/238836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/238836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/238836.html</trackback:ping><description><![CDATA[<table summary="                Hibernate配置属性
    " border="1">
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">hibernate.dialect</font></tt></td>
            <td>一个Hibernate <tt><font face="新宋体">Dialect</font></tt>类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 <tt><font face="新宋体">full.classname.of.Dialect</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.show_sql</font></tt></td>
            <td>输出所有SQL语句到控制台. 有一个另外的选择是把<tt><font face="新宋体">org.hibernate.SQL</font></tt>这个log category设为<tt><font face="新宋体">debug</font></tt>。 eg. <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.format_sql</font></tt></td>
            <td>在log和console中打印出更漂亮的SQL。 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.default_schema</font></tt></td>
            <td>在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. 取值 <tt><font face="新宋体">SCHEMA_NAME</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.default_catalog</font></tt></td>
            <td>在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. 取值 <tt><font face="新宋体">CATALOG_NAME</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.session_factory_name</font></tt></td>
            <td><tt><font face="新宋体">SessionFactory</font></tt>创建后，将自动使用这个名字绑定到JNDI中. 取值 <tt><font face="新宋体">jndi/composite/name</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.max_fetch_depth</font></tt></td>
            <td>为单向关联(一对一, 多对一)的外连接抓取（outer join fetch）树设置最大深度. 值为<tt><font face="新宋体">0</font></tt>意味着将关闭默认的外连接抓取. 取值 建议在<tt><font face="新宋体">0</font></tt>到<tt><font face="新宋体">3</font></tt>之间取值 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.default_batch_fetch_size</font></tt></td>
            <td>为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为<tt><font face="新宋体">4</font></tt>, <tt><font face="新宋体">8</font></tt>, 和<tt><font face="新宋体">16</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.default_entity_mode</font></tt></td>
            <td>为由这个<tt><font face="新宋体">SessionFactory</font></tt>打开的所有Session指定默认的实体表现模式. 取值 <tt><font face="新宋体">dynamic-map</font></tt>, <tt><font face="新宋体">dom4j</font></tt>, <tt><font face="新宋体">pojo</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.order_updates</font></tt></td>
            <td>强制Hibernate按照被更新数据的主键，为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.generate_statistics</font></tt></td>
            <td>如果开启, Hibernate将收集有助于性能调节的统计数据. 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.use_identifer_rollback</font></tt></td>
            <td>如果开启, 在对象被删除时生成的标识属性将被重设为默认值. 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.use_sql_comments</font></tt></td>
            <td>如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为<tt><font face="新宋体">false</font></tt>. 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
    </tbody>
</table>
<div>
<p><strong>表&nbsp;3.4.&nbsp; Hibernate JDBC和连接(connection)属性 </strong></p>
<table summary="                Hibernate JDBC和连接(connection)属性
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.fetch_size</font></tt></td>
            <td>非零值，指定JDBC抓取数量的大小 (调用<tt><font face="新宋体">Statement.setFetchSize()</font></tt>). </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.batch_size</font></tt></td>
            <td>非零值，允许Hibernate使用JDBC2的批量更新. 取值 建议取<tt><font face="新宋体">5</font></tt>到<tt><font face="新宋体">30</font></tt>之间的值 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.batch_versioned_data</font></tt></td>
            <td>如果你想让你的JDBC驱动从<tt><font face="新宋体">executeBatch()</font></tt>返回正确的行计数 , 那么将此属性设为<tt><font face="新宋体">true</font></tt>(开启这个选项通常是安全的). 同时，Hibernate将为自动版本化的数据使用批量DML. 默认值为<tt><font face="新宋体">false</font></tt>. eg. <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.factory_class</font></tt></td>
            <td>选择一个自定义的<tt><font face="新宋体">Batcher</font></tt>. 多数应用程序不需要这个配置属性. eg. <tt><font face="新宋体">classname.of.Batcher</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.use_scrollable_resultset</font></tt></td>
            <td>允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时，这个选项才是必要的, 否则Hibernate会使用连接的元数据. 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.use_streams_for_binary</font></tt></td>
            <td>在JDBC读写<tt><font face="新宋体">binary (二进制)</font></tt>或<tt><font face="新宋体">serializable (可序列化)</font></tt> 的类型时使用流(stream)(系统级属性). 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jdbc.use_get_generated_keys</font></tt></td>
            <td>在数据插入数据库之后，允许使用JDBC3 <tt><font face="新宋体">PreparedStatement.getGeneratedKeys()</font></tt> 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题，请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. 取值 <tt><font face="新宋体">true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.connection.provider_class</font></tt></td>
            <td>自定义<tt><font face="新宋体">ConnectionProvider</font></tt>的类名, 此类用来向Hibernate提供JDBC连接. 取值 <tt><font face="新宋体">classname.of.ConnectionProvider</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.connection.isolation</font></tt></td>
            <td>设置JDBC事务隔离级别. 查看<tt><font face="新宋体">java.sql.Connection</font></tt>来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 取值 <tt><font face="新宋体">1, 2, 4, 8</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.connection.autocommit</font></tt></td>
            <td>允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.connection.release_mode</font></tt></td>
            <td>指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用<tt><font face="新宋体">after_statement</font></tt>, 这样在每次JDBC调用后，都会主动的释放连接. 对于非JTA的连接, 使用<tt><font face="新宋体">after_transaction</font></tt>在每个事务结束时释放连接是合理的. <tt><font face="新宋体">auto</font></tt>将为JTA和CMT事务策略选择<tt><font face="新宋体">after_statement</font></tt>, 为JDBC事务策略选择<tt><font face="新宋体">after_transaction</font></tt>. 取值 <tt><font face="新宋体">on_close</font></tt> | <tt><font face="新宋体">after_transaction</font></tt> | <tt><font face="新宋体">after_statement</font></tt> | <tt><font face="新宋体">auto</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.connection.<em>&lt;propertyName&gt;</em></font></tt></td>
            <td>将JDBC属性<tt><font face="新宋体">propertyName</font></tt>传递到<tt><font face="新宋体">DriverManager.getConnection()</font></tt>中去. </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.jndi.<em>&lt;propertyName&gt;</em></font></tt></td>
            <td>将属性<tt><font face="新宋体">propertyName</font></tt>传递到JNDI <tt><font face="新宋体">InitialContextFactory</font></tt>中去. </td>
        </tr>
    </tbody>
</table>
</div>
<div>
<p><strong>表&nbsp;3.5.&nbsp; Hibernate缓存属性 </strong></p>
<table summary="                Hibernate缓存属性
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.provider_class</font></tt></td>
            <td>自定义的<tt><font face="新宋体">CacheProvider</font></tt>的类名. 取值 <tt><font face="新宋体">classname.of.CacheProvider</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.use_minimal_puts</font></tt></td>
            <td>以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中，这个设置对的集群缓存非常有用, 对集群缓存的实现而言，默认是开启的. 取值 <tt><font face="新宋体">true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.use_query_cache</font></tt></td>
            <td>允许查询缓存, 个别查询仍然需要被设置为可缓存的. 取值 <tt><font face="新宋体">true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.use_second_level_cache</font></tt></td>
            <td>能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<tt><font face="新宋体">&lt;cache&gt;</font></tt>的类，会默认开启二级缓存. 取值 <tt><font face="新宋体">true|false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.query_cache_factory</font></tt></td>
            <td>自定义实现<tt><font face="新宋体">QueryCache</font></tt>接口的类名, 默认为内建的<tt><font face="新宋体">StandardQueryCache</font></tt>. 取值 <tt><font face="新宋体">classname.of.QueryCache</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.region_prefix</font></tt></td>
            <td>二级缓存区域名的前缀. 取值 <tt><font face="新宋体">prefix</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cache.use_structured_entries</font></tt></td>
            <td>强制Hibernate以更人性化的格式将数据存入二级缓存. 取值 <tt><font face="新宋体">true|false</font></tt> </td>
        </tr>
    </tbody>
</table>
</div>
<div>
<p><strong>表&nbsp;3.6.&nbsp; Hibernate事务属性 </strong></p>
<table summary="                Hibernate事务属性
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">hibernate.transaction.factory_class</font></tt></td>
            <td>一个<tt><font face="新宋体">TransactionFactory</font></tt>的类名, 用于Hibernate <tt><font face="新宋体">Transaction</font></tt> API (默认为<tt><font face="新宋体">JDBCTransactionFactory</font></tt>). 取值 <tt><font face="新宋体">classname.of.TransactionFactory</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">jta.UserTransaction</font></tt></td>
            <td>一个JNDI名字，被<tt><font face="新宋体">JTATransactionFactory</font></tt>用来从应用服务器获取JTA <tt><font face="新宋体">UserTransaction</font></tt>. 取值 <tt><font face="新宋体">jndi/composite/name</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.transaction.manager_lookup_class</font></tt></td>
            <td>一个<tt><font face="新宋体">TransactionManagerLookup</font></tt>的类名 - 当使用JVM级缓存，或在JTA环境中使用hilo生成器的时候需要该类. 取值 <tt><font face="新宋体">classname.of.TransactionManagerLookup</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.transaction.flush_before_completion</font></tt></td>
            <td>如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.transaction.auto_close_session</font></tt></td>
            <td>如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
    </tbody>
</table>
</div>
<div>
<p><strong>表&nbsp;3.7.&nbsp; 其他属性 </strong></p>
<table summary="                其他属性
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>属性名 </th>
            <th>用途 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">hibernate.current_session_context_class</font></tt></td>
            <td>为"当前" <tt><font face="新宋体">Session</font></tt>指定一个(自定义的)策略。eg. <tt><font face="新宋体">jta</font></tt> | <tt><font face="新宋体">thread</font></tt> | <tt><font face="新宋体">custom.Class</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.query.factory_class</font></tt></td>
            <td>选择HQL解析器的实现. 取值 <tt><font face="新宋体">org.hibernate.hql.ast.ASTQueryTranslatorFactory</font></tt> or <tt><font face="新宋体">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.query.substitutions</font></tt></td>
            <td>将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). 取值 <tt><font face="新宋体">hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.hbm2ddl.auto</font></tt></td>
            <td>在<tt><font face="新宋体">SessionFactory</font></tt>创建时，自动检查数据库结构，或者将数据库schema的DDL导出到数据库. 使用 <tt><font face="新宋体">create-drop</font></tt>时,在显式关闭<tt><font face="新宋体">SessionFactory</font></tt>时，将drop掉数据库schema. 取值 <tt><font face="新宋体">validate</font></tt> | <tt><font face="新宋体">update</font></tt> | <tt><font face="新宋体">create</font></tt> | <tt><font face="新宋体">create-drop</font></tt> </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">hibernate.cglib.use_reflection_optimizer</font></tt></td>
            <td>开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在<tt><font face="新宋体">hibernate.cfg.xml</font></tt>中设置此属性. 取值 <tt><font face="新宋体">true</font></tt> | <tt><font face="新宋体">false</font></tt> </td>
        </tr>
    </tbody>
</table>
</div>
<div>
<div>
<div>
<div>
<h3>3.4.1.&nbsp; SQL方言 </h3>
</div>
</div>
</div>
<p>你应当总是为你的数据库将<tt><font face="新宋体">hibernate.dialect</font></tt>属性设置成正确的 <tt><font face="新宋体">org.hibernate.dialect.Dialect</font></tt>子类. 如果你指定一种方言, Hibernate将为上面列出的一些属性使用合理的默认值, 为你省去了手工指定它们的功夫. </p>
<div>
<p><strong>表&nbsp;3.8.&nbsp; Hibernate SQL方言 (<tt><font face="新宋体">hibernate.dialect</font></tt>) </strong></p>
<table summary="                    Hibernate SQL方言 (hibernate.dialect)
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>RDBMS</th>
            <th>方言 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>DB2</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.DB2Dialect</font></tt></td>
        </tr>
        <tr>
            <td>DB2 AS/400</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.DB2400Dialect</font></tt></td>
        </tr>
        <tr>
            <td>DB2 OS390</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.DB2390Dialect</font></tt></td>
        </tr>
        <tr>
            <td>PostgreSQL</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.PostgreSQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.MySQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL with InnoDB</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.MySQLInnoDBDialect</font></tt></td>
        </tr>
        <tr>
            <td>MySQL with MyISAM</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.MySQLMyISAMDialect</font></tt></td>
        </tr>
        <tr>
            <td>Oracle (any version)</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.OracleDialect</font></tt></td>
        </tr>
        <tr>
            <td>Oracle 9i/10g</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.Oracle9Dialect</font></tt></td>
        </tr>
        <tr>
            <td>Sybase</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.SybaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Sybase Anywhere</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.SybaseAnywhereDialect</font></tt></td>
        </tr>
        <tr>
            <td>Microsoft SQL Server</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.SQLServerDialect</font></tt></td>
        </tr>
        <tr>
            <td>SAP DB</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.SAPDBDialect</font></tt></td>
        </tr>
        <tr>
            <td>Informix</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.InformixDialect</font></tt></td>
        </tr>
        <tr>
            <td>HypersonicSQL</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.HSQLDialect</font></tt></td>
        </tr>
        <tr>
            <td>Ingres</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.IngresDialect</font></tt></td>
        </tr>
        <tr>
            <td>Progress</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.ProgressDialect</font></tt></td>
        </tr>
        <tr>
            <td>Mckoi SQL</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.MckoiDialect</font></tt></td>
        </tr>
        <tr>
            <td>Interbase</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.InterbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Pointbase</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.PointbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>FrontBase</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.FrontbaseDialect</font></tt></td>
        </tr>
        <tr>
            <td>Firebird</td>
            <td><tt><font face="新宋体">org.hibernate.dialect.FirebirdDialect</font></tt></td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div>
<p><strong>表&nbsp;3.9.&nbsp; Hibernate日志类别 </strong></p>
<table summary="                    Hibernate日志类别
    " border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>类别 </th>
            <th>功能 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.SQL</font></tt></td>
            <td>在所有SQL DML语句被执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.type</font></tt></td>
            <td>为所有JDBC参数记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.tool.hbm2ddl</font></tt></td>
            <td>在所有SQL DDL语句执行时为它们记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.pretty</font></tt></td>
            <td>在session清洗(flush)时，为所有与其关联的实体(最多20个)的状态记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.cache</font></tt></td>
            <td>为所有二级缓存的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction</font></tt></td>
            <td>为事务相关的活动记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.jdbc</font></tt></td>
            <td>为所有JDBC资源的获取记录日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.hql.AST</font></tt></td>
            <td>在解析查询的时候,记录HQL和SQL的AST分析日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.secure</font></tt></td>
            <td>为JAAS认证请求做日志 </td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate</font></tt></td>
            <td>为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助) </td>
        </tr>
    </tbody>
</table>
</div>
<p><strong>表&nbsp;3.10.&nbsp;JTA TransactionManagers</strong></p>
<table summary="JTA TransactionManagers" border="1">
    <colgroup> <col> <col></colgroup>
    <thead>
        <tr>
            <th>Transaction工厂类 </th>
            <th align="center">应用程序服务器 </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.JBossTransactionManagerLookup</font></tt></td>
            <td align="center">JBoss</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.WeblogicTransactionManagerLookup</font></tt></td>
            <td align="center">Weblogic</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.WebSphereTransactionManagerLookup</font></tt></td>
            <td align="center">WebSphere</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</font></tt></td>
            <td align="center">WebSphere 6</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.OrionTransactionManagerLookup</font></tt></td>
            <td align="center">Orion</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.ResinTransactionManagerLookup</font></tt></td>
            <td align="center">Resin</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.JOTMTransactionManagerLookup</font></tt></td>
            <td align="center">JOTM</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.JOnASTransactionManagerLookup</font></tt></td>
            <td align="center">JOnAS</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.JRun4TransactionManagerLookup</font></tt></td>
            <td align="center">JRun4</td>
        </tr>
        <tr>
            <td><tt><font face="新宋体">org.hibernate.transaction.BESTransactionManagerLookup</font></tt></td>
            <td align="center">Borland ES</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/sway/aggbug/238836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-11-05 16:03 <a href="http://www.blogjava.net/sway/archive/2008/11/05/238836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Ecipse生成Javadoc乱码解决方法</title><link>http://www.blogjava.net/sway/archive/2008/11/05/238822.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Wed, 05 Nov 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/11/05/238822.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/238822.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/11/05/238822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/238822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/238822.html</trackback:ping><description><![CDATA[这里面有两个指定编码问题的参数<br />
1)&nbsp; -encoding charsetName<br />
2) -charset charsetName<br />
<br />
第一个参数表示javadoc 程序读取java源文件时候应该采用什么编码<br />
第二个参数表示javadoc 程序写html文件时采用的编码形式,并会在HTML中加入如下标签
<p>&nbsp;<font color="#ffffff">网管下载dl.bitscn.com</font> </p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">1</span> <img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> <span style="color: #0000ff;">&lt;!</span> <span style="color: #ff00ff;">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/html4/loose.dtd"</span> <span style="color: #0000ff;">&gt;</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #008000;">&lt;!--</span> <span style="color: #008000;">NewPage</span> <span style="color: #008000;">--&gt;</span><span style="color: #000000;"><font color="#ffffff"></font> <br />
</span><span style="color: #008080;">3</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #0000ff;">&lt;</span> <span style="color: #800000;">HTML</span> <span style="color: #0000ff;">&gt;</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #0000ff;">&lt;</span> <span style="color: #800000;">HEAD</span> <span style="color: #0000ff;">&gt;</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">5</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #008000;">&lt;!--</span> <span style="color: #008000;">&nbsp;Generated&nbsp;by&nbsp;javadoc&nbsp;(build&nbsp;1.5.0)&nbsp;on&nbsp;Thu&nbsp;Feb&nbsp;01&nbsp;21:10:10&nbsp;CST&nbsp;2007&nbsp;</span> <span style="color: #008000;">--&gt;</span>&nbsp;<span style="color: #000000;"> <br />
</span><span style="color: #008080;">6</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #008000;">&lt;!--</span> <span style="color: #008000;">-这下面的charset随编码的不同而不同,这里面为utf-8编码--</span> <span style="color: #008000;">--&gt;</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">7</span> <span style="color: #000000;"><img src="http://www.bitscn.com/upimg/allimg/071122/0242460.gif" alt="" align="top" /> </span><span style="color: #0000ff;">&lt;</span> <span style="color: #800000;">META&nbsp;</span> <span style="color: #ff0000;">http-equiv</span> <span style="color: #0000ff;">="Content-Type"</span> <span style="color: #ff0000;">&nbsp;content</span> <span style="color: #0000ff;">="text/html;&nbsp;charset=utf-8"</span> <span style="color: #0000ff;">&gt;</span> </div>
<br />
如果文件格式为UTF8格式的,可以采用如下形式进行Generate Javadoc:<br />
javadoc&nbsp; -encoding UTF-8 -charset UTF-8 &lt;other params&gt;
<img src ="http://www.blogjava.net/sway/aggbug/238822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sway/" target="_blank">Kevin.Zhong</a> 2008-11-05 14:53 <a href="http://www.blogjava.net/sway/archive/2008/11/05/238822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>