MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          來源:http://bbs.xml.org.cn/blog/more.asp?name=hongrui&id=10283

          JdbcTemplate為什末包含javax.sql.DataSource ,而不是用connections,因為使用DataSource有很多優點,
          我們在復雜的應用中如果使用connections(當然可以使用 DataSource.getConnection()得到),
          必須捕捉SQLExceptions,這樣spring框架無法處理 SQLException異常,在拋出異常時,無法關閉connection。
          connection為什末不能共享?DataSource.getConnection()得到connection實例,一般都不相同,這由連接池的具體實現控制,
          所以大家不要使用oracle的臨時表,因為如果每次連接都不一樣的話,下次就沒有臨時表了。
          建立連接是消耗時間的,在一段時間內,connection只能由一個用戶使用,為了避免transaction產生沖突,一些jdbc驅動不支持多線程訪問同一個connection。還有一個更致命的問題,眾所周知,transaction是基于connection的,即使多個用戶使用一個連接,大家在一個事務內操作數據庫,一個數據庫操作rollback,所有的數據庫操作全部rollback,所以一直保持一個打開的connection代價是很大的。
          我只有在兩個方法中處理一個事務時,把 connection作為變量傳遞。

          關于statement,resultset和connection的問題

          statement,resultset屬于弱refrence,即如果statement關掉,resultset就會被自動釋構,弱 refrence的做法不保險,所以JDBC3.0開始明確規定了如果connection被關,所有statement都應該關,不過這取決于使用的數據庫驅動。
          應該DBMS 執行操作后,顯式的關閉statement ,因為在connection關閉前,JDBC statement仍舊處于打開狀態,當返回resultset后,關閉statement是必要的,尤其在遇到異常的時候。
          如果不使用 connection pool可以直接關閉connection,不考慮statement的關閉,使用連接池的時候,務必關閉statement,否則你的連接馬上被用光,使用statement pooling除外。
          主站蜘蛛池模板: 华蓥市| 岳阳市| 景德镇市| 喜德县| 安义县| 镇安县| 乌审旗| 和平县| 张家川| 广饶县| 阜平县| 莱芜市| 潼南县| 凌云县| 韩城市| 景泰县| 景洪市| 土默特左旗| 勃利县| 南汇区| 子洲县| 荥经县| 新安县| 东丽区| 大方县| 汝南县| 台东市| 宁乡县| 阜平县| 横峰县| 林芝县| 松原市| 德阳市| 绥滨县| 天等县| 炉霍县| 宜川县| 大姚县| 甘谷县| 普兰县| 拉孜县|