歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java基於數據源的數據庫訪問

Java基於數據源的數據庫訪問

日期:2017/3/1 9:25:38   编辑:Linux編程

概述

最早接觸的Java訪問數據庫,是通過jdbc接口。後來工作之後,一般是在服務器(如weblogic)配置數據源,通過JNDI使用數據源;最近需要在程序中動態構造數據源,查了些資料,備錄於此。

體系結構

我暫時沒有系統的學習過UML,對各種圖的規范畫法不了解。所以上面的圖僅供參考,不保證其合乎規范。

對於上圖,需要說明:

組件之間的依賴關系,從上至下;即上面的組件依賴於下面的。

spring-jdbc和commons-dbcp分別是對應jar包的名稱;忽略了版本號。

上述5個組件的作用分別如下:

組件名稱 組件作用 數據庫驅動包 各數據庫廠商提供的jdbc實現;其實數據源也是基於jdbc技術的 properties配置文件 jdbc鏈接的相關配置,和數據源的相關配置 commons-dbcp 提供數據源的實現,依賴與配置文件和驅動包 spring-jdbc 主要是使用其中的JdbcTemplate工具類,而它依賴於數據源;JdbcTemplate提供了很多實用的方法,具體請參考spring的api 業務代碼 基於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的限制

再次聲明,上述的模式只是猜測,沒有經過測試。

  • 創建數據源
    我們通過 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);
  • 訪問數據庫
    我比較喜歡使用 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。

Copyright © Linux教程網 All Rights Reserved