﻿<?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-随笔分类-hibernate</title><link>http://www.blogjava.net/sway/category/35514.html</link><description>彪悍的人生不需要解释，彪悍的代码不需要测试。</description><language>zh-cn</language><lastBuildDate>Fri, 16 Jan 2009 09:40:44 GMT</lastBuildDate><pubDate>Fri, 16 Jan 2009 09:40:44 GMT</pubDate><ttl>60</ttl><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>hibernate笔记</title><link>http://www.blogjava.net/sway/archive/2008/10/26/236743.html</link><dc:creator>Kevin.Zhong</dc:creator><author>Kevin.Zhong</author><pubDate>Sun, 26 Oct 2008 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/sway/archive/2008/10/26/236743.html</guid><wfw:comment>http://www.blogjava.net/sway/comments/236743.html</wfw:comment><comments>http://www.blogjava.net/sway/archive/2008/10/26/236743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sway/comments/commentRss/236743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sway/services/trackbacks/236743.html</trackback:ping><description><![CDATA[1.&lt;class&gt;元素的&lt;cache&gt;子元素表明hibernate会缓存当前对象的简单属性的值,但是它不会同时缓存该对象的集合属性.如果希望缓存集合属性的元素,必须在集合元素中加入&lt;cache&gt;子元素.<br />
<br />
2.经测试发现,hibernate在保存querycache结果集的时候,会保存相关联的数据.当在user对象上设置缓存时.<br />
假设:该条结果集的id为123<br />
select * from user where name = 'sway'<br />
hibernate不光保存该条sql语句的结果集,还会保存id=123的user对象(相当于select * from user where id=123).<br />
<br />
3.奇怪的问题，代码如下<br />
pMenuItem.getChilds().clear();hibernate延迟加载不能。<br />
<br />
改成<br />
if (!pMenuItem.getChilds().isEmpty()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; pMenuItem.getChilds().clear();<br />
}<br />
hibernate开始调数据库。原因不明。<br />
<br />
<img src ="http://www.blogjava.net/sway/aggbug/236743.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-10-26 19:48 <a href="http://www.blogjava.net/sway/archive/2008/10/26/236743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>