最早接触的Java访问数据库,是通过jdbc接口。后来工作之后,一般是在服务器(如weblogic)配置数据源,通过JNDI使用数据源;最近需要在程序中动态构造数据源,查了些资料,备录于此。
? 体系结构我暂时没有系统的学习过UML,对各种图的规范画法不了解。所以上面的图仅供参考,不保证其合乎规范。
对于上图,需要说明:
上述5个组件的作用分别如下:
组件名称 | 组件作用 |
数据库驱动包 | 各数据库厂商提供的jdbc实现;其实数据源也是基于jdbc技术的 |
properties配置文件 | jdbc链接的相关配置,和数据源的相关配置 |
commons-dbcp | 提供数据源的实现,依赖与配置文件和驱动包 |
spring-jdbc | 主要是使用其中的JdbcTemplate工具类,而它依赖于数据源;JdbcTemplate提供了很多实用的方法,具体请参考spring的api |
业务代码 | 基于JdbcTemplate进行数据库交互 |
driverClassName=Oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@dzzx-db1.hnisi.com.cn:1523/zxkfkusername=***passWord=***# if you want to change the following config, make sure you konw their meanings, otherwise you should not to change theminitialSize=10maxIdle=3minIdle=2maxActive=10maxWait=10000各属性的名称,可以参考BasicDataSourceFactory源代码,这里仅对我用到的几个进行介绍:
在上述配置项中,前四个是必要的jdbc连接配置,在jdbc编程中经常遇到;后面五个是数据源连接池相关的配置,根据其介绍,我们可以用一个猜想的场景对其进行不严谨的解释:
按照上述配置,初始情况下会有10个数据库连接(initialSize)在初始情况下一般不会有数据库访问,即10连接都是空闲的,所以连接会被释放,连接数将减少到3(maxIdle) -- 所以配置时initialSize=maxIdle较好等到有连接被请求使用了,此时空闲连接数将减少,等少于2(minIdle)时,会创建新的连接如果业务代码请求连接,10秒(maxWait)还没有获取到,可能会抛出异常业务代码使用完,释放连接之后,连接池中空闲的连接数会增加,所以将会减少连接,保持maxIdle的限制
再次声明,上述的模式只是猜测,没有经过测试。
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);
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
新闻热点
疑难解答