连接池是管理数据库连接的一种机制,能够控制连接的个数,默认情况下可以预先创建可用的连接。

有四种常见的连接池框架

1、Apache的DBCP连接池(Tomcat内置了DBCP)

2、C3P0连接池

3、proxcool连接池

4、阿里公司的德鲁伊框架。

一、引入Maven(只记录了DBCP和C3P0的使用)


    mysql
    mysql-connector-java
    8.0.16




    com.mchange
    c3p0
    0.9.5.4




    org.apache.commons
    commons-dbcp2
    2.6.0

二、创建连接池,DataSource有提供getConnection接口。这里采用工厂模式获取数据库连接池的连接。

package com.neusoft.busmis.fatory;

import java.sql.Connection;

import javax.sql.DataSource;

import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
//DBCP连接池
public class ConnectionFactoryWithDBCP {
private static DataSource ds = null;
static {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/busmis?serverTimezone=GMT%2B8");
bds.setUsername("root");
bds.setPassword("123456");

    bds.setInitialSize(1);      //设置初始的连接个数
    bds.setMaxTotal(2);         //设置最大连接数
    bds.setMaxIdle(2);
    bds.setMaxWaitMillis(2000); //设置等待时间
    ds = bds;
}

public static Connection getConnection() throws Exception{
    return ds.getConnection();
}

}
package com.neusoft.busmis.fatory;

import java.sql.Connection;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ConnectionFactoryWithC3P0 {
private static DataSource ds = null;
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/busmis?serverTimezone=GMT%2B8");
cpds.setUser("root");
cpds.setPassword("123456");

        cpds.setMinPoolSize(1); //设置最小的连接个数
        cpds.setAcquireIncrement(1);//每次新增的连接个数
        cpds.setMaxPoolSize(10);//设置最大的连接个数

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ds = cpds;
}

public static Connection getConnection() throws Exception{
    return ds.getConnection();
}

public static DataSource getDataSource() throws Exception{
    return ds;
}

}
三、将连接池放到JNDI

因为在java的机制,如果太久没使用一个引用,就会自动清除,不能避免地有时候会重复地进行销毁、创建的动作。所以将连接池配置放在JNDI上,让它在服务器启动时就一直存在。

在tomcat的context.xml里配置数据库信息。

auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
maxActive="5"
maxIdle="3"
maxWait="100"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/busmis?serverTimezone=GMT%2B8" />

type="com.mchange.v2.c3p0.ComboPooledDataSource"
factory="org.apache.naming.factory.BeanFactory"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3306/busmis?serverTimezone=GMT%2B8"
user="root"
password="root"
minPoolSize="1"
maxPoolSize="4"
maxIdleTime="1800"
acquireIncrement="1"
maxStatements="0"
initialPoolSize="1"
idleConnectionTestPeriod="60"
acquireRetryAttempts="30"
acquireRetryDelay="1000"
testConnectionOnCheckin="false"
breakAfterAcquireFailure="false"
testConnectionOnCheckout="false"/>
DBCP最主要的是drivereClassName(数据库驱动)、url(数据库地址)、username(数据库用户名)、password(数据库驱动)、name(Resource的名字)、maxIdle(最大空闲数)、maxActive(最大活动数)、auth(连接池的管理者,Container表示交给Tomcat管理)、maxWait(最大等待时间ms)、type(DataSource类)。

注:如果使用JNDI方式,必须将项目发布到Web才能生效。

工厂模式创建连接,用Context类的lookup来找配置信息,java:/comp/env/name。

package com.neusoft.busmis.fatory;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ConnectionFactoryWithJNDI {
private static DataSource ds = null;
static {
try {
Context ct = new InitialContext();
ds = (DataSource)ct.lookup("java:/comp/env/mysql3306busmis-c3p0");
ct.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public static Connection getConnection() throws Exception{
    return ds.getConnection();
}

}