首先,我的框架是帶有JSF,託管bean,EJB和JPA的Java EE 6。我編寫了一個簡單的程序來查詢數據庫中的信息。所以當我點擊一個按鈕時,它觸發了一個託管bean的事件,其中一個事件監聽器方法將訪問EJB方法。 EJB方法將對實體進行簡單的select
查詢。如果數據庫關閉之前或期間的時間我select
,我得到一個異常JavaEE6:如何在數據庫關閉時保護Web應用程序
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 51,460 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
Error Code: 0
如何維護從此異常了嗎?這裏肯定是try, catch
,但不知道放在哪裏。當我做em.createNamedQuery
或em.remove
時,我試着去捕捉com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
,但是我得到一個錯誤說:Exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException is never thrown in body of corresponding try statement
。
下面是我的代碼,我會在哪裏捕捉異常?
這是我EJB
@Stateless
@LocalBean
public class DocumentSBean {
@PersistenceContext
private EntityManager em;
public List<User> listUser(){
Query query = em.createNamedQuery("User.listUser");
query.returnResultList();
}
}
這是我ManagedBean
@ManagedBean(name="document")
@ViewScoped
public class DisplayListController implements Serializable {
@EJB
DocumentSBean sBean;
List<User> users = null;
public void foo(){
users = sBean.listUser();
}
}
編輯
我嘗試下面列出兩種方式,但仍返回狀態200,而不是500的fireb UG
<p:commandButton update="myform" actionListener="#{document.setDisplayFacility}" rendered="#{utility.admin}" value="Facilities"/>
OR
<p:commandButton update="myform" actionListener="#{document.setDisplayFacility}" rendered="#{utility.admin}" value="Facilities">
<p:ajax actionListener="#{document.setDisplayFacility}" update="myform" event="click"/>
</p:commandButton>
這裏是setDisplayFacility()
public void setDisplayFacility(){
facilities = sBean.getAllFacilities(); //sBean is EJB
displayFacility = true;
}
這是一篇很棒的文章。謝謝。當我捕獲java.lang.Exception時,它會工作,但是當我捕獲org.eclipse.persistence.exceptions.DatabaseException時,它不起作用。也許它再次嵌套到更一般的異常。我有一個問題與主題非常相關。我關閉了mysql服務器來測試它,但是當我把它重新打開時,事情不會恢復正常。意思是,當我點擊從數據庫查詢的組件時,它仍然給我錯誤頁面。我必須重新啓動glassfish和mysql服務器才能使其正常工作。這是正常的,BalusC? – 2010-11-17 17:57:29
您需要捕捉跟蹤中最上面的異常,而不是跟蹤中的嵌套(「引起的」)部分。至於重新連接失敗:您需要在管理控制檯或'sun-resources.xml'文件中配置Glassfish'jdbc-connection-pool'重試次數和時間間隔(取決於您定義池的位置)。您可以在這裏找到所有配置選項:http://docs.sun.com/app/docs/doc/820-4507/6nfvg4rbl?l=en&a=view Ctrl + F「重試」。 – BalusC 2010-11-17 18:15:34
謝謝。當我說catch時,我的意思是讓ServletContainer在web.xml中捕獲它。 'java.lang.Exception'很好,但是'org.eclipse.persistence.exceptions.DatabaseException'失敗了。對於ajax錯誤捕獲。我遇到了一個有趣的問題。當數據庫關閉並且發出ajax請求時,我的ajax-loader.gif開始旋轉,但它旋轉得像永遠一樣,但只要刷新頁面,就會顯示錯誤。我會期待ajax-loader.gif一段時間,然後出現錯誤。任何想法,爲什麼,BalusC? – 2010-11-17 19:06:20