<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    隨筆分類(23)

    積分與排名

    • 積分 - 13833
    • 排名 - 2083

    最新評論

    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全鼠標操作。以前我做過很多次了,駕輕就熟,很快搞定。編寫好pojohbmtest一下,結果拋出了一個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中,有多個屬性:namepasswordphone等,還有一個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 閱讀(333) 評論(0)  編輯  收藏 所屬分類: Tech Flow
    主站蜘蛛池模板: 亚洲AV无码专区亚洲AV桃| 亚洲精品美女在线观看| 国产精品久久久久久亚洲影视| 999国内精品永久免费视频| 亚洲网站在线观看| 中文字幕亚洲无线码| 黄页网站在线视频免费| 免费精品无码AV片在线观看| 老司机永久免费网站在线观看| 亚洲AV无码乱码麻豆精品国产| 新最免费影视大全在线播放| 91制片厂制作传媒免费版樱花| 亚洲国产精品一区二区久久| 午夜精品免费在线观看| 亚洲综合久久久久久中文字幕| ww4545四虎永久免费地址| 久久精品国产99国产精品亚洲| 免费国产黄线在线观看| 亚洲国产精品国自产拍AV| 国精产品一区一区三区免费视频| 爽爽日本在线视频免费| 国产成人 亚洲欧洲| 亚洲日本中文字幕一区二区三区| 亚洲色欲色欲www在线播放 | 粉色视频免费入口| 亚洲欧洲久久久精品| 精品一区二区三区免费| 亚洲日本中文字幕天堂网| 巨胸喷奶水www永久免费| 亚洲AV日韩AV永久无码绿巨人| 国产精品玖玖美女张开腿让男人桶爽免费看| 亚洲综合国产精品第一页| 国产精品免费观看调教网| 中文字幕亚洲日韩无线码| 无码国产精品一区二区免费3p| 亚洲国产亚洲综合在线尤物| 2015日韩永久免费视频播放| 亚洲色欲啪啪久久WWW综合网| 亚洲一级特黄大片无码毛片 | 免费观看激色视频网站(性色)| 亚洲av无码专区在线电影|