数据库连接池

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_41628693/article/details/99333803

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

有四种常见的连接池框架

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

2、C3P0连接池

3、proxcool连接池

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

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

    <dependency>
	    <groupId>mysql</groupId>
	    <artifactId>mysql-connector-java</artifactId>
	    <version>8.0.16</version>
	</dependency>

    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
	<dependency>
	    <groupId>com.mchange</groupId>
	    <artifactId>c3p0</artifactId>
	    <version>0.9.5.4</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-dbcp2</artifactId>
	    <version>2.6.0</version>
	</dependency>

二、创建连接池,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里配置数据库信息。

<Resource  name="mysql3306busmis-dbcp"   
	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" />  


<Resource name="mysql3306busmis-c3p0" auth="Container"
	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();
	}
}

 

展开阅读全文