数据库连接池

1. 为什么要使用数据库连接池
线程池
  1. 初始化一些线程,提供给程序使用
  2. 节约了资源,关于线程的开闭资源,节约了内存空间
  3. 例如初始化五个线程对象,这里有是个线程目标
    首先执行五个线程目标,其他线程目标等待
    五个线程目标执行完毕,会执行其他线程,不会关闭线程。
2. 数据库连接池考虑的问题

数据库连接池适用于管理数据库连接资源,属性和数据库连接对象。

数据库连接的必要的资源:

  1. URL
  2. user
  3. password
  4. DriverClass

连接池关于数据库连接对象的管理内容

  1. 初始化数量
  2. 容量MAX值为多少
  3. 等待时间

数据库连接归还功能
(改功能时自带的功能。
依然是调用原始的close方法,实际效果时归还数据库连接池)

3. 常见的数据库连接池
  1. C3P0
  2. DBCP
  3. Druid
3.1 C3P0使用
使用流程:
  1. 导包
    mchange-commons-java-0.2.19.jar
    c3p0-0.9.5.2.jar
  2. 书写配置文件
  3. 创建核心类
<!-- c3p0-config.xml需要存储于src目录下 -->
<c3p0-config> 
	<!-- 使用默认的配置读取连接池对象 -->
	<default-config> 
	<!-- 连接参数 -->
	<property name="driverClass">com.mysql.jdbc.Driver</property >
	<property name="jdbcUrl">jdbc:mysql://localhost:3306/nzgp200 1?useSSL=true</property> 
	<property name="user">root</property> 
	<property name="password">123456</property> 

	<!-- 连接池参数 -->
	<!--初始化申请的连接数量-->
	<property name="initialPoolSize">5</property> 
	<!--最大的连接数量-->
	<property name="maxPoolSize">10</property> 
	<!--超时时间-->
	<property name="checkoutTimeout">3000</property> 
	</default-config> 

	<named-config name="otherc3p0"> 
	<!-- 连接参数 -->
	<property name="driverClass">com.mysql.jdbc.Driver</property > 

	<property name="jdbcUrl">jdbc:mysql://localhost:3306/company ?useSSL=true</property> 
	<property name="user">root</property> 
	<property name="password">123456</property> 

	<!-- 连接池参数 -->
	<property name="initialPoolSize">5</property> 	
	<property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> 
	</named-config>
</c3p0-config>
import com.mchange.v2.c3p0.ComboPooledDataSource; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.sql.*; 
import java.util.Properties; 

/**
* JDBC工具类,负责数据库连接对象和数据库资源关闭 
*/ 
public class JdbcUtil { 
	/**
	* 默认加载 default-config配置 
	*/ 
	private static ComboPooledDataSource pool = new ComboPooledDataSource(); 

	/*
	指定选择c3p0配置文件中哪一个配置 
	private static ComboPooledDataSource pool = new ComboPooledDataSource("otherc3p0"); 
	*/ 

	/**
	* 返回数据库连接对象,连接失败返回null 
	*
	* @return java.sql.Connection 数据库连接对象
	*/
	 public static Connection getConnection() { 
	 	Connection connection = null; 
	 	try {
	 		connection = pool.getConnection(); 
	 	} catch (SQLException e) { 
	 		e.printStackTrace(); 
	 	}return connection; 
	 }

	/*
	以下三个方法实际上都是执行同一个方法,使用这种方式 
		1. 简化代码结构 
		2. 规范化所有的操作 
	*/ 

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库 连接对象
	*/ 
	public static void close(Connection connection) { 
		close(connection, null, null); 
	}

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库 连接对象
	* @param statement java.sql.Statement 数据库 SQL语句搬运工对象 
	*/
	public static void close(Connection connection, Statement statement) { 
		close(connection, statement, null); 
	}

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库连接对象
	* @param statement java.sql.Statement 数据库SQL语句搬运工对象 
	* @param resultSet java.sql.ResultSet 数据库查询结果集对象 
	*/ 
	public static void close(Connection connection, Statement statement, ResultSet resultSet) { 
		try {
			if (resultSet != null) { 
				resultSet.close(); 
			}

			if (statement != null) { 
				statement.close(); 
			}

			if (connection != null) { 
				connection.close(); 
			}
		} catch (SQLException e) { 
			e.printStackTrace(); 
		} 
	} 
}
3.2 Druid使用
使用流程:
  1. 导包
    druid-1.0.9.rar
  2. 书写配置文件
    配置文件是一个druid.properties文件
  3. 创建核心类
# 文件名 druid.properties 存储在src目录下 
driverClassName=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost:3306/nzgp2001? 
useSSL=true 
username=root 
password=123456 

# 初始化数据库连接池容量 
initialSize=5 

# 最大容量 
maxActive=20 

# TimeOut 等待超时时间 
maxWait=2000
package util;
import com.alibaba.druid.pool.DruidDataSourceFactory; 

import javax.sql.DataSource; 
import java.io.FileInputStream; 
import java.sql.*; 
import java.util.Properties; 

/**
* JDBC工具类,负责数据库连接对象和数据库资源关闭 
*/ 
public class JdbcUtil { 

	/**
	* 数据库资源 
	*/ 
	private static DataSource ds; 

	static { 
		try {
		// 加载Properties文件 
		Properties properties = new Properties();
		properties.load(new FileInputStream("./src/druid.properties")); 

		// 已经完成数据库连接池操作 
		ds = DruidDataSourceFactory.createDataSource(properties ); 
	} catch (Exception e) {
		e.printStackTrace(); 
	} 
}
/**
* 返回数据库连接对象,连接失败返回null 
*
* @return java.sql.Connection 数据库连接对象 
*/ 
public static Connection getConnection() { 
	Connection connection = null; 
	try {
		connection = ds.getConnection(); 
	} catch (SQLException e) { 
		e.printStackTrace(); 
	}return connection; 
}

/*以下三个方法实际上都是执行同一个方法,使用这种方式 
	1. 简化代码结构 
	2. 规范化所有的操作 
*/ 

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库 连接对象
	*/ 
	public static void close(Connection connection) { 	
		close(connection, null, null);
	}

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库连接对象
	* @param statement java.sql.Statement 数据库SQL语句搬运工对象 
	*/ 
	public static void close(Connection connection, Statement statement) { 
		close(connection, statement, null); 
	}

	/**
	* 处理数据库操作对应的资源问题 
	*
	* @param connection java.sql.Connection 数据库连接对象
	* @param statement java.sql.Statement 数据库SQL语句搬运工对象 
	* @param resultSet java.sql.ResultSet 数据库查询结果集对象 
	*/ 
	public static void close(Connection connection, Statement statement, ResultSet resultSet) { 
		try {
			if (resultSet != null) { 
				resultSet.close(); 
			}
			
			if (statement != null) { 
				statement.close(); 
			}

			if (connection != null) { 
				connection.close(); 
			} 
		} catch (SQLException e) { 
			e.printStackTrace(); 
		}
	} 
}