JDBC(二) —— 数据库连接池
一、概述
1. 概念
用户从容器(数据库连接池)中获取连接,不会向系统底层申请资源。
数据库连接池就是一个容器(集合),存放数据库连接的容器
当系统初始化好后,容器被创建,容器中会申请一些连接对象 ,用户访问完之后,会将连接对象归还给容器。
2. 好处:节约资源;用户访问高效。
二、实现
1. 标准接口:DataSource javax.sql包下的
方法:
获取连接 getConnection()
归还连接:如果连接对象Connection是从连接池中获取的,那么调用connection.close()方法,则不会再关闭连接了,而是归还连接。
一般我们不去实现它,由数据库厂商来实现
C3P0:数据库连接池技术
druid:数据库连接池实现技术,由阿里巴巴提供,高效
三、数据库连接池 —— c3p0基本使用
1. 步骤:
(1)导入jar包(两个): c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar,以及数据库驱动jar包
(2)定义配置文件:
名称:c3p0.properties或者c3p0-config.xml
路径:直接将文件放在src目录下即可
(3)创建核心对象 数据库连接池对象 ComboPooledDataSource
(4)获取连接 getConnection
实例配置文件c3p0-config.xml
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property> <property name="user">root</property> <property name="password">root</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/db2</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
实例代码
1 package cn.itcast.datasource.c3p0; 2 3 import com.mchange.v2.c3p0.ComboPooledDataSource; 4 5 import java.sql.Connection; 6 import java.sql.SQLException; 7 8 import javax.sql.DataSource; 9 10 /** 11 * c3p0演示 12 */ 13 public class C3P0Demo2 { 14 public static void main(String[] args) throws SQLException { 15 //1.1获取DataSource,使用默认配置 16 //DataSource ds = new ComboPooledDataSource(); 17 //1.2获取DataSource,使用指定名称配置 18 DataSource ds = new ComboPooledDataSource("otherc3p0"); 19 //2.获取连接 20 for(int i = 1; i<=10; i++){ 21 Connection conn = ds.getConnection(); 22 System.out.println(i+":"+conn); 23 24 if(i == 5){ 25 conn.close();//归还连接到连接池 26 } 27 } 28 29 } 30 }
四、数据库连接池——druid使用
1. 使用步骤
(1)导入jar包 druid-1.0.9.jar
(2)定义配置文件
是properties形式的
可以叫任意名称,可以放在任意目录下(不会自动加载)
(3)加载配置文件 Properties
(4)获取数据库连接池对象 DataSource:通过工厂类来获取 DruidDataSourceFactory
(4)获取连接:getConnection方法
示例代码
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db2 username=root password=root #初始化链接数量 initialSize=5 #最大连接数 maxActive=10 #最大等待时间 maxWait=3000
DruidDemo.java
1 package cn.itcast.datasource.druid; 2 3 import com.alibaba.druid.pool.DruidDataSourceFactory; 4 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.sql.Connection; 8 import java.util.Properties; 9 10 import javax.sql.DataSource; 11 12 /** 13 * druid演示 14 */ 15 public class DruidDemo { 16 public static void main(String[] args) throws Exception { 17 //1.导入jar包 18 19 //2.定义配置文件 20 21 //3.加载配置文件 22 Properties pro = new Properties(); 23 InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"); 24 pro.load(is); 25 //4.获取连接池对象 26 DataSource ds = DruidDataSourceFactory.createDataSource(pro); 27 //5.获取连接 28 Connection conn = ds.getConnection(); 29 System.out.println(conn); 30 31 } 32 }
2. 定义工具类
(1)定义工具类 JDBCUtils
(2)提供静态代码块加载配置对象,初始化连接池对象
(3)提供方法:
1)获取连接方法:通过数据库连接池获取连接
2)释放资源
3)获取连接池的方法
示例代码:JDBCUtils
1 package cn.itcast.datasource.utils; 2 3 import com.alibaba.druid.pool.DruidDataSourceFactory; 4 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.sql.Statement; 10 import java.util.Properties; 11 12 import javax.sql.DataSource; 13 14 /** 15 * Druid连接池工具类 16 */ 17 public class JDBCUtils { 18 //1.定义一个成员变量DataSource 19 private static DataSource ds; 20 21 static{ 22 23 try { 24 //1.加载配置文件 25 Properties pro = new Properties(); 26 pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); 27 //2.获取DataSource 28 ds = DruidDataSourceFactory.createDataSource(pro); 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } 34 } 35 36 /** 37 * 获取连接 38 * @return 39 * @throws SQLException 40 */ 41 public static Connection getConnection() throws SQLException { 42 return ds.getConnection(); 43 } 44 45 /** 46 * 释放资源 47 * @param stmt 48 * @param conn 49 */ 50 public static void close(Statement stmt, Connection conn){ 51 if(stmt != null){ 52 try { 53 stmt.close(); 54 } catch (SQLException e) { 55 e.printStackTrace(); 56 } 57 } 58 if(conn != null){ 59 try { 60 conn.close();//归还连接 61 } catch (SQLException e) { 62 e.printStackTrace(); 63 } 64 } 65 } 66 67 /** 68 * 释放资源 69 * @param rs 70 * @param stmt 71 * @param conn 72 */ 73 public static void close(ResultSet rs, Statement stmt, Connection conn){ 74 if(rs != null){ 75 try { 76 rs.close(); 77 } catch (SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 if(stmt != null){ 82 try { 83 stmt.close(); 84 } catch (SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88 if(conn != null){ 89 try { 90 conn.close();//归还连接 91 } catch (SQLException e) { 92 e.printStackTrace(); 93 } 94 } 95 } 96 97 public static DataSource getDataSource(){ 98 return ds; 99 } 100 }
示例代码:DruidDemo2
package cn.itcast.datasource.druid; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import cn.itcast.datasource.utils.JDBCUtils; /** * 使用Druid工具类 */ public class DruidDemo2 { public static void main(String[] args) { /** * 完成一个添加的操作,给account表添加一条记录 */ Connection conn = null; PreparedStatement pstmt = null; try { //1.获取连接 conn = JDBCUtils.getConnection(); //2.定SQL String sql = "insert into account values(null, ?, ?)"; //3.获取pstmt对象 pstmt = conn.prepareStatement(sql); //4.给?赋值 pstmt.setString(1,"王五"); pstmt.setDouble(2,3000); //5.执行SQL int count = pstmt.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); } finally{ JDBCUtils.close(pstmt,conn); } } }