JDBC与连接池

我不是女神ヾ 2022-01-29 07:43 424阅读 0赞

JDBC与连接池

  • JDBC
    • 什么是JDBC
    • JDBC操作数据库步骤
    • 常见的JDBC组件
    • JDBC注册驱动为什么是使用反射而不是创建对象直接注册?
    • 为什么建议使用prepareStatement执行SQL语句?
    • SQL注入(了解)
    • JDBC事务
  • 数据库连接池
    • 为什么要使用数据库连接池?
    • 连接池常见参数介绍
    • 连接池的实现

JDBC

什么是JDBC

JDBC全程为Java DataBase Connection,它是JDK提供用于操作数据库的接口,换句话说,它是JDK为Java操作数据库提供的API规范。具体的数据库驱动、API的实现类是由数据库厂商实现。例如使用MySQL需要mysql-connector-java-5.1.39-bin.jar。

JDBC操作数据库步骤

  1. 注册数据库驱动
  2. 建立数据库连接
  3. 创建statement
  4. 执行SQL语句
  5. 处理结果
  6. 关闭连接

    //省略try,catch

    // 注册驱动
    Class.forName(“com.mysql.jdbc.Driver”);
    // 获取连接对象
    Connection con = (Connection) DriverManager.getConnection(“jdbc:mysql://localhost:3306/DBName”,”username”,”password”);
    //获得Statement对象
    PreparedStatement statement = con.prepareStatement(“select * from user where id=1”);
    //提交查询
    statement.executeQuery();
    //关闭连接
    statement.close();
    con.close();

常见的JDBC组件

(图片来自:https://www.yiibai.com/jdbc/jdbc-introduction.html)
在这里插入图片描述
DriverManager: 管理数据库驱动类。
Connection: 数据库连接对象,拥有与数据库交互的方法。
Statement: 此接口用于将SQL语句提交给数据库执行,并接收返回结果。
**ResultSet:**查询后返回的结果集。

JDBC注册驱动为什么是使用反射而不是创建对象直接注册?

  1. 低耦合。反射通过名称创建,名称可以配置在配置文件中,包括连接的URL,方便更换数据库。
  2. 查看MySQL中的驱动类源码:

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {

    1. static {
    2. try {
    3. java.sql.DriverManager.registerDriver(new Driver());
    4. } catch (SQLException E) {
    5. throw new RuntimeException("Can't register driver!");
    6. }
    7. }

    //省略其他代码
    }

可以看见static 代码块中注册了驱动对象,那么在类加载时就会执行static代码块。

为什么建议使用prepareStatement执行SQL语句?

JDBC执行SQL语句的类有,Statement和prepareStatement,为什么推荐使用prepareStatement?


方便加入参数。prepareStatement支持动态参数化的SQL执行,使用占位符?表示参数。而Statement只能使用SQL语句拼接的形式。
性能更好。prepareStatement的SQL语句会预编译在DBMS中,并进行缓存,下次执行相同结构的语句时就无需再次编译生成执行计划。而Statement执行SQL每次都需要进行编译。
更安全。prepareStatement在传入参数时会进行特殊处理,避免SQL注入。例如将整个参数条件使用引号包裹,防止恶意语句作为条件单独执行。

  1. select file from file where name = #{ name}
  2. SQL注入输入的name = 'test' or 1=1
  3. 语句变为:select file from file where name = 'test' or 1=1
  4. 此时1=1永远成立,那么语句将会被执行成功。
  5. prepareStatement处理后:select file from file where name = '\'test\' or 1=1'
  6. 使用引号包裹后整个参数作为了条件。

可读性好。比起复杂的字符串拼接,动态参数化显然可读性好得多。

SQL注入(了解)

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。


如何避免?

  1. 预编译语句后生成执行计划,再绑定变量,SQL的语义就不会发生变化,插入的内容只能作为字符串参数执行。
  2. 对非法参数进行过滤。不适用高权限用户直接连接数据库。

JDBC事务

这里只简单介绍写法,具体事务后续文章介绍。

  1. try{
  2. Class.forName("com.mysql.jdbc.Driver");
  3. Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/DBName","username","password");
  4. //关闭自动提交
  5. con.setAutoCommit(false);
  6. PreparedStatement statement = con.prepareStatement("select * from user where id=1");
  7. statement.executeQuery();
  8. //提交事务
  9. con.commit();
  10. statement.close();
  11. con.close();
  12. } catch(Exception e) {
  13. // 出错回滚
  14. con.rollback();
  15. }

数据库连接池

为什么要使用数据库连接池?

在写JDBC的Demo时执行一次SQL的操作为:加载驱动,获取连接,执行SQL,获得结果,关闭资源。事实上建立连接是非常消耗资源的,它可能比本身操作数据库还要慢,而我们在一次或者几次的数据库操作 中也许感受不到差别。但是如果在并发量稍大一点的系统中,频繁的建立连接,释放资源会造成大量系统资源的浪费,如果程序出现异常没有及时关闭连接,或者受到恶意攻击,无法限定连接数可能会导致内存泄漏问题!

连接池常见参数介绍

  1. initSize:连接池初始化连接数
  2. maxActive:池中最大连接数量
  3. mindle:最小连接池数量
  4. maxWait:超时等待时间

连接池的实现

(个人的见解)

  1. 连接池在初始化时会根据配置的初始化连接数创建Connection放入池中。
  2. 当需要使用时向连接池中获取连接并将其标记为正忙,这个过程考虑了多线程的线程安全性,可能是加锁可能是CAS,便于管理可能分为空闲池和工作池。
  3. 当使用完连接池后不关闭,进行归还,重新放入池中。
  4. 配置了超时等待的时间,空闲池中空闲的线程到达超时等待时间后会被清除,直到数量为最小连接池数量。
  5. 当获取连接时,连接池中没有空闲连接并且连接数小于最大连接数量,线程池将创建新连接并返回。
  6. 当获取连接时,连接池中连接数已经到达了最大,并且都在忙,获取请求将会等待一定时间,没有拿到请求则返回null

发表评论

表情:
评论列表 (有 0 条评论,424人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JDBC连接

    一、常用连接池: (1)C3P0(2)Druid(德鲁伊)(3)DBCP(4)JNDI 二、Druid(德鲁伊):   1、配置说明:    (1)导入jar包:dru

    相关 JDBCJDBC连接

    一、 JDBC 背景 市场上数据库种类繁多,每个数据库连接操作各不相同,为了使Java程序统一高效的访问数据库,一种规范就诞生了,这种规范就是jdbc。 Java

    相关 JDBC连接

    1、分析      实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况下我们采用连接池技术来共享连接Connection。

    相关 jdbc连接

    一、连接池 1.为什么要用连接池 与数据库的每个连接的建立和关闭,均会在数据库服务器端造成非常大的资源开销。 作为传统的数据库访问方式是: 一次数据库访问对应一个物

    相关 JDBC连接概念理解

    为什么要使用数据库连接池: JDBC作为一种数据库访问技术,具有简单易用的优点。 但是在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点。 很多时