<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日韩综合一区久热| 国产在线观看免费视频播放器 | 免费a在线观看播放| 男人和女人高潮免费网站| 亚洲另类少妇17p| 9久久免费国产精品特黄| 国产亚洲精品精华液| 18级成人毛片免费观看| 亚洲制服丝袜一区二区三区| 成人人免费夜夜视频观看| 香港特级三A毛片免费观看| 57PAO成人国产永久免费视频| 浮力影院亚洲国产第一页| 99久久精品毛片免费播放| 亚洲国产精品国产自在在线| 国产黄色免费观看| 亚洲欧洲第一a在线观看| 日韩吃奶摸下AA片免费观看| 亚洲黄网在线观看| 精品国产精品久久一区免费式| 免费国产va视频永久在线观看| 国产亚洲大尺度无码无码专线 | 在线观看的免费网站无遮挡| 亚洲成a人片在线观看无码| 91免费国产自产地址入| 亚洲avav天堂av在线网毛片| 亚洲精品无码久久千人斩| 男女做羞羞的事视频免费观看无遮挡| 亚洲久本草在线中文字幕| 大陆一级毛片免费视频观看i|