zoukankan      html  css  js  c++  java
  • JDBC连接池和DBUtils

    连接池思想
      在数据库连接时,Connection资源非常珍贵,但又频繁被使用,所以创建一个容器来专门管理这些连接

    使用连接池实现Connection复用:
      1.创建一个连接池对象
      2.连接池对象生成并管理若干连接
        (线程池中的线程是自己在线程池中使用线程,使用之后线程池将线程回收给后面的线程使用)
        (连接池对象自己生成连接对象,我们使用时直接从连接池得到连接对象)(线程池是先使用线程,在交给线程池管理,一个是连接池先创建连接,在给使用)

      3.当与数据库交互时,从连接池获取连接
      4.连接使用完,以前是直接释放,现在直接存回连接池
      5.存回连接池的目的是供下次使用

      优点:
        A.实现Connection的复用
        B.效率更高

    Java中常用的数据库连接池实现(管理程序与数据库的连接)
      C3p0 ----- 用xml配置文件规范
      DBCP ----- 用properties配置文件规范

    C3p0连接池使用
      A:必须下载相关jar包
        连接池管理连接的,必须还得导入mysql与java连接的jar包才能正常使用
      B:创建连接池对象,传入相关的配置信息(具体要使用哪一种配置的连接池)
        必须配置的四个配置项(驱动名,url,账号,密码)
        可选配置项,连接的管理策略----初始化连接个数,最大连接数,空闲时的最小连接数......
      C:从连接池对象取连接,并使用
      D:将连接存回连接池
    C3p0总结
      1.导包
      2.配置文件直接复制到src下面,注意必须在src下,且文件名不能修改
       固定:c3p0-config.xml  因为解析原码被底层封装
      3.创建连接池对象
        DataSource ds = new ComboPooledDataSource();
        底层实现:
          A:自动读取并解析配置文件
          B:根据解析的数据创建若干连接
            解析c3po-config.xml
            用集合嵌套进行解析
              Map<String(name-config的属性),HashMap<String(property的属性),String(property的文本)>>
              内层HashMap中存的是,元素属性值,元素文本值(连接池的具体配置信息)
              外层Map中存储的是具体使用哪一条配置信息来创建相应的连接池
       4.获取连接 使用
         ds.getConnection(); 从连接池取出一个连接
       5.连接用完之后存回连接池
         con.close(); 这是使用的连接池重写之后的Close方法,将连接放回,没有释放  其它使用的资源需要释放
      特点:资源复用,效率高,底层实现隐藏
    C3p0解析配置文件时,配置文件中可以有多套配置信息
      default-config(默认配置,只能有一个)和named-config(命名配置,可以0或多个)
      使用方法:
        DataSource ds = new ComboPooledDataSource; //默认配置
        DataSource ds = new ComboPooledDataSource("配置文件中对应的name的值")
        常用的配置最好放在xml的前面,因为xml解析存在效率问题
        C3p0的配置也可以使用编码的方式完成,但因为是硬代码,灵活性太差

    DBCP
      A:导入jar包
      B:创建连接池对象
        1.导入配置文件
        2.创建输入流以及Properties集合,将数据读入集合(通过类加载器中的方法直接读src目录下面的文件)
        3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
      C:获取并使用连接
        Connection con = ds.getConnection()
      D:存回连接池
        con.close()
        抽取数据库连接池工具类,不用每次都创建一个连接池

    DBUtils:
      和连接池一起使用,封装了一系列的“处理对象”处理和“结果”处理
      JavaBean书写规范
        A:必须有包
        B:必须实现序列化接口
        C:属性私有,提供公共的访问方式
        D:必须提供无参构造public
      使用:
        A:QueryRunner qr = new QueryRunner(数据库连接池对象)  
        B:查询操作
          qr.query(参数1,参数2,参数3)
            参数1 —— SQL语句
            参数2 —— 结果集(需要的代理对象)
            参数3 —— 补齐SQL语句的参数(占位符的值)(底层使用预处理对象preparedStatement)
        C:封装连接返回线程池
    实现细节:
        1:QueryRunner 执行SQL语句时,会从数据库连接池取出一个连接
          使用完,自己将连接存回线程池
        2:查询时,query("SQL语句",new BeanListHandler<泛型>(反射对象),[占位符参数])
          此条代理对象返回的是一个List<JavaBean>集合,存储每一条数据所对应的对象
          BeanListHandler怎么代理我们执行的?
            A:BeanListHandler 中的泛型决定了返回的集合的泛型
            B:根据反射对象获取无参构造,创建对象
            C:取出表记录中的字段名和字段值,利用反射和方法名拼接,为对象赋值
            D:将对象存入集合然后返回

        代理对象:
          BeanHandler        将单条记录(多条记录的情况下,第一天记录)组装成JavaBean对象
          ArrayHandler       将单条记录(多条数据选取第一条)的每一个字段值存储进一个Object数据
          ArrayListHandler      将每一条记录的每一个字段值存为一个数组,将所有数组存进集合
          ScalarHandler      查询单个结果(聚合函数)
          ColumanListHandler  将某一列的值存入一个集合
          MapHandler        将第一条记录的字段名作为键,字段值作为值存入一个Map集合
          MapListHandler     将每一条记录转换成Map,再将Map存入List选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
          KeyedHandler       选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
      增删改操作使用update方法,返回Long
        Long line = qr.update(sql, params);

    如果创建QueryRunner的时候没有传入连接词对象

        List<User> rs = qr.query(C3p0Utils.getDs().getConnection(), sql, new BeanListHandler<User>(User.class));

    池:
      字符串常量池
      包装类缓存池
      数据库连接池
      线程池
      音乐池
    资源复用,效率高

  • 相关阅读:
    rtsp+rtmp多路流媒体播放
    videojs+hls+rtmp流媒体播放
    JavaScript——问卷星自动填写
    js中不同类型作比较
    CSS——div内文字的溢出部分用省略号显示
    Python调用DLL动态链接库——ctypes使用
    VS2017+QT5.12环境配置与动态链接库的生成
    pywebview gui='cef' 生成app报错—— 中断点 已到达中断点
    css3 background-size属性--ie兼容
    一个Nice的生活主题博客模板
  • 原文地址:https://www.cnblogs.com/chonglchong/p/6736517.html
Copyright © 2011-2022 走看看