天天看點

c3po簡單了解

<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 &gt; 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,如需轉載請自行聯系原作者