10_连接池 & DBUtils

2017-06-06  本文已影响0人  AndroidCat
连接池
连接池介绍
自定义连接池
public class MyDataSource implements DataSource{
    private static LinkedList<Connection> pool = new LinkedList<>();
    private MyDataSource() {
        super();
    }
    static {
        Connection conn = null;
        for (int i = 0; i < 15; i++) {
            conn = JDBCUtils.getConnection();
            pool.add(conn);
        }
    }
    @Override
    public static Connection getConnection() throws SQLException {
        if (pool.size() != 0) {
            return pool.removeFirst();
        }
        Thread.sleep(100);
        return getConnection();
        
    }
    
    //回收连接
    public static releaseConnection(Connection conn) {
        if(conn != null) {
            pool.add(conn);
        }
    }
}
方法增强
1. 继承:子类继承父类,重写父类的方法从而使方法增强
    * 前提是必须要有父类,且存在继承关系
2. 装饰设计模式:此设计模式专门用于增强方法
    * 使用前提:必须有接口
    * 缺点:需要将接口所有方法实现
3. 动态代理:在运行时动态的创建代理类,完成增强的操作,与装饰者相似
    * 使用前提:需要有接口
    * 难点:需要有反射技术
4. 字节码增强:运行时创建目标类子类,从而进行增强
    * 常见第三方框架:cglib,javassist等
装饰设计模式
  1. 创建B,并实现A接口
  2. 提供B类的构造方法,参数类型为A,用于接收A接口的实现类C
  3. 给类B添加类型为A的成员变量,用于存放A接口的其他实现类
  4. 增强需要的方法
  5. 实现不需要增强的方法,方法体重调用成员变量存放的其他实现类对应的方法
A a = c;
B b = new B(c);
class B implement A {
    private A a;
    public B(A a)  {
        this.a = a;
    }
    //需要增强的方法
    public void close() {
        ...    
    }
    //需要增强的方法
    public void commit() {
        ...
    }
}
//1.实现同一个接口Connection
public class MyConnection implements Connection {
    //3.定义一个变量
    private Connection conn;
    private LinkedList<Connection> pool;
    // 2.编写一个构造方法(参数使用了面相对象的多态特性)
    public MyConnection(Connection conn,LinkedList<Connection> pool) {
        this.conn=conn;
        this.pool=pool;
    }
    //4.书写需要增强的方法
    @Override
    public void close() throws SQLException {
        pool.add(conn);
    }
    /**
     * 此方法必须覆盖!否则会出现空指针异常!!!
     */
    @Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        return conn.prepareStatement(sql);
    }
}
C3P0连接池(使用率最高80%)
//创建空参的ComboPooledDataSource对象时,默认会自动读取c3p0-config.xml文件中的<default-config>配置
public class C3P0Utils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("coinfig_name");

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///web08</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>

    <named-config name="myconfig">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///web08</property>
        <property name="user">root</property>
        <property name="password">root</property>
    </named-config>
</c3p0-config>
DBCP
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName("com.mysql.Driver");
basicDataSource.setUrl("jdbc:mydql://localhost:3306/mydatabase");
basicDataSource.setUsername("root");
basicDataSource.setPassword("root");
public class DBCPUtils {
    private static DataSource dataSource;
    static{
        try {
            //1.加载找properties文件输入流
            InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
            //2.加载输入流
            Properties props = new Properties();
            props.load(is);
            //3.创建数据源
            dataSource = BasicDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public static DataSource getDataSource(){
        return dataSource;
    }
    
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=utf8
username=root
password=root
initialSize=10
maxActive=50
maxIdle=5
maxWait=6000
DBUtils
try {
    // 1.创建核心类QueryRunner
    QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());//参数传入连接池
    // 2.编写SQL语句
    String sql = "insert into tbl_user values(null,?,?)";
    // 3.为站位符设置值
    Object[] params = { "xx", "oo" };
    // 4.执行添加操作
    int rows = qr.update(sql, params);
    if (rows > 0) {
        System.out.println("添加成功!");
    } else {
        System.out.println("添加失败!");
    }
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
上一篇下一篇

猜你喜欢

热点阅读