2011-07-21 90 views
1

我們有使用Hibernate和struts構建的J2EE應用程序。我們有基於RMI註冊表的業務功能實施。Hibernate Java批處理操作死鎖

在我們的應用程序中,大約250個併發用戶將上傳包含名爲BATCHDET的大量數據的批次。這些批次首先通過30個驗證進行驗證,然後將它們插入到有父母和子女關係的表格中。類似的還有其他需要大量處理的操作。像打印等

有一個表包含1000萬條記錄,它被訪問的所有類型的交易和每個進程插入和更新此表。這張桌子已成爲瓶頸。我們也添加了所有必需的索引。

運行30分鐘後,系統JVM利用所有分配的6GB RAM並進入無響應狀態。當我們試圖找出根本原因時,我們意識到數據庫站點存在鎖定,並且與BATCHDET表相關的所有更新查詢處於等待狀態。我們嘗試了所有可能但沒有運氣的事情。

使用50個併發用戶嘗試時系統運行平穩,但與預期的250個用戶一起死亡。 BATCHDET對幾乎每個模塊都有很大的依賴性,而不是重新編寫實現的心情,請您提供快速解決方案。

我們在Hibernate中使用HIbernateUtil.java實現基於線程的事務劃分。事務隔離是ReadCommitted。有沒有什麼辦法可以讓我們爲所有的搜索操作定義不鎖。我們有Oracle 10G RDBMS。

讓我知道你是否需要任何其他細節。

〜阿馬爾

+0

有多少線程正在同時訪問數據庫?你使用連接池嗎?你有多少個連接池?更新失敗並給出重試選項的機會? – Olaf

回答

0

「有什麼辦法,我們可以定義沒有鎖的所有搜索操作。我們的Oracle 10g RDBMS。」

Oracle不鎖定選擇,所以實際上這已經到位。

Oracle也鎖定在行級別,所以您需要停止考慮整個表並開始思考單個行。

您需要與您的DBA交談。 Oracle在系統和會話級別監控大量的內容。 DBA將能夠查看v $會話,並告訴您單個會話正在等待什麼。有可能是鎖,它可能是一個磁盤瓶頸,它可能是索引爭用,或者它可能是數據庫被閒置在那裏,所有的低效率都在java層。