zoukankan      html  css  js  c++  java
  • Java基于数据源的数据库访问

    ☞ 概述

      最早接触的Java访问数据库,是通过jdbc接口。后来工作之后,一般是在服务器(如weblogic)配置数据源,通过JNDI使用数据源;最近需要在程序中动态构造数据源,查了些资料,备录于此。

    ☞ 体系结构

    我暂时没有系统的学习过UML,对各种图的规范画法不了解。所以上面的图仅供参考,不保证其合乎规范。

    对于上图,需要说明:

    1. 组件之间的依赖关系,从上至下;即上面的组件依赖于下面的。
    2. spring-jdbc和commons-dbcp分别是对应jar包的名称;忽略了版本号。

    上述5个组件的作用分别如下:

    1. 数据库驱动包
      各数据库厂商提供的jdbc实现;其实数据源也是基于jdbc技术的
    2. properties配置文件
      jdbc链接的相关配置,和数据源的相关配置。
    3. commons-dbcp
      提供数据源的实现,依赖与配置文件和驱动包
    4. spring-jdbc
      主要是使用其中的JdbcTemplate工具类,而它依赖于数据源;JdbcTemplate提供了很多实用的方法,具体请参考spring的api
    5. 业务代码
      基于JdbcTemplate进行数据库交互

    ☞ 组件内容

    1. 配置文件
      在这里,我们是通过 org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(java.util.Properties prop) 来创建数据源实例,但是要求Properties的属性名称要和BasicDataSourceFactory声明的Field的名称相一致。除了jdbc链接的相关配置之外,其他的应该(猜测)都有其默认值,不是必须要配置的。配置文件的内容如下:

      driverClassName=oracle.jdbc.driver.OracleDriver
      url=jdbc:oracle:thin:@dzzx-db1.hnisi.com.cn:1523/zxkfk
      username=***
      password=***
      
      # if you want to change the following config, make sure you konw their meanings, otherwise you should not to change them
      initialSize=10
      maxIdle=3
      minIdle=2
      maxActive=10
      maxWait=10000
      各属性的名称,可以参考BasicDataSourceFactory源代码,这里仅对我用到的几个进行介绍:
      • driverClassName
        驱动类名称
      • url
        数据库连接url,不同数据库的写法有所不同
      • username
        数据库用户名
      • password
        数据库用户密码
      • initialSize
        数据源连接池初始连接数
      • maxIdle
        连接池中允许空闲连接的最大数
      • minIdle
        连接池中允许空闲连接的最小数
      • maxActive
        连接池中允许的活动连接的最大数
      • maxWait
        连接的最长等待时间,单位为毫秒

      在上述配置项中,前四个是必要的jdbc连接配置,在jdbc编程中经常遇到;后面五个是数据源连接池相关的配置,根据其介绍,我们可以用一个猜想的场景对其进行不严谨的解释:

      按照上述配置,初始情况下会有10个数据库连接(initialSize)
      在初始情况下一般不会有数据库访问,即10连接都是空闲的,所以连接会被释放,连接数将减少到3(maxIdle) -- 所以配置时initialSize=maxIdle较好
      等到有连接被请求使用了,此时空闲连接数将减少,等少于2(minIdle)时,会创建新的连接
      如果业务代码请求连接,10秒(maxWait)还没有获取到,可能会抛出异常
      业务代码使用完,释放连接之后,连接池中空闲的连接数会增加,所以将会减少连接,保持maxIdle的限制

      再次声明,上述的模式只是猜测,没有经过测试。

    2. 创建数据源
      我们通过 java.io.InputStream java.lang.Class.getResourceAsStream(String name) 来加载资源文件,获得InputStrInputStreameam实例;
      通过 void java.util.Properties.load(InputStream inStream) 来加载属性配置到Properties实例;
      通过 DataSource org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(Properties prop) 来获取数据源实例。
      Properties prop = new Properties();
      InputStream is = SendUtil.class.getResourceAsStream("/cn/sinobest/jzpt/jgbm/common/message/sendMessage.properties");
      prop.load(is);
      DataSource ds = BasicDataSourceFactory.createDataSource(prop);
      当然,也可以不用工厂模式,以普通的方式创建数据源:
      BasicDataSource bds = new BasicDataSource();
      bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
      bds.setUrl("jdbc:oracle:thin:@dzzx-db1.hnisi.com.cn:1523/zxkfk");
      bds.setUsername("***");
      bds.setPassword("***");
      bds.setInitialSize(10);
      bds.setMaxIdle(3);
      bds.setMinIdle(2);
      bds.setMaxActive(10);
      bds.setMaxWait(10 * 1000);
    3. 访问数据库
      我比较喜欢使用 org.springframework.jdbc.core.JdbcTemplate 这个工具类,他对增删改查都有封装,支持批处理;没有特殊的语法,写过jdbc代码的可以很容易过渡。我们只需要对其提供数据源实例,由他负责数据库连接的获取和释放,我们只管提供sql语句、参数和参数类型,其他的都不用我们操心。我的使用样例如下:
      String sql = "insert into S_SMS_WAITING_LIST (systemid,receiver,msg_content,senttime) values(?, ?, ?, ?)"
      String systemid="1";
      String phone="159********";
      String content="您有一条短信";
      String currtime=new Timestamp(System.currentTimeMillis());
      Object[] args = {systemid, phone, content, currtime};
      int[] argTypes = {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP};
      JdbcTemplate jdbcTem = new JdbcTemplate(ds); // 上一步创建的数据源
      jdbcTem.update(sql, args, argTypes);

      更多JdbcTemplate的方法,请查询相关API。

    2015-08-19 19:42:02

  • 相关阅读:
    Dbcp2抛出org.apache.commons.dbcp2.LifetimeExceededException
    DbUtils使用时抛出Cannot get a connection
    Spring注解【非单例】
    Exception in thread java.lang.IllegalThreadStateException
    eclipse选中变量,相同变量高亮。
    git push 403
    java虚拟机能并发的启动多少个线程
    产品的随想
    【转载】学习新东西的唯一方法
    Mysql错误问题记录
  • 原文地址:https://www.cnblogs.com/ywjy/p/4743003.html
Copyright © 2011-2022 走看看