隨筆 - 24  文章 - 6  trackbacks - 0
          <2005年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          隨筆分類(23)

          積分與排名

          • 積分 - 13791
          • 排名 - 2084

          最新評論

          Tips of? hibernate +weblogic 8.1 + oracle 9.2 / db2 8.1

          bromon原創 請尊重版權

          ?????? 最近的工作都是在webligc 8.1 + hibernate的平臺上做開發,涉及的數據庫是oracle 9.2db2 8.1。對于這兩個數據庫我的了解都遠遠不夠,所以開發中遇到很多問題,還好問題都解決了,很感謝阿古。有的問題也許大家都會遇到,列出我的解決辦法,供大家參考。

          一、weblogic 8.1下的數據庫連接池配置

          weblogic 8.1下配置連接池是很容易的,通過console全鼠標操作。以前我做過很多次了,駕輕就熟,很快搞定。編寫好pojohbm,test一下,結果拋出了一個SQLException,具體信息我沒有記錄,大概意思是說:“事務沒有被提交,因為它處于一個分布式事務中,當分布式事務結束后它會被提交?!贝蜷_oracle,確實沒有看到測試數據,整個環境中我沒有使用JTA,也不存在分布式數據庫。Google了一下,看見別人的建議有:

          1、????????????? 選擇jdbc驅動的時候,不要使用xa系列驅動。這個其實大家都知道,xa系列驅動是為JTA準備的,我在配置連接池的時候也確實沒有選擇這類驅動。排除。

          2、????????????? 修改startWeblogic.cmd,不要啟動pointbase。查看startWeblogic.cmd后沒有發現有啟動pointbase的跡象,在端口列表中也沒有發現。排除。

          后來找到的解決辦法是,配置webloigcdata source時,有這么一個選項:

          Honor Global Transactions

          它的相關說明是:

          Specifies whether this data source will participate in existing global (XA) transactions. Unchecking this option while creating the data source should be done rarely and with care. This option can not be changed once the data source is created.

          ?????? 就是它了,把它去掉,try againpassed。?

          ?????? 上述問題在oracledb2中都存在。

          二、時間字段的處理

          開發過程中涉及到了時間的存儲和查詢,相關的處理要依靠oracledb2自己的函數,有小小區別。

          一個hibernate中對oracle進行時間查詢的例子:

          from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=to_date('"+start+"','yyyy-MM-dd HH:mi:ss') and ti.taskEndTime<=to_date('"+end+"','yyyy-MM-dd HH:mi:ss')";

          ?????? 其中的startend變量為java.util.Date()。使用了oracleto_date函數來做日期轉換,很多java程序員也許會和我一樣,直覺的采用”yyyy-MM-dd HH:mm:ss”的格式作為時間的正則表達式,但是在oracle中會引起錯誤:”ORA 01810 格式代碼出現兩次。原因是sql中不區分大小寫,MMmm被認為是相同的格式代碼,所以oraclesql采用了mi代替分鐘。

          ?????? DB2中的查詢語句是:

          from scene.pojo.TaskInfo as ti where and ti.taskStartTime>=timestamp('"+s+"') ?and ti.taskEndTime<=timestamp('"+e+"')";

          ?????? DB2中的函數是timestamp,無須指定時間格式。

          三、Hibernatelazy loading

          Lazy loading是進行集合映射時很有用處的優化選項,但是使用起來容易遇到問題。比如在我們的應用中,user->post形成一對多的映射,User中有一個包含postList。同時系統采用了一個HibernateSession來管理session,它的邏輯是每進行一次數據庫操作,就開新的session,操作完成后立即關閉該session。這樣做的好處是可以嚴格關閉session,避免菜鳥級的錯誤,但是hibernate.org并不推薦這么做。因為這不適合lazy loading,也不適合跨方法的事務。

          回到我們的例子,在User中,有多個屬性:name,password,phone等,還有一個List類型的posts。當我們對posts使用lazy laoding的時候,hibernate會在獲得User對象的時候,僅僅返回name,password,phone等基本屬性,當你訪問posts的時候,它才會從數據庫中提取posts需要的數據,這就是所謂lazy laoding。但是在我們的系統中,session是被立即關閉的,也就是在讀取了name,password,phone等基本屬性后,session已經close了,再進行lazy loaiding就會有異常。

          解決辦法是在close session之前,調用Hibernate.initialize(user.getPosts()),告訴系統,user.getPosts()是需要lazy laoding的。但是這樣做會破壞HibernateSession類的封裝,郁悶。

          后來采用所謂的OpenSessionInView模式,把session的周期交給servlet filter來管理,每當有request進來,就打開一個sessionresponse結束之后再關閉它,這樣可以讓session存在于整個請求周期中。但是在實際操作過程中,發現一下問題:

          Lazy laoding應該是兩條select構成的,但是在使用了OpenSessionInView模式后,系統執行了一條selectsession就被關閉了。相同的代碼,放到普通環境中,就執行正常,目前這個問題已經在java eye掛了很久,無人解答。望高人指點。

          posted on 2005-07-11 17:31 Sometimes Java 閱讀(332) 評論(0)  編輯  收藏 所屬分類: Tech Flow
          主站蜘蛛池模板: 将乐县| 清镇市| 庄河市| 澄江县| 汾阳市| 芦山县| 恩施市| 玉田县| 威海市| 米泉市| 缙云县| 马尔康县| 奎屯市| 西城区| 平顺县| 阜南县| 盱眙县| 锡林浩特市| 宁强县| 革吉县| 西平县| 天等县| 益阳市| 富阳市| 三河市| 海伦市| 台湾省| 娱乐| 从江县| 黑河市| 云林县| 阳信县| 响水县| 防城港市| 正镶白旗| 长沙市| 视频| 大名县| 长海县| 建湖县| 乐平市|