概述
最早接觸的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源代碼,這裡僅對我用到的幾個進行介紹:
在上述配置項中,前四個是必要的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。