c3p0數據庫連接池實例

jopen 10年前發布 | 120K 次閱讀 數據庫連接池 C3P0

這篇文章介紹的是,在普通Java Web工程中或者普通Java工程中使用c3p0數據庫連接池的實例,c3p0的jar文件包括3個。下面這個實例工程中,主要包括三個重要的文件:
C3P0ConnentionProvider.java       初始化c3p0數據庫連接池

SQLHelper.java         通過數據庫連接池,提供對數據庫的增刪改查功能

c3p0.properties  c3p0的配置文件

工程文件的截圖如下:

c3p0數據庫連接池實例

 

c3p0.properties文件內容如下:

    #jdbc基本信息
driverClass=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:orcl
user=scott
password=tigger

#c3p0連接池信息  
c3p0.minPoolSize=3  
c3p0.maxPoolSize=25  

#當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數  
c3p0.acquireIncrement=3  
#定義在從數據庫獲取新連接失敗后重復嘗試的次數  
c3p0.acquireRetryAttempts=60  
#兩次連接中間隔時間,單位毫秒  
c3p0.acquireRetryDelay=1000  
#連接關閉時默認將所有未提交的操作回滾   
c3p0.autoCommitOnClose=false  
#當連接池用完時客戶端調用getConnection()后等待獲取新連接的時間,超時后將拋出SQLException,如設為0則無限  
c3p0.checkoutTimeout=3000  
#每120秒檢查所有連接池中的空閑連接。Default: 0  
c3p0.idleConnectionTestPeriod=120  
#最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0    
c3p0.maxIdleTime=600  
#如果設為true那么在取得連接的同時將校驗連接的有效性。Default: false    
c3p0.testConnectionOnCheckin=false  
#如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。Default: 0  
c3p0.maxStatements=8  
#maxStatementsPerConnection定義了連接池內單個連接所擁有的最大緩存statements數。Default: 0  
c3p0.maxStatementsPerConnection=5  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959551852793026917" target="_blank"></a></div>

</div> </div>

 

C3P0ConnentionProvider.java文件內容如下:

    package com.hh.db;

import java.io.FileInputStream;  
import java.sql.Connection;  
import java.sql.SQLException;  
import java.util.Properties;  

import javax.sql.DataSource;  

import com.mchange.v2.c3p0.DataSources;  

/** 
 * c3p0連接池管理類 
 */  
public class C3P0ConnentionProvider {  

    private static final String JDBC_DRIVER = "driverClass";  
    private static final String JDBC_URL = "jdbcUrl";  

    private static DataSource ds;  
    /** 
     * 初始化連接池代碼塊 
     */  
    static {  
        initDBSource();  
    }  

    /** 
     * 初始化c3p0連接池 
     */  
    private static final void initDBSource() {  
        Properties c3p0Pro = new Properties();  
        try {  
            // 加載配置文件  
            String path = C3P0ConnentionProvider.class.getResource("/").getPath();  
            String websiteURL = (path.replace("/build/classes", "").replace("%20"," ").replace("classes/", "") + "c3p0.properties").replaceFirst("/", "");  
            FileInputStream in = new FileInputStream(websiteURL);  
            c3p0Pro.load(in);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  

        String drverClass = c3p0Pro.getProperty(JDBC_DRIVER);  
        if (drverClass != null) {  
            try {  
                // 加載驅動類  
                Class.forName(drverClass);  
            } catch (ClassNotFoundException e) {  
                e.printStackTrace();  
            }  

        }  

        Properties jdbcpropes = new Properties();  
        Properties c3propes = new Properties();  
        for (Object key : c3p0Pro.keySet()) {  
            String skey = (String) key;  
            if (skey.startsWith("c3p0.")) {  
                c3propes.put(skey, c3p0Pro.getProperty(skey));  
            } else {  
                jdbcpropes.put(skey, c3p0Pro.getProperty(skey));  
            }  
        }  

        try {  
            // 建立連接池  
            DataSource unPooled = DataSources.unpooledDataSource(c3p0Pro.getProperty(JDBC_URL), jdbcpropes);  
            ds = DataSources.pooledDataSource(unPooled, c3propes);  

        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  

    /** 
     * 獲取數據庫連接對象 
     *  
     * @return 數據連接對象 
     * @throws SQLException 
     */  
    public static synchronized Connection getConnection() throws SQLException {  
        final Connection conn = ds.getConnection();  
        conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  
        return conn;  
    }  
}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959551852793026917" target="_blank"></a></div>

</div> </div>
SQLHelper.java文件內容如下:

    /**

 * 功能:提供統一的查詢、修改和插入方法 
 */  
package com.hh.db;  

import java.sql.Connection;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.util.ArrayList;  
import java.util.List;  

public class SQLHelper {  
    private Connection conn = null;  
    private PreparedStatement ps = null;  
    private ResultSet rs = null;  

    /** 
     * 數據查詢 
     * @param sql語句 
     * @return 返回結果集List<Object> 
     */  
    public List<Object> query(String sql) {  
        if(sql.equals("") || sql == null){  
            return null;  
        }  
        List<Object> list = new ArrayList<Object>();  
        try {  
            conn = C3P0ConnentionProvider.getConnection();  
            ps = conn.prepareStatement(sql);  
            rs = ps.executeQuery();  
            ResultSetMetaData rsmd = rs.getMetaData();  
            // 可以得到有多少列  
            int columnNum = rsmd.getColumnCount();  
            // 將數據封裝到list中  
            while (rs.next()) {  
                Object[] objects = new Object[columnNum];  
                for (int i = 0; i < objects.length; i++) {  
                    objects[i] = rs.getObject(i + 1);  
                }  
                list.add(objects);  
            }  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
        return list;  
    }  

    /** 
     * 插入、修改數據操作 
     * @param sql語句 
     * @return boolean 成功返回true,失敗返回false 
     */  
    public boolean update(String sql) {  
        boolean b = false;  
        if(sql.equals("") || sql == null){  
            return b;  
        }  
        try {  
            conn = C3P0ConnentionProvider.getConnection();  
            ps = conn.prepareStatement(sql);  
            int i = ps.executeUpdate();  
            if (i == 1) {  
                b = true;  
            }  
        } catch (Exception e) {  
            // TODO: handle exception  
            e.printStackTrace();  
        }  
        return b;  
    }  

}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959551852793026917" target="_blank"></a></div>

</div> </div>
至于Demo.java文件,可提供參考的內容如下:

    /**

 * SQLHelper的測試類 
 *  
 */  
package com.hh.db;  

import java.util.ArrayList;  
import java.util.List;  


public class Demo {  

    private SQLHelper sqlHelper = new SQLHelper();  

    /** 
     * 測試query 
     */  
    /*public void testQuery(){ 
        String sql = "select * from crh2_station where id = 1"; 
        List list = sqlHelper.query(sql); 
        List<Crh2Station> crh2StationList = new ArrayList<Crh2Station>(); 
        //對查詢結果進行封裝 
        for (int i = 0; i < list.size(); i++) { 
            Object object[] = (Object[]) list.get(i); 
            Crh2Station crh2Station = new Crh2Station(); 
            crh2Station.setId(Integer.parseInt(object[0].toString())); 
            crh2Station.setSlopeId(Integer.parseInt(object[1].toString())); 
            crh2Station.setSlope(Double.parseDouble(object[2].toString())); 
            crh2Station.setLength(Double.parseDouble(object[3].toString())); 
            crh2Station.setEnd(Double.parseDouble(object[4].toString())); 
            crh2Station.setHeight(Double.parseDouble(object[5].toString())); 
            crh2StationList.add(crh2Station); 
        } 
        return crh2StationList; 
    }*/  

    /** 
     * 測試insert、update、delete 
     */  
    /*public void testInsertOrUpdate(){ 
        String sql = "delete from crh2_station where id = 1"; 
        boolean b = sqlHelper.update(sql); 
        if(b){//b為true則操作成功 
            System.out.println("操作成功"); 
        }else{//b為false則操作失敗 
            System.out.println("操作失敗"); 
        } 
    }*/  

}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959551852793026917" target="_blank"></a></div>

</div> </div>

來自:http://blog.csdn.net/huhui_cs/article/details/19611493

參考資料:http://blog.csdn.net/wushangjimo/article/details/12654491

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!