1. 程式人生 > >使用C3P0連線池的方式連線資料庫

使用C3P0連線池的方式連線資料庫

一、使用c3p0連線資料準備工作

1.工程結構:
這裡寫圖片描述

2.資料庫建表及插入資料:

create table user( 
id int auto_increment primary key,
username varchar(50),
password varchar(50)
);



insert into user(username,password) value("小明",123);
insert into user(username,password) value("小王",456);

二、C3P0連線資料庫

1.實體類的程式碼演示:

package com.database3.entity;

public class User {

    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password="
                + password + "]";
    }
}

2.C3P0配置檔案

<?xml version="1.0" encoding="UTF-8"?>

<c3p0-config> 
    <!-- This is my config for mysql-->  
    <named-config name="mysql">  
        <property name="driverClass">com.mysql.jdbc.Driver</property>  
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/database?useUnicode=true&amp;characterEncoding=UTF8</property>  
        <property name="user">root</property>  
        <property name="password"></property>  
        <!-- 初始化連線池中的連線數,取值應在minPoolSize與maxPoolSize之間,預設為3-->
        <property name="initialPoolSize">10</property>
        <!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。預設值: 0 -->  
        <property name="maxIdleTime">30</property>  
        <!--連線池中保留的最大連線數。預設值: 15 -->
        <property name="maxPoolSize">100</property> 
        <!-- 連線池中保留的最小連線數,預設為:3--> 
        <property name="minPoolSize">10</property> 
        <!--c3p0全域性的PreparedStatements快取的大小。如果maxStatements與maxStatementsPerConnection均為0,則快取不生效,只要有一個不為0,則語句的快取就能生效。如果預設值: 0--> 
        <property name="maxStatements">200</property>  


        <!--以下的配置可寫可不寫,一般也用不到-->

        <!-- 當連線池連線耗盡時,客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。預設: 0 -->   
        <property name="checkoutTimeout" value="3000"/> 
        <!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。預設值: 3 -->   
        <property name="acquireIncrement" value="2"/> 
        <!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。預設值: 30 ;小於等於0表示無限次-->   
        <property name="acquireRetryAttempts" value="0"/>  
        <!--重新嘗試的時間間隔,預設為:1000毫秒-->   
        <property name="acquireRetryDelay" value="1000" /> 
        <!--關閉連線時,是否提交未提交的事務,預設為false,即關閉連線,回滾未提交的事務 -->   
        <property name="autoCommitOnClose">false</property>  
        <!--c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個引數那麼屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。預設值: null -->   
        <property name="automaticTestTable">Test</property> 
         <!--如果為false,則獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常,但是資料來源仍有效保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試獲取連線失敗後該資料來源將申明已斷開並永久關閉。預設: false-->   
        <property name="breakAfterAcquireFailure">false</property>
        <!--每60秒檢查所有連線池中的空閒連線。預設值: 0,不檢查 -->   
        <property name="idleConnectionTestPeriod">60</property>    
        <!--maxStatementsPerConnection定義了連線池內單個連線所擁有的最大快取statements數。預設值: 0 -->   
        <property name="maxStatementsPerConnection"></property> 
    </named-config>  

</c3p0-config>

3.連線池工具類

程式碼實現:

package com.database3.util;

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

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;


/**
 * C3p0工具類
 * @author MrGuo522
 */
public class C3p0Utils {

    private static ComboPooledDataSource dataSource=new ComboPooledDataSource();
    /**
     * 
     * @Description: 資料來源提供了一種簡單獲取資料庫連線的方式,並能在內部通過一個池的機制來複用資料庫連線
     * @param      : DataSource
     * @author     : MrGuo522
     */
    public static DataSource getDataSource(){
        return dataSource;
    }
    /**
     * 
     * @Description: 獲取資料庫連線
     * @param      : Connection
     * @author     : MrGuo522
     */
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException();
        }
    }
}

4.測試連線池

程式碼實現:

package com.database3.test;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.junit.Test;

import com.database3.entity.User;
import com.database3.util.C3p0Utils;

/**
 * 測試c3p0連線池的連通性
 * @author MrGuo522
 */
public class DateBaseTest {

    QueryRunner queryRunner=new QueryRunner(C3p0Utils.getDataSource());
    /**
     * 
     * @Description: 測試新增功能
     * @param      : void
     * @author     : MrGuo522
     */
    @Test
    public void addTest(){
        User user=new User();
        user.setId(1);
        user.setUsername("測試資料");
        user.setPassword("123");
        try {
            queryRunner.update("insert into user (id,username,password) values(?,?,?)",
                    user.getId(),user.getUsername(),user.getPassword());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }
    }
}