连接池
连接池:
管理数据库的连接
作用:提高项目的性能
就是在连接池初始化时,存入一定数量的连接,用的时候通过方法获取,不用的时候归还即可
所有的连接池必须实现一个接口,javax.sql.DataSource接口
获取连接的方法:
Connection getConnection()
归还连接的方法就是释放资源的方法
调用connection.close()
增强方法
1.继承
2.动态代理
3.装饰者模式(静态代理)
使用步骤:
1.装饰者和被装饰者实现同一接口或者继承同一类
2.装饰者中要有被装饰者的引用
3.对需要增强的方法进行加强
4.对不需要加强的方法调用原来方法
//接口Car public interface Car { void run(); void stop(); } //QQ 被装饰者 实现同一接口Car public class QQ implements Car { public void run(){ System.out.println("QQ run"); } @Override public void stop() { System.out.println("QQ stop"); } } //CarWarp 装饰者 实现同一接口Car public class CarWarp implements Car{ //通过构造器将Car引用 private Car car; public CarWarp(Car car){ this.car = car; } //对需要增强的方法进行增强 @Override public void run() { System.out.println("改装"); System.out.println("5s破百"); } //不需要的方法调用原来方法 @Override public void stop() { System.out.println("QQ stop"); } } //Test测试类 public class Test { public static void main(String[] args) { QQ qq = new QQ(); /*qq.run(); qq.stop();*/ CarWarp carWarp = new CarWarp(qq); carWarp.run(); carWarp.stop(); } }
自定义一个连接池:
工具类JdbcUtils
装饰者ConnectionWarp
简易连接池MyDataSource
测试类常用的连接池:
DBCP:
apache组织
使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码

import com.company.utils.JdbcUtils; import javafx.application.Application; import javafx.stage.Stage; import org.apache.commons.dbcp.BasicDataSource; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; public class DBCPDemo{ @Test //硬编译 public void f1() throws Exception{ //创建连接池 BasicDataSource ds = new BasicDataSource(); //配置信息 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql:///day07");//若为本地localhost可用/省略 ds.setUsername("root"); ds.setPassword("123456"); Connection con = ds.getConnection(); String sql = "insert into category values(?,?)"; PreparedStatement st = con.prepareStatement(sql); //设置参数 st.setString(1,"c020"); st.setString(2,"数码"); int i = st.executeUpdate(); System.out.println(i); //释放资源 JdbcUtils.closeResource(con,st,null); } }
b.配置文件


import com.company.utils.JdbcUtils; import javafx.application.Application; import javafx.stage.Stage; import org.apache.commons.dbcp.BasicDataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; import org.junit.Test; import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Properties; public class DBCPDemo{ @Test //硬编译 public void f2() throws Exception{ //存放配置文件 Properties prop = new Properties(); //io流读取 prop.load(new FileInputStream("src/dbcp.properties")); //创建连接池 DataSource ds = new BasicDataSourceFactory().createDataSource(prop); Connection con = ds.getConnection(); String sql = "insert into category values(?,?)"; PreparedStatement st = con.prepareStatement(sql); //设置参数 st.setString(1,"c022"); st.setString(2,"数码"); int i = st.executeUpdate(); System.out.println(i); //释放资源 JdbcUtils.closeResource(con,st,null); } }
C3P0:
有自动回收空闲连接的功能
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
a.硬编码(不推荐)
new ComboPooledDataSource()
import com.company.utils.JdbcUtils; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.junit.Test; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.PreparedStatement; public class C3p0Demo { @Test //硬编码 public void f1() throws Exception { ComboPooledDataSource ds = new ComboPooledDataSource(); //设置基本参数 ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setJdbcUrl("jdbc:mysql:///day07"); ds.setUser("root"); ds.setPassword("123456"); Connection con = ds.getConnection(); String sql = "insert into category values(?,?)"; PreparedStatement st = con.prepareStatement(sql); //设置参数 st.setString(1,"c023"); st.setString(2,"野生"); int i = st.executeUpdate(); System.out.println(i); //释放资源 JdbcUtils.closeResource(con,st,null); } }
b.配置文件
配置文件的名称:c3p0.properties 或 c3p0-config.xml
<c3p0-config> <!-- 默认配置,如果没有指定则使用这个配置 --> <default-config> <!-- 基本配置 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day07</property> <property name="user">root</property> <property name="password">123456</property> <!--扩展配置--> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config> <!-- 命名的配置 --> <named-config name="yisen"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day07</property> <property name="user">root</property> <property name="password">123456</property> <!-- 如果池中数据连接不够时一次增长多少个 --> <property name="acquireIncrement">5</property> <property name="initialPoolSize">20</property> <property name="minPoolSize">10</property> <property name="maxPoolSize">40</property> <property name="maxStatements">20</property> <property name="maxStatementsPerConnection">5</property> </named-config> </c3p0-config>
配置文件路径:src下
编码只需一句话
new ComboPooledDataSource();//使用默认的配置
new ComboPooledDataSource(String configName);//使用命名的配置,若配置名未找到,则使用默认配置
import com.company.utils.JdbcUtils; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.junit.Test; import java.beans.PropertyVetoException; import java.sql.Connection; import java.sql.PreparedStatement; public class C3p0Demo { @Test //硬编码 public void f1() throws Exception { ComboPooledDataSource ds = new ComboPooledDataSource("yisen"); Connection con = ds.getConnection(); String sql = "insert into category values(?,?)"; PreparedStatement st = con.prepareStatement(sql); //设置参数 st.setString(1,"c028"); st.setString(2,"解药"); int i = st.executeUpdate(); System.out.println(i); //释放资源 JdbcUtils.closeResource(con,st,null); } }

浙公网安备 33010602011771号