<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)

    積分與排名

    • 積分 - 13765
    • 排名 - 2082

    最新評論

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

    bromon原創(chuàng) 請尊重版權(quán)

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

    一、weblogic 8.1下的數(shù)據(jù)庫連接池配置

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

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

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

    后來找到的解決辦法是,配置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中都存在。

    二、時間字段的處理

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

    一個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函數(shù)來做日期轉(zhuǎn)換,很多java程序員也許會和我一樣,直覺的采用”yyyy-MM-dd HH:mm:ss”的格式作為時間的正則表達式,但是在oracle中會引起錯誤:”O(jiān)RA 01810 格式代碼出現(xiàn)兩次。原因是sql中不區(qū)分大小寫,MMmm被認為是相同的格式代碼,所以oraclesql采用了mi代替分鐘。

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

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

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

    三、Hibernatelazy loading

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

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

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

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

    Lazy laoding應該是兩條select構(gòu)成的,但是在使用了OpenSessionInView模式后,系統(tǒng)執(zhí)行了一條select,session就被關閉了。相同的代碼,放到普通環(huán)境中,就執(zhí)行正常,目前這個問題已經(jīng)在java eye掛了很久,無人解答。望高人指點。

    posted on 2005-07-11 17:31 Sometimes Java 閱讀(331) 評論(0)  編輯  收藏 所屬分類: Tech Flow
    主站蜘蛛池模板: 国产精品亚洲专区无码唯爱网| 亚洲精品日韩专区silk| 色窝窝亚洲AV网在线观看| 欧美a级在线现免费观看| 亚洲国产成人精品电影| 亚洲精品在线免费观看| 亚洲伊人久久精品| 中文字幕人成无码免费视频| 亚洲精品午夜国产va久久| 免费无码黄动漫在线观看| 精品亚洲国产成人av| 免费一级做a爰片久久毛片潮喷| 国产精品久久亚洲一区二区| 一区国严二区亚洲三区| 一区二区3区免费视频| 亚洲成av人影院| 国产精品视频免费观看| 亚洲夂夂婷婷色拍WW47| 免费少妇a级毛片| 久久av免费天堂小草播放| 亚洲国产成人精品不卡青青草原| 免费看片在线观看| 亚洲AV成人片无码网站| 中文字幕亚洲激情| 美丽姑娘免费观看在线观看中文版| 亚洲人成日本在线观看| 国产一区二区三区免费视频| 窝窝影视午夜看片免费| 亚洲国产综合专区电影在线| 精品久久久久国产免费| 一区二区免费在线观看| 亚洲尹人香蕉网在线视颅| 成人毛片免费观看视频在线| 一级毛片免费毛片毛片| 亚洲最新中文字幕| jjzz亚洲亚洲女人| 久久综合给合久久国产免费| 亚洲AV成人无码网站| 亚洲国产精品久久久久| 宅男666在线永久免费观看| 免费国产叼嘿视频大全网站|