<code>package</code> <code>com.hanchao.test;</code>
<code>import</code> <code>java.lang.reflect.Field;</code>
<code>import</code> <code>java.sql.Connection;</code>
<code>import</code> <code>java.sql.ResultSet;</code>
<code>import</code> <code>java.sql.SQLException;</code>
<code>import</code> <code>java.sql.Statement;</code>
<code>import</code> <code>java.util.Scanner;</code>
<code>import</code> <code>javax.sql.DataSource;</code>
<code>import</code> <code>com.mchange.v2.c3p0.DataSources;</code>
<code>/***********************</code>
<code> </code><code>* @author:han </code>
<code> </code><code>* @version:1.0 </code>
<code> </code><code>* @created:2015-10-11 </code>
<code> </code><code>***********************</code>
<code> </code><code>*/</code>
<code>public</code> <code>class</code> <code>TestPool {</code>
<code> </code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code>
<code>/* Scanner input = new Scanner(System.in);</code>
<code> </code><code>System.out.println("請輸入賬号:");</code>
<code> </code><code>String name = input.next();</code>
<code> </code><code>System.out.println("請輸入密碼:");</code>
<code> </code><code>String pwd = input.next();</code>
<code> </code><code>System.out.println("請輸入金額:");</code>
<code> </code><code>float money = input.nextFloat();*/</code>
<code> </code><code>final String DRIVER = "com.mysql.jdbc.Driver";</code>
<code> </code><code>//final String URL = "jdbc:mysql://127.0.0.1:3306/mydb";</code>
<code> </code><code>//final String URL = "jdbc:mysql://localhost:3306/mydb";</code>
<code> </code><code>final String URL = "jdbc:mysql:///mydb";</code>
<code> </code><code>final String NAME = "root";</code>
<code> </code><code>final String PASSWORD = "root";</code>
<code> </code><code>Connection conn = null;</code>
<code> </code><code>Statement stat = null;</code>
<code> </code><code>ResultSet rs = null;</code>
<code> </code><code>try {</code>
<code> </code><code>//1.加載資料庫驅動</code>
<code> </code><code>Class.forName(DRIVER);</code>
<code> </code><code>//連接配接mysql資料庫</code>
<code> </code><code>DataSource unpooled = DataSources.unpooledDataSource(URL,NAME,PASSWORD);</code>
<code> </code><code>//建構一個連接配接池</code>
<code> </code><code>DataSource pooled = DataSources.pooledDataSource(unpooled);</code>
<code> </code><code>//2.擷取資料庫連接配接(first Time)</code>
<code> </code><code>conn = pooled.getConnection();</code>
<code> </code><code>System.out.println("1 con Class Type is :" + conn.getClass().getName());</code>
<code> </code><code>//取得内部的實際資料庫連接配接</code>
<code> </code><code>Object o1 = getInner(conn);</code>
<code> </code><code>System.out.println("1 Inner con Class Type is :" + o1.getClass().getName());</code>
<code> </code>
<code> </code><code>//3.擷取Statement對象</code>
<code> </code><code>stat = conn.createStatement();</code>
<code> </code><code>//4.執行SQL</code>
<code> </code><code>rs = stat.executeQuery(" select * from t_user where id = 13");</code>
<code> </code><code>while (rs.next()) {</code>
<code> </code><code>System.out.println(" username:" + rs.getString("username"));</code>
<code> </code><code>}</code>
<code> </code><code>//5.關閉連接配接</code>
<code> </code><code>rs.close();</code>
<code> </code><code>stat.close();</code>
<code> </code><code>conn.close();</code>
<code> </code><code>//6.等待連接配接傳回池中</code>
<code> </code><code>try {</code>
<code> </code><code>Thread.sleep(1000);</code>
<code> </code><code>} catch (InterruptedException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>//第二次擷取資料庫連接配接</code>
<code> </code><code>System.out.println("2 con Class Type is :" + conn.getClass().getName());</code>
<code> </code><code>Object o2 = getInner(conn);</code>
<code> </code><code>System.out.println("2 Inner con Class Type is :" + o2.getClass().getName());</code>
<code> </code><code>//擷取Statement對象</code>
<code>/*</code>
<code>// String sql = "delete from t_user where id = 13";</code>
<code>// String sql = "insert into t_user(username,address) values('tom1','USA1')";</code>
<code> </code><code>StringBuilder sql = new StringBuilder();</code>
<code> </code><code>sql.append("INSERT INTO t_account(username,`password`,money,`enable`) ");</code>
<code> </code><code>sql.append("VALUES ");</code>
<code> </code><code>sql.append("('"+name+"','"+pwd+"','"+money+"','1')");</code>
<code> </code><code>System.out.println("SQL:" + sql.toString());</code>
<code> </code><code>//執行SQL</code>
<code>// int rows = stat.executeUpdate(sql);</code>
<code> </code><code>int rows = stat.executeUpdate(sql.toString());</code>
<code> </code><code>if (rows > 0) {</code>
<code> </code><code>System.out.println("execute OK!!");</code>
<code> </code><code>} else {</code>
<code> </code><code>System.out.println("execute error !!");</code>
<code> </code><code>*/</code>
<code> </code><code>} </code><code>catch</code> <code>(ClassNotFoundException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>} </code><code>catch</code> <code>(SQLException e) {</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>if</code> <code>(stat != </code><code>null</code><code>) {</code>
<code> </code><code>stat.close();</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>catch</code> <code>(SQLException e) {</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>if</code> <code>(conn != </code><code>null</code><code>) {</code>
<code> </code><code>conn.close();</code>
<code> </code><code>}</code>
<code> </code><code>} </code><code>catch</code> <code>(SQLException e) {</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>private</code> <code>static</code> <code>Object getInner(Object conn) {</code>
<code> </code><code>Object object = </code><code>null</code><code>;</code>
<code> </code><code>Field f ;</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>f = conn.getClass().getDeclaredField(</code><code>"inner"</code><code>);</code>
<code> </code><code>f.setAccessible(</code><code>true</code><code>);</code>
<code> </code><code>object = f.get(conn);</code>
<code> </code><code>f.setAccessible(</code><code>false</code><code>);</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>} </code>
<code> </code><code>return</code> <code>object;</code>
<code>}</code>
結果:
<a href="http://s2.51cto.com/wyfs02/M02/86/B8/wKioL1fIQGzh6CUyAABTT7-zXU0450.png-wh_500x0-wm_3-wmp_4-s_1337418250.png" target="_blank"></a>
<a href="http://s1.51cto.com/wyfs02/M00/86/B8/wKiom1fIQHODclVYAA2YKJV4SbM573.jpg-wh_500x0-wm_3-wmp_4-s_461308283.jpg" target="_blank"></a>
首先,從資料庫連接配接池獲得一個連接配接。發現連接配接類型并不是mysql的資料庫連接配接,而是,com.mchange.v2.c3p0.impl.NewProxyConnection。通過類名,可以推測,從資料庫連接配接池中擷取的隻是一個代理。
當我們關閉.NewProxyConnection連接配接時,并沒有真正關閉連接配接,而隻是将資料庫連接配接放入連接配接池儲存,使得資料庫連接配接在連接配接池中得到複用。而從連接配接池傳回的NewProxyConnection對象,隻是對真實資料庫連接配接的包裝。
本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1845408,如需轉載請自行聯系原作者