﻿<?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-asdtiang-java study-文章分类-Hibernate study</title><link>http://www.blogjava.net/asdtiang/category/43547.html</link><description>交流学习JAVA </description><language>zh-cn</language><lastBuildDate>Tue, 12 Jan 2010 10:13:22 GMT</lastBuildDate><pubDate>Tue, 12 Jan 2010 10:13:22 GMT</pubDate><ttl>60</ttl><item><title>hibernate 连接池 转</title><link>http://www.blogjava.net/asdtiang/articles/309201.html</link><dc:creator>asdtiang</dc:creator><author>asdtiang</author><pubDate>Tue, 12 Jan 2010 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/asdtiang/articles/309201.html</guid><wfw:comment>http://www.blogjava.net/asdtiang/comments/309201.html</wfw:comment><comments>http://www.blogjava.net/asdtiang/articles/309201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/asdtiang/comments/commentRss/309201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asdtiang/services/trackbacks/309201.html</trackback:ping><description><![CDATA[<table class="FCK__ShowTableBorders" style="table-layout: fixed;" border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td class="m72"><font size="3">转载：Hibernate的三种连接池设置C3P0、Proxool和DBCP</font></td>
        </tr>
        <tr>
            <td height="5"> <br />
            </td>
        </tr>
        <tr>
            <td class="m740"><span class="postbody" twffan="done"><font size="3">以下三种连接都是以连接MySQl为例。 <br />
            <br />
            &lt;!-- JDBC驱动程序 --&gt; <br />
            &lt;property
            name="connection.driver_class"&gt;org.gjt.mm.mysql.Driver&lt;/property&gt;
            &lt;property
            name="connection.url"&gt;jdbc:mysql://localhost:3306/struts?useUnicode=true&amp;characterEncoding=GBK&lt;/property&gt;
            &lt;!-- 数据库用户名 --&gt; <br />
            &lt;property
            name="connection.username"&gt;root&lt;/property&gt; &lt;!-- 数据库密码 --&gt;
            <br />
            &lt;property
            name="connection.password"&gt;8888&lt;/property&gt; <br />
            <br />
            上面的一段配置，在c3p0和dbcp中，都是必需的，因为hibernate会根据上述的配置来生成connections，再交给c3p0或dbcp
            管理.但是，proxool则不能，虽然说服文档上说proxool也可以和hibernate结合,但我按照官方文档上的说明怎么配也出错，而且，到了
            sun和hibernat有的官方网站上问了几天，都没有一个人回复。后来我只能让proxool自身来生成连接，这在下面再讲。 <br />
            <br />
            <br />
            1 C3P0 <br />
            <br />
            只需在hibernate.cfg.xml中加入 <br />
            &lt;property name="c3p0.min_size"&gt;5&lt;/property&gt; <br />
            &lt;property name="c3p0.max_size"&gt;30&lt;/property&gt; <br />
            &lt;property name="c3p0.time_out"&gt;1800&lt;/property&gt; <br />
            &lt;property
            name="c3p0.max_statement"&gt;50&lt;/property&gt; <br />
            <br />
            还有在classespath中加入c3p0-0.8.4.5.jar <br />
            <br />
            <br />
            2 dbcp <br />
            <br />
            在hibernate.cfg.xml中加入 <br />
            <br />
            &lt;property name="dbcp.maxActive"&gt;100&lt;/property&gt; <br />
            &lt;property
            name="dbcp.whenExhaustedAction"&gt;1&lt;/property&gt; <br />
            &lt;property name="dbcp.maxWait"&gt;60000&lt;/property&gt; <br />
            &lt;property name="dbcp.maxIdle"&gt;10&lt;/property&gt; <br />
            <br />
            &lt;property
            name="dbcp.ps.maxActive"&gt;100&lt;/property&gt; <br />
            &lt;property
            name="dbcp.ps.whenExhaustedAction"&gt;1&lt;/property&gt; <br />
            &lt;property
            name="dbcp.ps.maxWait"&gt;60000&lt;/property&gt; <br />
            &lt;property name="dbcp.ps.maxIdle"&gt;10&lt;/property&gt; <br />
            <br />
            <br />
            还有在classespath中加入commons-pool-1.2.jar
            和commons-dbcp-1.2.1.jar. <br />
            <br />
            <br />
            3 proxool <br />
            <br />
            在hibernate.cfg.xml中加入 <br />
            <br />
            &lt;property
            name="proxool.pool_alias"&gt;pool1&lt;/property&gt; <br />
            &lt;property
            name="proxool.xml"&gt;ProxoolConf.xml&lt;/property&gt; <br />
            &lt;property
            name="connection.provider_class"&gt;net.sf.hibernate.connection.ProxoolConnectionProvider&lt;/property&gt;
            <br />
            <br />
            然后，在和hibernate.cfg.xml同一个目录下，加一个ProxoolConf.xml文件，内容为 <br />
            <br />
            &lt;?xml version="1.0" encoding="utf-8"?&gt; <br />
            &lt;!-- the proxool configuration can be embedded within
            your own application's. <br />
            Anything outside the "proxool" tag is ignored. --&gt; <br />
            &lt;something-else-entirely&gt; <br />
            &lt;proxool&gt; <br />
            &lt;alias&gt;pool1&lt;/alias&gt; <br />
            &lt;!--proxool只能管理由自己产生的连接--&gt; <br />
            &lt;driver-url&gt;jdbc:mysql://localhost:3306/struts?useUnicode=true&amp;characterEncoding=GBK&lt;/driver-url&gt;
            <br />
            &lt;driver-class&gt;org.gjt.mm.mysql.Driver&lt;/driver-class&gt; <br />
            &lt;driver-properties&gt; <br />
            &lt;property name="user" value="root"/&gt; <br />
            &lt;property name="password" value="8888"/&gt; <br />
            &lt;/driver-properties&gt; <br />
            &lt;!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--&gt;
            <br />
            &lt;house-keeping-sleep-time&gt;90000&lt;/house-keeping-sleep-time&gt; <br />
            &lt;!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--&gt; <br />
            &lt;maximum-new-connections&gt;20&lt;/maximum-new-connections&gt; <br />
            &lt;!-- 最少保持的空闲连接数--&gt; <br />
            &lt;prototype-count&gt;5&lt;/prototype-count&gt; <br />
            &lt;!--
            允许最大连接数,超过了这个连接，再有请求时，就排在队列中等候，最大的等待请求数由maximum-new-connections决定--&gt; <br />
            &lt;maximum-connection-count&gt;100&lt;/maximum-connection-count&gt; <br />
            &lt;!-- 最小连接数--&gt; <br />
            &lt;minimum-connection-count&gt;10&lt;/minimum-connection-count&gt; <br />
            &lt;/proxool&gt; <br />
            &lt;/something-else-entirely&gt; <br />
            <br />
            <br />
            并在classespath中加入proxool-0.8.3.jar <br />
            <br />
            <br />
            <br />
            结论： <br />
            <br />
            由于在hibernate3.0中，已经不再支持dbcp了，hibernate的作者在hibernate.org中，明确指出在实践中发现dbcp有
            BUG,在某些种情会产生很多空连接不能释放，所以抛弃了对dbcp的支持。我不知是否在dbcp最新版本中解决了这个问题，我以前在一个访问量不大的项
            目中用过dbcp，运行了一年多都没出现问题。不过在网上的确也有不少网友指出dbcp在大型的应用中会出现不稳定的情况。所以在真相未经证实的情况下，
            我觉得对dbcp持慎重的态度。 <br />
            <br />
            至于c3p0，有评论说它的算法不是最优的，而且，我在matrix中，见到有网友做了一个实验，在同一项目中分别用了几个常用的连接池，然后测试其性
            能，发现c3p0占用资源比较大，效率也不高。 <br />
            <br />
            所以，基于上述原因，我才花两晚的时间去研究proxool的配置，proxool不少行家推荐使用，而且暂时来说，是负面评价是最少的一个。在三星中也
            有项目是用proxool的。</font></span></td>
        </tr>
    </tbody>
</table>
<div class="blog_content">Hibernate支持DBCP包进行数据库连接池的配置。简要说明配置过程： <br />
(仅仅是个人摸索，如有问题，欢迎指点) <br />
需要的包： <br />
Commons-Pool （下载地址：http://jakarta.apache.org/commons/pool/）
：提供一个一般对象池的接口，而且包含实现了通常池工具箱。 <br />
Commons-DBCP（下载地址：http://jakarta.apache.org/commons/dbcp/）
：提供数据库连接池服务。DBCP很聪明，把Commons-Pool和JDBC的driver封装起来，使达到连接池的目的。 <br />
<br />
Hibernate属性文件的配置参数 <br />
#连接池的最大活动个数 <br />
hibernate.dbcp.maxActive 100  <br />
#当连接池中的连接已经被耗尽的时候，DBCP将怎样处理( 0 = 失败, 1 = 等待, 2= 增长) <br />
hibernate.dbcp.whenExhaustedAction 1  <br />
#最大等待时间 <br />
hibernate.dbcp.maxWait 120000 <br />
#没有人用连接的时候，最大闲置的连接个数。 <br />
hibernate.dbcp.maxIdle 10 <br />
##以下是对prepared statement的处理，同上。 <br />
hibernate.dbcp.ps.maxActive 100 <br />
hibernate.dbcp.ps.whenExhaustedAction 1 <br />
hibernate.dbcp.ps.maxWait 120000 <br />
hibernate.dbcp.ps.maxIdle 10 <br />
<br />
## 可选，是否对池化的连接进行验证 <br />
#给出一条简单的sql语句进行验证 <br />
#hibernate.dbcp.validationQuery select 1 from dual <br />
#在取出连接时进行有效验证 <br />
#hibernate.dbcp.testOnBorrow true <br />
#在放回连接时进行有效验证 <br />
#hibernate.dbcp.testOnReturn false <br />
<br />
#Hibernate已经实现了DBCP Provider实现，别忘了在下面的键值去掉＃字符 <br />
hibernate.connection.provider_class
net.sf.hibernate.connection.DBCPConnectionProvider</div>
<img src ="http://www.blogjava.net/asdtiang/aggbug/309201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asdtiang/" target="_blank">asdtiang</a> 2010-01-12 18:00 <a href="http://www.blogjava.net/asdtiang/articles/309201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>