自定义连接池&实现DataSource的连接池&dbcp连接池(BasicDataSource)&c3p0连接池(ComboPooledDataSource)&druid连接池(DruidDataSo

1.为什么要用连接池:节省创建连接对象和关闭连接对象的时间,提高使用效率.

2.连接池:存放多个连接对象的容器.

3.自定义连接池:目地让我们了解连接池的原理.

eg:public class MyPool {
    /**
    *准备一个集合作为连接池,存放连接对象
    */
    public static LinkedList<Connection> pool1=new LinkedList();

    /**
    * 用静态块初始化连接池中10个连接对象
    */
    static{
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            for (int i=1;i<=10;i++){
                //创建连接对象
                Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
                //将连接对象添加到连接池中
                pool1.add(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
    *获得连接对象的方法
    *@return java.sql.Connection
    */
    public static Connection getConnection(){
        Connection conn=null;
        if (pool1.size()>0){
            //每次取出池中第一个连接对象给用户
           conn=pool1.removeFirst();
        }
        return conn;
    }

    /**
     *归还连接对象的方法
     *@param  conn
     */
    public static void close(Connection conn){
        //每次归还连接对象归还池子中最后
        pool1.addLast(conn);
    }
}

4.实现Java接口方式实现连接池:目地让大家理解装饰者模式的使用

eg:/**
*连接对象装饰者类
 * @version 1.0
 * @date 2020/3/28
 */
public class MyConnection implements Connection {
    /**
     *声明连接对象和连接池
     */
    Connection conn;

    /**
     *通过构造方法将原来连接对象作为参数传过来
     */
    public MyConnection(Connection conn){
        this.conn=conn;
    }

    /**
    *重写关闭连接对象的方法,实现假关,将连接对象归还连接池中
    */
    @Override
    public void close() throws SQLException {
        System.out.println("装饰者连接对象的关闭方法");
        MyPool2.pool1.addLast(conn);
    }

    /**
    *重写父接口中方法获得执行对象的方法
    */
    @Override
    public Statement createStatement() throws SQLException {
        System.out.println("装饰者连接对象获得执行对象");
        return conn.createStatement();
    }

    /**
     *重写父接口中方法获得预编译的执行对象的方法
     */
    @Override
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        System.out.println("装饰者连接对象获得预编译的执行对象");
        return conn.prepareStatement(sql);
    }

	//省略不重要的方法

	}

	/**
*实现接口的方式实现连接池
 * @version 1.0
 * @date 2020/3/28
 */
public class MyPool2 implements DataSource {
    //声明连接池
    public static LinkedList<Connection> pool1=new LinkedList();

    //初始化10个连接对象
    static{
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            for (int i=1;i<=10;i++){
                //创建连接对象
                Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
                //将连接对象添加到连接池中
                pool1.add(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public Connection getConnection() throws SQLException {
        Connection conn=pool1.removeFirst();
        //创建装饰者连接对象,将原来连接对象作为参数传给装饰者连接对象的类中
        MyConnection mc=new MyConnection(conn);
        return mc;
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        Connection conn=pool1.removeFirst();
        //创建装饰者连接对象,将原来连接对象作为参数传给装饰者连接对象的类中
        MyConnection mc=new MyConnection(conn);
        return mc;
    }

	//省略不重要的方法
}

5.DBCP数据库连接池使用:导包commons-dbcp-版本号.jar,commons-pool-版本号.jar

5.1:DBCP编码版(了解):

eg:/**
*dbcp编码版连接池
 */
public class DbcpPool {
    public static BasicDataSource ds=new BasicDataSource();

    static {
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/myschool");
        ds.setUsername("root");
        ds.setPassword("root");
    }
}

5.2:DBCP配置信息版(掌握)

在src下放置配置文件jdbc.properties

eg:##dbcp连接池的配置信息的Key名要与它底层的Key名相同,否则value值无法正常获取加载
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myschool
username=root
password=root


		/**
*dbcp配置版的数据库连接池
 * @version 1.0
 * @date 2020/3/28
 */
public class DbcpPool2 {
    //声明连接池工厂
    public static BasicDataSourceFactory factory=new BasicDataSourceFactory();
    //声明连接对象
    public static DataSource ds;

    static{
        try {
            //创建配置文件对象
            Properties p1=new Properties();
            //加载配置文件对象
            p1.load(new InputStreamReader(new FileInputStream("Day36\\src\\jdbc.properties")));
            //用连接池工厂对象根据配置文件创建连接池对象
             ds=factory.createDataSource(p1);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6.c3p0连接池:

6.1:c3p0连接池与dbcp连接池区别:

6.1.1.dbcp没有自动回收空闲连接的功能

c3p0有自动回收空闲连接功能

6.1.2.dbcp需要手动设置配置文件  

c3p0不需要手动设置

 

6.2:c3p0数据库连接池的使用

6.2.1:导包:将c3p0-版本.jar放在到当前项目lib目录中

6.2.2:c3p0的配置文件只能直接放在src下,

c3p0的配置文件名只能叫:c3p0-config.xml或c3p0.properties

6.2.3:获取c3p0连接池对象,使用

//获得连接池
public  static ComboPooledDataSource ds=new   																	ComboPooledDataSource();
//从连接池中取出一个连接对象
Connection conn=ds.getConnection();

7.druid数据库连接池:导包:druid-版本号.jar (druid使用方法与dbcp连接池使用一样)

7.1:druid的优点:

7.1.1. 亚秒级查询:druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。

7.1.2. 实时数据注入:druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性

7.1.3: 可扩展的PB级存储:druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其 效性

7.1.4: 多环境部署:druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark, kafka,storm和samza等

7.1.5: 丰富的社区:druid拥有丰富的社区,供大家学习

 

7.2:druid连接池的配置使用:

7.2.1:导Jar包druid-版本号.jar

7.2.2:在src下创建druid配置文件(注意配置文件的Key名与druid底层

规定的Key名一致)

#druid配置的key与底层的Key一致才能得到value

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/myschool

username=root

password=root

7.2.3:配置druid连接池

/**
*配置druid连接池
 * @version 1.0
 * @date 2020/3/28
 */
public class DruidPool {
    //声明连接池工厂
    public  static DruidDataSourceFactory factory=new DruidDataSourceFactory();
    //声明连接池
    public  static DataSource ds;

    static{
        try {
            //创建配置文件对象
            Properties p2=new Properties();
            //加载配置文件
            p2.load(new InputStreamReader(new FileInputStream("Day36\\src\\druid.properties")));
            //用连接池工厂加载配置文件创建得到连接池
            ds=factory.createDataSource(p2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

8.DBUtils工具类:是apach公司的一个项目,封装jdbc的工具类.

8.1:使用步骤:

第一步:导Jar包:commons-dbutils-1.6.jar

第二步:创建DBUtils工具类执行对象:

QueryRunner qr=new QueryRunner(连接池对象);

第三步:使用执行对象执行sql

执行查询语句: qr.query(sql1,转换器对象,object...params);

转换器:将结果集转换为对象集合BeanListHandler

将结果集转换为对象BeanHandler

将结果集中第一行转换为Map集合:MapHandler

执行增加/修改/删除:int result=qr.update(sql1,object...params);

 

8.2:使用案例:

8.2.1:用DBUtils工具类作增加,修改,删除的操作

 

eg:public static void main(String[] args) throws SQLException {
    //创建dbutils工具类的执行对象,要传一个连接池作为参数,c3p0连接池
    QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
    //准备一个sql语句
    //String sql="insert into t_student(sname,sage,sex,address,cid) "
     //       + "values(?,?,?,?,?);";

    String sql="update t_student set sex=? where sid=?";
    //用dbutils工具类的执行对象调用相应方法执行
    //int result=qr.update(sql,"刚哥",20,"女","北京",1);
    int result=qr.update(sql,"男",20);
    if (result>0){
        System.out.println("操作成功");
    }else {
        System.out.println("操作失败");
    }
}

8.2.2:用DBUtils工具类查询,返回一个集合

eg:public static void main(String[] args) throws SQLException {
    //创建dbutils工具类的执行对象,要传一个连接池作为参数,c3p0连接池
    QueryRunner qr=new QueryRunner(new ComboPooledDataSource());
    //准备一个sql语句
    String sql="select sid,sname,sage,sex,address from t_student";
   //用dbutils工具类的执行对象调用相应方法执行,第一个参数是sql语句,第二个参数是类型转换器
    List<Student> stuList=qr.query(sql,new BeanListHandler<Student>(Student.class));
    System.out.println("学号\t姓名");
    for(Student s:stuList){
        System.out.println(s.getSid()+"\t"+s.getSname());
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值