C3P0的介绍与使用



官方参考文档:https://www.mchange.com/projects/c3p0/

c3p0xml文件配置文档:https://www.mchange.com/projects/c3p0/#configuration_files


c3p0是一个易于使用的库,通过使用jdbc3规范定义的功能和jdbc2的可选扩展来增强传统JDBC驱动程序的“企业级”。从版本0.9.5开始,c3p0完全支持jdbc4规范。


特别是,c3p0提供了几种有用的服务:

一个类将传统的基于DriverManager的JDBC驱动程序适配到较新的javax.sql.DataSource方案以获取数据库连接。
DataSources背后的Connection和PreparedStatements透明池,可以“围绕”传统驱动程序或任意unpooled数据源。
图书馆努力获得正确的细节:

c3p0 DataSources既是可引用的也是可序列化的,因此适用于绑定到各种基于JNDI的命名服务。
当检入池中的连接和语句时,语句和结果集会被仔细清理,以防止当客户端使用懒惰但通用的资源管理策略清理其连接时资源耗尽。 (不要调皮。)
该库采用由JDBC 2和3规范定义的方法(即使这些方法与库作者的偏好相冲突)。 DataSources以JavaBean风格编写,提供所有必需的和大部分可选属性(以及一些非标准属性)以及无参数构造函数。所有JDBC定义的内部接口都已实现(ConnectionPoolDataSource,PooledConnection,ConnectionEvent生成连接等)。您可以将c3p0类与兼容的第三方实现混合使用(尽管并非所有c3p0功能都可以与ConnectionPoolDataSource的外部实现一起使用)。
c3p0希望能够提供更适合大批量“J2EE企业应用程序”使用的DataSource实现。请提供反馈,错误修复等!
<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/htmledit_views-0a60691e80.css">
            <div class="htmledit_views" deep="5">
                
<p>【引用请注明出处<a href="http://blog.csdn.net/bhq2010/article/details/9219947" target="_blank">http://blog.csdn.net/bhq2010/article/details/9219947</a>】</p>
<p>基本的用法在<a href="http://www.mchange.com/projects/c3p0/#quickstart" target="_blank">http://www.mchange.com/projects/c3p0/#quickstart</a>,以及<a href="http://www.mchange.com/projects/c3p0/#using_c3p0" target="_blank">http://www.mchange.com/projects/c3p0/#using_c3p0</a>中。</p>
<p>一个示例的配置文件如下:</p>
<p>【引用请注明出处<a href="http://blog.csdn.net/bhq2010/article/details/9219947" target="_blank">http://blog.csdn.net/bhq2010/article/details/9219947</a>】<br data-filtered="filtered"></p>
<p></p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 224px; top: 768px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent"></div><div style="position: absolute; left: 224px; top: 768px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?></span><span>  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">c3p0-config</span><span class="tag">></span><span>  </span></span></li><li class=""><span>    <span class="tag"><</span><span class="tag-name">default-config</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"automaticTestTable"</span><span class="tag">></span><span>t_c3p0_test</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"checkoutTimeout"</span><span class="tag">></span><span>10000</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"idleConnectionTestPeriod"</span><span class="tag">></span><span>10</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"initialPoolSize"</span><span class="tag">></span><span>5</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxIdleTime"</span><span class="tag">></span><span>600</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxPoolSize"</span><span class="tag">></span><span>20</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"minPoolSize"</span><span class="tag">></span><span>2</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatements"</span><span class="tag">></span><span>60</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatementsPerConnection"</span><span class="tag">></span><span>3</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">user-overrides</span><span> </span><span class="attribute">user</span><span>=</span><span class="attribute-value">"test-user"</span><span class="tag">></span><span>  </span></span></li><li class=""><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxPoolSize"</span><span class="tag">></span><span>10</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"minPoolSize"</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatements"</span><span class="tag">></span><span>0</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"></</span><span class="tag-name">user-overrides</span><span class="tag">></span><span>  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>    <span class="tag"></</span><span class="tag-name">default-config</span><span class="tag">></span><span>  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>    <span class="tag"><</span><span class="tag-name">named-config</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"metkb"</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"acquireIncrement"</span><span class="tag">></span><span>20</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"initialPoolSize"</span><span class="tag">></span><span>10</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"minPoolSize"</span><span class="tag">></span><span>10</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxPoolSize"</span><span class="tag">></span><span>100</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatements"</span><span class="tag">></span><span>0</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>        <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatementsPerConnection"</span><span class="tag">></span><span>10</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>  </span></li><li class=""><span>        <span class="comments"><!-- he's important, but there's only one of him --></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"><</span><span class="tag-name">user-overrides</span><span> </span><span class="attribute">user</span><span>=</span><span class="attribute-value">"master-of-the-universe"</span><span class="tag">></span><span>  </span></span></li><li class=""><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"acquireIncrement"</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"initialPoolSize"</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"minPoolSize"</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxPoolSize"</span><span class="tag">></span><span>5</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class=""><span>            <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"maxStatementsPerConnection"</span><span class="tag">></span><span>50</span><span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span>        <span class="tag"></</span><span class="tag-name">user-overrides</span><span class="tag">></span><span>  </span></span></li><li class=""><span>    <span class="tag"></</span><span class="tag-name">named-config</span><span class="tag">></span><span>  </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">c3p0-config</span><span class="tag">></span><span>  </span></span></li></ol></div><pre class="html" name="code" style="display: none;"><?xml version="1.0" encoding="UTF-8"?>

<c3p0-config>
	<default-config>
		<property name="automaticTestTable">t_c3p0_test</property>
		<property name="checkoutTimeout">10000</property>
		<property name="idleConnectionTestPeriod">10</property>
		<property name="initialPoolSize">5</property>
		<property name="maxIdleTime">600</property>
		<property name="maxPoolSize">20</property>
		<property name="minPoolSize">2</property>
		<property name="maxStatements">60</property>
		<property name="maxStatementsPerConnection">3</property>

		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>

	</default-config>

	<named-config name="metkb">
		<property name="acquireIncrement">20</property>
		<property name="initialPoolSize">10</property>
		<property name="minPoolSize">10</property>
		<property name="maxPoolSize">100</property>

		<property name="maxStatements">0</property>
		<property name="maxStatementsPerConnection">10</property>

		<!-- he's important, but there's only one of him -->
		<user-overrides user="master-of-the-universe">
			<property name="acquireIncrement">1</property>
			<property name="initialPoolSize">1</property>
			<property name="minPoolSize">1</property>
			<property name="maxPoolSize">5</property>
			<property name="maxStatementsPerConnection">50</property>
		</user-overrides>
	</named-config>
</c3p0-config></pre>放在eclipse Web工程的src目录下即可(eclipse会将该目录下的配置文件复制到tomcat的webapps/XXX/WEB-INF/classes下)
<p></p>
<p>一个C3P0的单例的示例代码如下(连接池的单例并不妨碍并发,因为从连接池中取连接并不费时,而且取出的连接是线程安全的):</p>
<p>【引用请注明出处<a href="http://blog.csdn.net/bhq2010/article/details/9219947" target="_blank">http://blog.csdn.net/bhq2010/article/details/9219947</a>】<br data-filtered="filtered"></p>
<p></p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 224px; top: 1705px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent"></div><div style="position: absolute; left: 224px; top: 1705px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> cn.edu.ruc.metkb.util;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="keyword">import</span><span> java.beans.PropertyVetoException;  </span></span></li><li class=""><span><span class="keyword">import</span><span> java.sql.Connection;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> java.sql.ResultSet;  </span></span></li><li class=""><span><span class="keyword">import</span><span> java.sql.SQLException;  </span></span></li><li class="alt"><span><span class="keyword">import</span><span> java.sql.Statement;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="keyword">import</span><span> com.mchange.v2.c3p0.ComboPooledDataSource;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> PooledDBA </span><span class="keyword">implements</span><span> DBA  </span></span></li><li class=""><span>{  </span></li><li class="alt"><span>    <span class="keyword">private</span><span> ComboPooledDataSource cpds = </span><span class="keyword">null</span><span>;  </span></span></li><li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> Log dblog = </span><span class="keyword">null</span><span>;  </span></span></li><li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String DBClassName = </span><span class="keyword">null</span><span>;  </span></span></li><li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String DBName = </span><span class="keyword">null</span><span>;  </span></span></li><li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String DBUrl = </span><span class="keyword">null</span><span>;  </span></span></li><li class=""><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String DBUser = </span><span class="keyword">null</span><span>;  </span></span></li><li class="alt"><span>    <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String DBPassword = </span><span class="keyword">null</span><span>;  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>    <span class="keyword">protected</span><span> PooledDBA()  </span></span></li><li class=""><span>    {  </span></li><li class="alt"><span>        cpds = <span class="keyword">new</span><span> ComboPooledDataSource(</span><span class="string">"metkb"</span><span>);  </span></span></li><li class=""><span>        <span class="keyword">try</span><span>  </span></span></li><li class="alt"><span>        {  </span></li><li class=""><span>            cpds.setDriverClass( DBClassName );  </span></li><li class="alt"><span>        }  </span></li><li class=""><span>        <span class="keyword">catch</span><span> (PropertyVetoException e)  </span></span></li><li class="alt"><span>        {  </span></li><li class=""><span>            dblog.exception(e);  </span></li><li class="alt"><span>        }             </span></li><li class=""><span>        cpds.setJdbcUrl( DBUrl + DBName);  </span></li><li class="alt"><span>        cpds.setUser(DBUser);                                    </span></li><li class=""><span>        cpds.setPassword(DBPassword);  </span></li><li class="alt"><span>    }  </span></li><li class=""><span>  </span></li><li class="alt"><span>    <span class="keyword">static</span><span>  </span></span></li><li class=""><span>    {  </span></li><li class="alt"><span>        <span class="keyword">try</span><span>  </span></span></li><li class=""><span>        {  </span></li><li class="alt"><span>            DBClassName = ConfigFactory.getInstance().get(<span class="string">"db.classname"</span><span>);  </span></span></li><li class=""><span>            DBName = ConfigFactory.getInstance().get(<span class="string">"db.name"</span><span>);  </span></span></li><li class="alt"><span>            DBUrl = ConfigFactory.getInstance().get(<span class="string">"db.url"</span><span>);  </span></span></li><li class=""><span>            DBUser = ConfigFactory.getInstance().get(<span class="string">"db.user"</span><span>);  </span></span></li><li class="alt"><span>            DBPassword = ConfigFactory.getInstance().get(<span class="string">"db.password"</span><span>);  </span></span></li><li class=""><span>            dblog = LogFactory.getInstance().getLog(<span class="string">"db"</span><span>);  </span></span></li><li class="alt"><span>        }  </span></li><li class=""><span>        <span class="keyword">catch</span><span> (Exception e)  </span></span></li><li class="alt"><span>        {  </span></li><li class=""><span>            e.printStackTrace();  </span></li><li class="alt"><span>        }  </span></li><li class=""><span>    }  </span></li><li class="alt"><span>  </span></li><li class=""><span>    <span class="annotation">@Override</span><span>  </span></span></li><li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">synchronized</span><span> Connection getConnection() </span><span class="keyword">throws</span><span> SQLException, ClassNotFoundException, InterruptedException  </span></span></li><li class=""><span>    {  </span></li><li class="alt"><span>        <span class="keyword">return</span><span> cpds.getConnection();  </span></span></li><li class=""><span>    }  </span></li><li class="alt"><span>  </span></li><li class=""><span>    <span class="annotation">@Override</span><span>  </span></span></li><li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">synchronized</span><span> </span><span class="keyword">void</span><span> close(Connection conn)  </span></span></li><li class=""><span>    {  </span></li><li class="alt"><span>        <span class="keyword">try</span><span>  </span></span></li><li class=""><span>        {  </span></li><li class="alt"><span>            <span class="keyword">if</span><span> (conn != </span><span class="keyword">null</span><span>)  </span></span></li><li class=""><span>            {  </span></li><li class="alt"><span>                conn.close();  </span></li><li class=""><span>                conn = <span class="keyword">null</span><span>;  </span></span></li><li class="alt"><span>            }  </span></li><li class=""><span>        }  </span></li><li class="alt"><span>        <span class="keyword">catch</span><span> (SQLException e)  </span></span></li><li class=""><span>        {  </span></li><li class="alt"><span>            dblog.exception(e);  </span></li><li class=""><span>        }  </span></li><li class="alt"><span>    }  </span></li><li class=""><span>      </span></li><li class="alt"><span>    <span class="annotation">@Override</span><span>  </span></span></li><li class=""><span>    <span class="keyword">public</span><span> </span><span class="keyword">synchronized</span><span> </span><span class="keyword">void</span><span> close(Statement stat)  </span></span></li><li class="alt"><span>    {  </span></li><li class=""><span>        <span class="keyword">try</span><span>  </span></span></li><li class="alt"><span>        {  </span></li><li class=""><span>            <span class="keyword">if</span><span> (stat != </span><span class="keyword">null</span><span>)  </span></span></li><li class="alt"><span>            {  </span></li><li class=""><span>                stat.close();  </span></li><li class="alt"><span>                stat = <span class="keyword">null</span><span>;  </span></span></li><li class=""><span>            }  </span></li><li class="alt"><span>        }  </span></li><li class=""><span>        <span class="keyword">catch</span><span> (SQLException e)  </span></span></li><li class="alt"><span>        {  </span></li><li class=""><span>            dblog.exception(e);  </span></li><li class="alt"><span>        }  </span></li><li class=""><span>    }  </span></li><li class="alt"><span>      </span></li><li class=""><span>    <span class="annotation">@Override</span><span>  </span></span></li><li class="alt"><span>    <span class="keyword">public</span><span> </span><span class="keyword">synchronized</span><span> </span><span class="keyword">void</span><span> close(ResultSet rest)  </span></span></li><li class=""><span>    {  </span></li><li class="alt"><span>        <span class="keyword">try</span><span>  </span></span></li><li class=""><span>        {  </span></li><li class="alt"><span>            <span class="keyword">if</span><span> (rest != </span><span class="keyword">null</span><span>)  </span></span></li><li class=""><span>            {  </span></li><li class="alt"><span>                rest.close();  </span></li><li class=""><span>                rest = <span class="keyword">null</span><span>;  </span></span></li><li class="alt"><span>            }  </span></li><li class=""><span>        }  </span></li><li class="alt"><span>        <span class="keyword">catch</span><span> (SQLException e)  </span></span></li><li class=""><span>        {  </span></li><li class="alt"><span>            dblog.exception(e);  </span></li><li class=""><span>        }  </span></li><li class="alt"><span>    }  </span></li><li class=""><span>}  </span></li></ol></div><pre class="java" name="code" style="display: none;">package cn.edu.ruc.metkb.util;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class PooledDBA implements DBA
{
	private ComboPooledDataSource cpds = null;
	private static Log dblog = null;
	private static String DBClassName = null;
	private static String DBName = null;
	private static String DBUrl = null;
	private static String DBUser = null;
	private static String DBPassword = null;

	protected PooledDBA()
	{
		cpds = new ComboPooledDataSource("metkb");
		try
		{
			cpds.setDriverClass( DBClassName );
		}
		catch (PropertyVetoException e)
		{
			dblog.exception(e);
		}           
		cpds.setJdbcUrl( DBUrl + DBName);
		cpds.setUser(DBUser);                                  
		cpds.setPassword(DBPassword);
	}

	static
	{
		try
		{
			DBClassName = ConfigFactory.getInstance().get("db.classname");
			DBName = ConfigFactory.getInstance().get("db.name");
			DBUrl = ConfigFactory.getInstance().get("db.url");
			DBUser = ConfigFactory.getInstance().get("db.user");
			DBPassword = ConfigFactory.getInstance().get("db.password");
			dblog = LogFactory.getInstance().getLog("db");
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	@Override
	public synchronized Connection getConnection() throws SQLException, ClassNotFoundException, InterruptedException
	{
		return cpds.getConnection();
	}

	@Override
	public synchronized void close(Connection conn)
	{
		try
		{
			if (conn != null)
			{
				conn.close();
				conn = null;
			}
		}
		catch (SQLException e)
		{
			dblog.exception(e);
		}
	}
	
	@Override
	public synchronized void close(Statement stat)
	{
		try
		{
			if (stat != null)
			{
				stat.close();
				stat = null;
			}
		}
		catch (SQLException e)
		{
			dblog.exception(e);
		}
	}
	
	@Override
	public synchronized void close(ResultSet rest)
	{
		try
		{
			if (rest != null)
			{
				rest.close();
				rest = null;
			}
		}
		catch (SQLException e)
		{
			dblog.exception(e);
		}
	}
}
</pre><br data-filtered="filtered"><br data-filtered="filtered">
【引用请注明出处<a href="http://blog.csdn.net/bhq2010/article/details/9219947" target="_blank">http://blog.csdn.net/bhq2010/article/details/9219947</a>】<br data-filtered="filtered"><p></p>
            </div>
                </div>

猜你喜欢

转载自blog.csdn.net/weixin_39746740/article/details/80656077