JDBC连接池&JDBCTemplate06_数据库连接池1
1、概念
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
2、数据库连接池好处
1. 节约资源
2. 用户访问高效
3、实现数据库连接池
1. 标准接口:DataSource javax.sql包下的。
DataSource方法:
a. 获取连接:Connection getConnection() 尝试与此 DataSource
对象表示的数据源建立连接。
b. 归还连接:void Connection.close() 立即释放此 Connection
对象的数据库和JDBC资源,而不是等待它们自动释放。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。
2. 一般我们不去实现它,DataSource接口由驱动程序供应商,即数据库厂商实现。
a. C3P0:数据库连接池技术
b. Druid:数据库连接池实现技术,由阿里巴巴提供的。
4、C3P0:数据库连接池技术
a. 步骤:
1. 导入jar包(两个):c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar(被前面jar包依赖)。不要忘记导入数据库驱动jar包,即mysql-connector-java-5.1.37-bin.jar
2. 定义配置文件
-
- 名称:c3p0.properties或者c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接:getConnetion
b. 代码:
c3p0-config.xml
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db4</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <!-- 初始化申请的连接数量 --> <property name="initialPoolSize">5</property> <!-- 最大的连接数量 --> <property name="maxPoolSize">10</property> <!-- 超时时间(申请连接等待3秒,3秒后报超时) --> <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/db3</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>
package cn.itcast.datasource.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Demo1 { public static void main(String[] args) throws SQLException { //1. 创建数据库连接池对象,参数为空则使用默认配置 DataSource ds = new ComboPooledDataSource(); //2. 获取连接对象 Connection conn = ds.getConnection(); //3. 打印 System.out.println(conn); } }
执行结果:
c. 配置演示:
package cn.itcast.datasource.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; /** * C3P0演示 */ public class C3P0Demo2 { public static void main(String[] args) throws SQLException { //一般情况下使用默认配置 new C3P0Demo2().testDefaultConfig(); new C3P0Demo2().testNamedConfig(); } public void testDefaultConfig() throws SQLException { //1. 获取DataSource,使用默认配置 DataSource ds = new ComboPooledDataSource(); //2. 获取连接 for (int i = 1; i <= 11 ; i++) { Connection conn = ds.getConnection(); System.out.println(i+":"+conn); if(i == 5){ conn.close();//归还连接到连接池中 } } } public void testNamedConfig() throws SQLException { //1. 获取DataSource,使用指定名称配置 DataSource ds = new ComboPooledDataSource("otherc3p0"); //2. 获取连接 for (int i = 1; i <= 10 ; i++) { Connection conn = ds.getConnection(); System.out.println(i+":"+conn); } } }
执行testDefaultConfig结果:
执行testNamedConfig结果:
5、Druid:数据库连接池实现技术,由阿里巴巴提供的
a. 步骤:
1. 导入jar包:druid-1.0.9.jar
2. 定义配置文件:
-
- 是properties形式的
- 可以叫任意抿成,可以放在任意目录下
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来获取DruidDataSourceFactory
5. 获取连接:getConnetion()
代码
druid.properties配置文件放在src目录下
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///db3 username=root password=root #初始化连接数量 initialSize=5 #最大连接数 maxActive=10 #最大等待超时时间 maxWait=3000
package cn.itcast.datasource.druid; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; /** * Druid演示 */ public class DruidDemo1 { public static void main(String[] args) throws Exception { //1. 导入jar包 //2. 定义配置文件 //3. 加载配置文件 Properties pro = new Properties(); InputStream resourceAsStream = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(resourceAsStream); //4. 获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); //5. 获取连接 Connection conn = dataSource.getConnection(); System.out.println(conn); } }
执行结果:
b. 定义工具类
1. 定义一个类 JDBCUtils
2. 提供静态代码块加载配置文件
3. 提供方法
1. 获取连接方法:通过数据库连接池获取连接
2. 释放资源
3. 获取连接池的方法
代码:
package cn.itcast.datasource.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import java.sql.Connection; /** * 工具类 */ public class JDBCUtils { //1. 定义成员变量 DataSource private static DataSource ds; static { //1. 加载配置文件 Properties pro = new Properties(); try { pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); //2. 获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 * @return */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 释放资源 */ public static void close(Statement stat, Connection conn){ close(null,stat,conn); } public static void close(ResultSet rs,Statement stat, Connection conn){ if(rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(stat != null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } } } /** * 获取连接池方法 */ public static DataSource getDataSource(){ return ds; } }
package cn.itcast.datasource.druid; import cn.itcast.datasource.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /** * 使用新的工具类 */ public class DruidDemo2 { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; /* * 完成添加操作,给account表添加一条记录 */ //1. 获取连接 try { conn = JDBCUtils.getConnection(); //2. 定义sql String sql = "insert into account values (null,?,?)"; //获取ps对象 ps = conn.prepareStatement(sql); //给?赋值 ps.setString(1,"wangwu"); ps.setDouble(2,3000); //执行sql int count = ps.executeUpdate(); System.out.println(count); } catch (SQLException e) { e.printStackTrace(); } finally { JDBCUtils.close(ps,conn); } } }
执行结果: