最早接觸的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
新聞熱點
疑難解答