免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
自己做數(shù)據(jù)庫連接池(c3p0)

自己做數(shù)據(jù)庫連接池c3p0 


如何快速使用c3p0 - JDBC3 Connection and Statement Pooling
一、下載
從SourceForge 網(wǎng)站下載最新的版本 
http://sourceforge.net/projects/c3p0/

二、快速體驗(yàn)
把這一個(gè)文件lib/c3p0-0.9.1-pre9.jar復(fù)制到你的  CLASSPATH即可。

import com.mchange.v2.c3p0.*; 
... 
ComboPooledDataSource cpds = new ComboPooledDataSource(); 
cpds.setDriverClass( "org.postgresql.Driver" ); //loads the jdbc driver cpds.setJdbcUrl( "jdbc:postgresql://localhost/testdb" ); 
cpds.setUser("dbuser"); 
cpds.setPassword("dbpassword"); 
你還可以設(shè)置如下參數(shù)
cpds.setMaxStatements( 180 ); 
然后你就可以從cpds.getConnection()獲得連接了。

最后,執(zhí)行下面語句銷毀cpds.
DataSources.destroy( cpds ); 

三、建立自定義連接池工廠
為了適應(yīng)有多個(gè)數(shù)據(jù)源的單一系統(tǒng),現(xiàn)在定義在這個(gè)系統(tǒng)中使用key字符串來識(shí)別每一個(gè)數(shù)據(jù)源,如
oa - 識(shí)別 OA 系統(tǒng)
epr - 識(shí)別 ERP 系統(tǒng)
hr - 識(shí)別 HR 系統(tǒng)
等等
詳細(xì)代碼與注釋如下:
///////////////////////////////////////////////////////////////
package com.paipaiestore.database.c3p0;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.DataSources;
/**
 * 數(shù)據(jù)連接池工廠 
 * @author samland
 * @version 1.0, 2006-11
 */
public class DBPoolFactory {

 private static DBPoolFactory dbpoolFactory = new DBPoolFactory();
 /**
  * 連接池列表
  */
 private static Map poollist = new HashMap();

 private DBPoolFactory(){
  
 }
 
 public static DBPoolFactory getInstance(){
  return dbpoolFactory;
 }
 /**
  * 向連接池列表添加一個(gè)新的池化(Pooled)數(shù)據(jù)源
  * @param key 
  * @param configFile 配置文件名。為了簡化參數(shù)輸入與便于外部維護(hù),可以把配置好的文件傳入這里分析
  */
 public void add(String key, String configFile) {
  //read config from file, and build a dbpool
 }
 /**
  * 向連接池列表添加一個(gè)新的池化(Pooled)數(shù)據(jù)源
  * @param key
  * @param driver 數(shù)據(jù)連接驅(qū)動(dòng),如com.mysql.jdbc.Driver
  * @param url 連接串, 如jdbc:mysql://localhost/samland
  * @param username 數(shù)據(jù)庫連接用戶名,如samland
  * @param password 數(shù)據(jù)庫連接用戶密碼
  * @throws Exception
  */
 public void add(String key, String driver, String url, String username, String password) 
  throws Exception{
  if (key==null) throw new Exception("DBPool ‘key‘ CANNOT be null") ;
  
  Class.forName(driver);
  DataSource ds_unpooled = DataSources.unpooledDataSource(url, username, password); 
  DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled );
  if (poollist.containsKey(key)){
   poollist.remove(key); 
  }
  poollist.put(key, ds_pooled);
 }
 /**
  * 根據(jù)key字符串獲取連接池
  * @param key
  * @return DBPool 連接池
  * @throws Exception
  */
 public DBPool getDBPool(String key) throws Exception{
  if (key==null) throw new Exception("DBPool ‘key‘ CANNOT be null") ;
  DataSource ds = (DataSource)poollist.get(key);
  DBPool dbpool = new DBPool();
  dbpool.setDs_pooled(ds);
  return dbpool;
 }

}
///////////////////////////////////////////////////////////////

四、連接池的使用
通過DBPool來獲取數(shù)據(jù)庫連接 (jdbc connection)。
4.1 由DBPoolFactory工廠產(chǎn)生一個(gè)DBPool
4.2 同時(shí),DBPoolFactory工廠根據(jù)傳入的參數(shù)key向這個(gè)DBPool注入數(shù)據(jù)源
4.3 從DBPool產(chǎn)生線程內(nèi)的Connection
///////////////////////////////////////////////////////////////
package com.paipaiestore.database.c3p0;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

public class DBPool {
 /**
  * 數(shù)據(jù)庫連接。同一個(gè)線程使用同一個(gè)連接。
  */
 protected static ThreadLocal connection = new ThreadLocal();
 /**
  * 數(shù)據(jù)源,需由DBPoolFactory工廠注入
  */
 private DataSource ds_pooled;

 /**
  * 不能獨(dú)立構(gòu)造,必須從DBPoolFactory工廠產(chǎn)生
  */
 protected DBPool(){}
 
 /**
  * get 數(shù)據(jù)源
  * @return
  */
 public DataSource getDs_pooled() {
  return ds_pooled;
 }

 /**
  * 注入數(shù)據(jù)源
  * @param ds_pooled
  */
 public void setDs_pooled(DataSource ds_pooled) {
  this.ds_pooled = ds_pooled;
 }

 /**
  * 獲得數(shù)據(jù)庫連接
  * 同一個(gè)線程只返回相同的一個(gè)連接。
  * @return Connection
  * @throws SQLException
  */
 public Connection getConnection() throws SQLException{
  Connection con = (Connection)connection.get();
  if (con==null) {
   con = ds_pooled.getConnection();
   connection.set(con);
  }
  return con;
 }
}
///////////////////////////////////////////////////////////////

五、改進(jìn)線程內(nèi)數(shù)據(jù)庫連接的使用
為了適應(yīng)程序已經(jīng)使用開的jdbc事務(wù)管理,因此需要改進(jìn)DBPool成為Transaction類,
而原來的DBPool則縮減為如下代碼:
///////////////////////////////////////////////////////////////
public class DBPool {
 private DataSource ds_pooled;
 protected DBPool(){}
 public DataSource getDs_pooled() {
  return ds_pooled;
 }
 public void setDs_pooled(DataSource ds_pooled) {
  this.ds_pooled = ds_pooled;
 }
}
///////////////////////////////////////////////////////////////
package com.paipaiestore.database.c3p0;

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

import javax.sql.DataSource;

public class Transaction {
 /**
  * 數(shù)據(jù)庫連接。同一個(gè)線程使用同一個(gè)連接。
  */
 protected static ThreadLocal connection = new ThreadLocal();
 protected static boolean isInUsed = false;
 /**
  * 開始一個(gè)事務(wù)
  * 如果當(dāng)前線程的數(shù)據(jù)庫連接不存在,則會(huì)新獲得一個(gè)數(shù)據(jù)庫連接
  * @param key 
  * @throws Exception
  */
 public static void beginTransaction(String key) throws Exception{
  Connection conn = (Connection)connection.get();
  if (conn==null) {
   conn = createConnection(key);
            setConnection(conn);
  }
  conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
        conn.setAutoCommit(false);
        isInUsed = true;
 }
 /**
  * 提交一個(gè)事務(wù)
  * @throws SQLException
  */
 public static void commitTransaction() throws SQLException {
   Connection conn = (Connection)connection.get();
   conn.commit();
 }
 /**
  * 回滾一個(gè)事務(wù)
  * @throws SQLException
  */
 public static void rollbackTransaction() throws SQLException {
   Connection conn = (Connection)connection.get();
   conn.rollback();
 }
 public static boolean getIsInUsed() {
  return isInUsed;
 } 
 private static void closeConnection() {
  try {
   Connection conn = (Connection)connection.get();
   if (conn!=null) {
    connection.set(null);
    conn.close();
   }
  }catch(SQLException sqlexception) { 
   
  }
 } 
 private static void close(ResultSet rs){
  try
        {
            Statement st = rs.getStatement();
            Connection conn = st.getConnection();
            rs.close();
            st.close();
            conn.close();
        }
        catch(Exception exception) { }
 } 
 /**
  * 獲得數(shù)據(jù)庫連接
  * 同一個(gè)線程只返回相同的一個(gè)連接。
  * @return
  * @throws SQLException
  */
 public static Connection getConnection() throws SQLException {
        Connection conn = null;
        conn = (Connection)connection.get();
        if(conn == null)
            throw new NullPointerException();
        else
            return conn;
    } 
 
 private static void setConnection(Connection conn){
  connection.set(conn);
 } 
 /**
  * 獲得一個(gè)新的數(shù)據(jù)庫連接
  * @param key
  * @return Connection
  * @throws Exception
  */
 private static Connection createConnection(String key)
  throws Exception  {
  DBPoolFactory df = DBPoolFactory.getInstance();
  DataSource ds_pooled = df.getDBPool(key).getDs_pooled() ;
  Connection conn = ds_pooled.getConnection();
  df = null;
        return conn;
    }
}
///////////////////////////////////////////////////////////////
六、測試
///////////////////////////////////////////////////////////////
package samland;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.paipaiestore.database.c3p0.DBPoolFactory;
import com.paipaiestore.database.c3p0.Transaction;

public class TestTransaction {
 
 /**
  * @param args
  */
 public static void main(String[] args) {
  DBPoolFactory df = DBPoolFactory.getInstance();
  
  Connection con  = null;
  Statement  stmt = null;
  ResultSet  rs   = null;
  try {
   df.add("jxc","com.mysql.jdbc.Driver","jdbc:mysql://paipaiestore.com/samland","samland","*****");
   
   Transaction.beginTransaction("samland");
   con = Transaction.getConnection();
   stmt = con.createStatement();
   rs = stmt.executeQuery("SELECT * FROM users");
   while (rs.next())
   {
    System.out.print( rs.getString(1) );
    System.out.print( rs.getString(2) );
    System.out.println( rs.getString(3) );
   }
   Transaction.commitTransaction();
   df = null;
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
///////////////////////////////////////////////////////////////  

未經(jīng)嚴(yán)格測試,請使用者提出修改意見。

下一步需要增加檢測當(dāng)前連接池狀態(tài)的功能。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
四種連接數(shù)據(jù)庫的方法(DriverManager、DataSource子類、DBCP、c3...
[JDBC學(xué)習(xí)]學(xué)習(xí)使用jdk1.7中內(nèi)置數(shù)據(jù)庫Derby(三)
JAVA基礎(chǔ):將數(shù)據(jù)庫操作封裝到Javabean
數(shù)據(jù)庫連接JDBC連接池組件C3P0的使用方法
JNDI與JDBC比較以及連接池的技術(shù) - Do-websoftware - 博客園
proxool 簡單使用
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服