目录
1.连接池了解
连接池就是存储我们数据库连接对象的容器,系统初始化后,会去申请一些连接对象,用户访问数据库时,回去容器中获取数据库连接对象,使用完毕后会归还给容器
好处
1. 提高资源利用率
2. 提高访问速度DataSource
java提供的接口, DataSource接口由框架编写者实现
方法
Connection getConnection()
获取连接
close() Connection类中
归还连接对象,如果调用的是连接池中的Connection 对象的close()方法,就不会关闭连接,会将该连接归还给连接池
实现DataSource
一般情况下不需要我们实现此接口,一下两种连接池会帮我们连接:
1. C3P0
2. Druid (由阿里巴巴提供)2.C3P0连接池
2.1 什么是C3P0
C3P0是目前较为流行的开源数据库连接池,支持JDBC2和JDBC3规的标准规范,易于扩展并且性能优越,目前被Hibernate、Spring等框架使用。
2.2 使用C3P0
第一步:导入jar
使用C3P0需要导入的包(2个)
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
注意别忘记导入mysql驱动
mysql-connector-java-5.1.8.jar
第二步:添加配置文件
在使用C3P0时,可以将数据库配置写到配置文件中,C3P0默认会到src根目录下加载名称为c3p0-config.xml的xml文件,配置文件内容如下
配置文件中添加了默认节点和自定义节点(myApp)
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!--配置默认节点-->
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost/test2</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
<!--配置自定义节点-->
<named-config name="myApp">
<property name="user">root</property>
<property name="password">root</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test2</property>
<!--初始化连接个数-->
<property name="initialPoolSize">10</property>
<!--最大空闲时间 单位秒-->
<property name="maxIdleTime">30</property>
<!--初始化连接个数-->
<property name="maxPoolSize">100</property>
</named-config>
</c3p0-config>第三步:创建DataSource
读取默认节点(<default-config>节点配置的信息)
DataSource cpds = new ComboPooledDataSource();
读取指节点
DataSource cpds = new ComboPooledDataSource("myApp");
第四步:获取Connection
获取数据库连接对象
Connection conn = cpds.getConnection();
第五步:获取PreparedStatement执行SQL
获取PreparedStatement执行sql语句
String sql = "SELECT * FROM user";
PreparedStatement ps = conn.prepareStatement(sql);ResultSet rs = ps.executeQuery();
第六步:遍历结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("username");
String password = rs.getString("password");
System.out.println(id + name + password);
}第七步:释放资源
rs.close();
ps.close();
conn.close();完整代码
import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Demo01 { public static void main(String[] args) throws SQLException { // 3.创建DataSource // 读取默认节点的配置 DataSource ds = new ComboPooledDataSource(); // 4.获取Connection对象 Connection conn = ds.getConnection(); // 5.执行SQL String sql = "select * from user "; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); // 6.遍历结果集 System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } // 7.释放资源 rs.close(); ps.close(); conn.close(); } }
运行结果:
红色部分为日志
2.3 ComboPooedDataSource介绍
ComboPooedDataSource是DataSource接口的实现类,主要包含设置数据源对象的方法
方法名
功能
setDriverClass()
设置连接数据库的驱动名称
setJdbcUrl
设置连接数据库的路径
setUser()
设置数据库的登陆账号
setPassword()
设置数据库的登陆密码
setMaxPoolSize()
设置数据库连接池最大的连接数目
setMinPoolSize()
设置数据库连接池最小的连接数目
setInitialPoolSize()
设置数据库连接池初始化的连接数目
getConnection()
从连接池中获取一个数据库连接
想要使用C3P0,首先需要创建数据源对象,创建数据源对象使用ComboPooledDataSource类
3.Druid连接池
3.1 Druid介绍
阿里巴巴推出的国产数据库连接池,据网上测试对比,比目前的DBCP或C3P0数据库连接池性能更好,Druid与其他数据库连接池使用方法基本一样(与DBCP非常相似),将数据库的连接信息全部配置给DataSource对象。
好处:
- 替代C3P0、DBCP数据库连接池(因为它的性能更好)
- 自带监控页面,实时监控应用的连接池情况
3.2 使用Druid
第一步:导入jar
导入jar包:druid-1.0.9.jar(或者其他版本的)
导入数据库驱动:mysql-connector-java-xxx.jar
第二步:添加配置文件
定义配置文件,后缀名properties,名称随意,可以放到任意目录,一般在src根目录下
配置文件内容为
druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///test2
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000第三步:加载配置文件
使用Properties加载配置文件
Properties pro = new Properties(); pro.load(Demo.class.getClassLoader().getResourceAsStream("druid.properties"));第四步:获取DataSource
获取DataSource对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
第五步:获取Connection
获取Connection对象
Connection conn = ds.getConnection();
第六步:操作数据库
通过Connection 对象操作数据库
String sql = "select * from user"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); }第七步:关闭资源
rs.close(); ps.close(); conn.close();完整代码
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Properties; public class Demo { public static void main(String[] args) throws Exception { // 3.加载配置文件 Properties pro = new Properties(); pro.load(Demo.class.getClassLoader().getResourceAsStream("druid.properties")); // 4.获取DataSource DataSource ds = DruidDataSourceFactory.createDataSource(pro); // 5.获取Connection Connection conn = ds.getConnection(); // 6.操作数据库 String sql = "select * from user"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } // 7.关闭资源 rs.close(); ps.close(); conn.close(); } }
运行结果:
3.3 使用工具类
- 加载配置文件
- 添加获取连接池的方法
- 添加获取连接的方法
- 添加关闭资源的方法
编写工具类:
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtils { // 加载配置文件 static DataSource ds; static { Properties pro = new Properties(); try { pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); ds = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接池的方法 */ public static DataSource getDataSource() { return ds; } /** * 获取连接的方法 */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 关闭资源的方法 */ public static void close(ResultSet rs, Statement st, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
使用工具类
@Test public void t1() throws SQLException { Connection conn = JDBCUtils.getConnection(); String sql = "select * from user"; PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); System.out.println("id username password email"); while (rs.next()) { int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); String email = rs.getString("email"); System.out.println(id + " " + username + " " + password + " " + email); } JDBCUtils.close(rs,ps,conn); }
运行结果: