美文网首页转载部分
从屌丝到架构师的飞越(数据库篇)-连接池

从屌丝到架构师的飞越(数据库篇)-连接池

作者: 走着别浪 | 来源:发表于2019-07-30 07:38 被阅读29次

    一.介绍

    连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。

    在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

    数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。

    二.知识点介绍

    1、连接池规范

    2、编写工具类

    3、常见配置项

    三.上课视频对应说明文档

    1、连接池规范

    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池。

    常见的连接池:DBCP、C3P0。这里学习DBCP连接池。

    1.1、连接池技术简述

    当多个程序(多个用户)有多个需求时,我们需要创建多个Connection对象,而与数据库创建连接是十分消耗资源的,连接池创建了多个连接,当使用连接操作数据时,会分配一个连接,而这个连接也可供其他程序(用户)的数据库操作使用,类似线程池。

    javax.sql包下的 DataSource是线程池接口。可以使用getConnection()方法获取一个连接,如果连接对象Connection是通过连接池获取的,当通过Connection对象调用close()方法时,不再是销毁连接对象,而是将连接对象放回到连接池。

    不使用连接池

    使用连接池

    (1)dbcp连接池介绍

    DBCP 是 Apache 软件基金组织下的一个优秀的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:

    Commons-dbcp.jar:连接池的实现

    Commons-pool.jar:连接池实现的依赖库

    Tomcat的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

    (2)dbcp连接池配置

    //导包加入classpath

    // 1.创建连接池对象

    BasicDataSource ds = new BasicDataSource();

    // 2.设置相关属性

    ds.setDriverClassName("com.mysql.jdbc.Driver");

    ds.setUrl("xxx");

    ds.setUsername("xxx");

    ds.setPassword("xxx");

    (3)DBUtils使用连接池

    当拥有了连接池后,我们可以直接使用连接池获取连接对象,完成普通的sql操作。(在获取连接后,关闭连接是将连接返还给连接池)

    而在DBUtils的学习过程中,我们使用QueryRunner的空参构造完成,每次请求调用query方法时传入连接对象。

    而当有了线程池后,可以调用QueryRunner的带参构造创建对象:

    QueryRunner(DataSource connectionPool);

    这时,在每次访问数据库时,将无需再传入连接对象。因为在每次使用QueryRunner时,都已经通过连接池获取了连接。

    如:

    BasicDataSource ds = new BasicDataSource();

    ds.setUrl("jdbc:mysql://localhost:3306/javahelp_gjp");//设置数据库连接

    ds.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动名称

    ds.setUsername("root");//设置登录用户名

    ds.setPassword("abc");//设置登录密码

    ds.setMaxIdle(3);//连接池最大空闲连接个数

    ds.setMaxWait(3000);//连接池最大等待时间

    ds.setMaxActive(5);//连接池最大连接个数

    ds.setInitialSize(3);//连接池初始化连接个数

    QueryRunner qr = new QueryRunner(ds);

    //再查询时无需传入连接对象,因为QueryRunner对象已经从连接池中获取了连接

    返回值类型  query = qr.query(SQL语句,Handler对象);

    2、编写工具类(最简单方式)

    /*

    * 创建DBCP连接池工具类

    *

    * 作用: 配置DBCP连接池,提供获取连接池中连接对象的方法

    */

    public class DBCPUtils {

    //创建连接池

    private static BasicDataSource dataSource = new BasicDataSource();

    public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";

    public static final String URL = "jdbc:mysql://localhost:3306/day22_jdbc";

    public static final String USER_NAME = "root";

    public static final String PASSWORD = "root";

    //通过静态代码块,完成dataSource对象的信息配置

    static {

    //指定驱动名称

    dataSource.setDriverClassName(DRIVER_CLASS_NAME);

    //指定数据库URL

    dataSource.setUrl(URL);

    //指定数据库连接的用户名

    dataSource.setUsername(USER_NAME);

    //指定数据库连接的密码

    dataSource.setPassword(PASSWORD);

    }

    /*

    * 提供获取连接池中连接对象的方法

    */

    public static Connection getConnection(){

    try{

    return dataSource.getConnection();

    }catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    }

    3、常见配置项

    参考文档: http://commons.apache.org/proper/commons-dbcp/configuration.html

    相关文章

      网友评论

        本文标题:从屌丝到架构师的飞越(数据库篇)-连接池

        本文链接:https://www.haomeiwen.com/subject/flsplctx.html