JDBC三大連接池DBCP|C3P0|Druid和DBUtils工具使用

DBCP(DataBase Connection Pool)
是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要2個包:commons-dbcp.jar,commons-pool.jar由於建立數據庫連接是一個非常耗時的行爲,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完後再放回去。

添加配置文件
文件名稱: dbcp.properties
文件位置: src下

#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化連接 -->
initialSize=10
#最大連接數量
maxTotal=50
#<!-- 最大空閒連接 -->
maxIdle=20
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60-->
maxWaitMillis=5000

代碼示例:

package jdbcdao.test;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DBCP {
    //創建連接池對象
    private static BasicDataSource dataSource;
    //初始化連接池
    static {
        Properties prop = new Properties();
        InputStream is = DBCP.class.getClassLoader().getResourceAsStream("dbcp.properties");
        try {
            //加載文件
            prop.load(is);
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("初始化連接池失敗");
        }
    }
    //創建連接
    public static Connection getconnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
}

測試類:

package jdbcdao.test;

import org.junit.Test;

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

public class DBCPTest {
    @Test
    public void testConnection(){
        for (int i = 0; i <50 ; i++) {
            Connection conn = DBCP.getconnection();
            System.out.println(i+"->"+conn);
            try {
                conn.close();//把連接放入連接池
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

C3P0連接池
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。

c3p0與dbcp區別
1.
dbcp沒有自動回收空閒連接的功能
c3p0有自動回收空閒連接功能
2.
dbcp需要手動加載配置文件
c3p0自動加載

添加配置文件
c3p0是在外部添加配置文件,工具直接進行應用,因爲直接引用,所以要求固定的命名和文件位置
文件位置: src
文件命名:c3p0-config.xml/c3p0.properties

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/school
c3p0.user=root
c3p0.password=root
#每次增長的個數
c3p0.acquireIncrement=5
#初始化大小
c3p0.initialPoolSize=20
#最小
c3p0.minPoolSize=10
#最大
c3p0.maxPoolSize=40
#超時時間
c3p0.checkoutTimeout=5000

注意:
1: c3p0的配置文件內部可以包含命名配置文件和默認配置文件!默認是選擇默認配置!如果需要切換命名配置可以在創建c3p0連接池的時候填入命名即可!

2:如果xml配置文件和屬性文件都存在時,xml優先級高於屬性文件
代碼示例:

package jdbcdao.test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

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

public class C3P0 {
    private static ComboPooledDataSource dataSource;
    static {
            Properties prop = new Properties();
            dataSource = new ComboPooledDataSource();
    }
    public static Connection getconnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

測試類:

package jdbcdao.test;

import org.junit.Test;

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

public class C3P0Test {
    @Test
    public void testConnection(){
        for (int i = 0; i <50 ; i++) {
            Connection conn = C3P0.getconnection();
            System.out.println(i+"->"+conn);
            try {
                conn.close();//把連接放入連接池
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Druid連接池
Druid 是目前比較流行的高性能的,分佈式列存儲的OLAP框架(具體來說是MOLAP)。它有如下幾個特點:
一. 亞秒級查詢
druid提供了快速的聚合能力以及亞秒級的OLAP查詢能力,多租戶的設計,是面向用戶分析應用的理想方式。
二.實時數據注入
druid支持流數據的注入,並提供了數據的事件驅動,保證在實時和離線環境下事件的實效性和統一性
三.可擴展的PB級存儲
druid集羣可以很方便的擴容到PB的數據量,每秒百萬級別的數據注入。即便在加大數據規模的情況下,也能保證時其效性
四.多環境部署
druid既可以運行在商業的硬件上,也可以運行在雲上。它可以從多種數據系統中注入數據,包括hadoop,spark,kafka,storm和samza等
五.豐富的社區
druid擁有豐富的社區,供大家學習

配置文件 database.properties:

#連接設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school
username=root
password=root
#<!-- 初始化連接 -->
initialSize=10
#最大連接數量
maxActive=50
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60-->
maxWait=5000

示例代碼:

package jdbcdao.test;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class Druid {
    private static DruidDataSource dataSource;
    //初始化連接池
    static {
        Properties prop = new Properties();
        InputStream is = DBCP.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            //加載文件
            prop.load(is);
            dataSource = (DruidDataSource)DruidDataSourceFactory.createDataSource(prop);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("初始化連接池失敗");
        }
    }
    //創建連接
    public static Connection getconnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
}

測試類:

package jdbcdao.test;

import org.junit.Test;

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

public class DruidTest {
    @Test
    public void testConnection(){
        for (int i = 0; i <50 ; i++) {
            Connection conn = Druid.getconnection();
            System.out.println(i+"->"+conn);
            try {
                conn.close();//把連接放入連接池
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

DBUtils使用

Commons DbUtils是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能。

DBUtils簡介

DBUtils是java編程中的數據庫操作實用工具,小巧簡單實用,

1.對於數據表的讀操作,可以把結果轉換成List,Array,Set等java集合,便於程序員操作。

2.對於數據表的寫操作,也變得很簡單(只需寫sql語句)。

DBUtils包括主要類

DbUtils類:啓動類,一般不直接使用。

ResultSetHandler接口:轉換類型接口

​ --ArrayHandler類:實現類,把記錄轉化成數組

​ --ArrayListHandler類:把記錄轉化成數組,並放入集合中

​ --ColumnListHandler類:取某一列的數據。封裝到List中。

​ –ScalarHandler類:適合獲取一行一列數據。

​ –BeanHandler類:實現類,把記錄轉成對象。

​ –BeanListHandler類:實現類,把記錄轉化成List,使記錄爲JavaBean類型的對象

QueryRunner類:執行SQL語句的類

 

dao模式通過DBUtils工具與Druid連接池對數據庫的增刪改查代碼示例:

dao接口:

package jdbcdao1.dao;

import jdbcdao1.domain.User;

import java.util.List;

public interface Userdao {
    List<User> findAll();
    User findById(int id);
    void add(User user);
    void delete(int id);
    void updata(User user);
}

具體實現類:

package jdbcdao1.dao.impl;

import jdbcdao1.dao.Userdao;
import jdbcdao1.domain.User;
import jdbcdao1.utils.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

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

public class UserdaoImpl implements Userdao {
    QueryRunner qr=null;
    //查找所有
    @Override
    public List<User> findAll() {
        qr = new QueryRunner(DataSourceUtils.getDataSource());
        try {
            //BeanListHandler返回集合,BeanHandler返回單個對象,ScalarHandler返回單個值
            return qr.query("select * from student", new BeanListHandler<>(User.class));
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
    //根據id查找對象
    @Override
    public User findById(int id) {
        qr = new QueryRunner(DataSourceUtils.getDataSource());
        try {
            return qr.query("select * from student where id=?", new BeanHandler<>(User.class),id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
    //添加數據
    @Override
    public void add(User user) {
        qr = new QueryRunner(DataSourceUtils.getDataSource());
        Object[] params= {user.getId(),user.getUsername(),user.getPassword(),user.getEamil()};
        try {
            qr.update("insert into student values(?,?,?,?)",params);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }
    //刪除數據
    @Override
    public void delete(int id) {
        qr = new QueryRunner(DataSourceUtils.getDataSource());
        try {
            qr.update("DELETE FROM student WHERE id=?",id);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }
    //更新數據
    @Override
    public void updata(User user) {
        qr = new QueryRunner(DataSourceUtils.getDataSource());
        Object[] params= {user.getUsername(),user.getPassword(),user.getEamil(),user.getId()};
        try {
            qr.update("update student set username=?,password=?,eamil=?where id=?",params);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

連接池工具類:

package jdbcdao1.utils;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class DataSourceUtils {
    private static DruidDataSource dataSource;
    //初始化連接池
    static {
        Properties prop = new Properties();
        InputStream is = DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            //加載文件
            prop.load(is);
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("初始化連接池失敗");
        }
    }

    public static DataSource getDataSource(){
        return dataSource;
    }
}

測試類:

package jdbcdao1.test;

import jdbcdao1.dao.Userdao;
import jdbcdao1.dao.impl.UserdaoImpl;
import jdbcdao1.domain.User;
import org.junit.Test;

import java.util.List;

public class UserdaoTest {
    //查找所有測試
    @Test
    public void testFindAll(){
        Userdao userdao = new UserdaoImpl();
        List<User> all = userdao.findAll();
        for(User l:all){
            System.out.println(l.toString());
        }
    }
    //根據id查找對象測試
    @Test
    public void testFindId(){
        Userdao userdao = new UserdaoImpl();
        User user = userdao.findById(1);
        System.out.println(user.toString());
    }
    //添加數據測試
    @Test
    public void testAdd(){
        User user = new User(3,"bom","888888","[email protected]");
        Userdao userdao = new UserdaoImpl();
        userdao.add(user);
        System.out.println("執行成功");
    }
    //更新數據測試
    @Test
    public void testUpdata(){
        User user = new User(3,"tom","99999","[email protected]");
        Userdao userdao = new UserdaoImpl();
        userdao.updata(user);
        System.out.println("執行成功");
    }
    //刪除數據測試
    @Test
    public void testDelete(){
        Userdao userdao = new UserdaoImpl();
        userdao.delete(1);
        System.out.println("執行成功");
    }
}

配置文件:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_test?useSSL=false&characterEncoding=utf8
username=root
password=123456
#<!-- 初始化連接 -->
initialSize=10
#最大連接數量
maxActive=50
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60-->
maxWait=5000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章