2016-11-18 75 views
0

I'm相當新的Java EE和有關於Wildfly 10上運行的應用程序服務器的應用程序,在我的情況下,理解問題如何在Wildfly中「刷新」已部署的應用程序?

我的問題是,對象顯然是保持自己的狀態,一旦他們在那裏實例化應用程序啓動,即使我關閉並重新打開瀏覽器會話。就我而言,我正在使用試圖打開jdbc連接的bean,並在出現錯誤時寫入facelet的消息。

因此,爲了測試場景,我關閉了數據庫並啓動了應用程序。如預期的那樣,出現錯誤消息。現在,重新啓動數據庫後,它仍然沒有連接並給我「無數據庫」消息。必須完全重啓應用程序服務器才能使bean重新啓動。

所以問題是,我必須做什麼,重新初始化我的應用程序的所有涉及的對象實例?

這裏是bean的問題代碼:

@Named 
@Stateless 
public class CoworkerProducer 
{ 
    @Inject 
    private EntityManager em; 

    @Resource(lookup="java:/JMPostgres") 
    private DataSource dsJM; 

    public void addCoworkers(Long projectId) 
    { 
     Project managedProject = em.find(Project.class, projectId); 
     Long jmId = managedProject.getJmId(); 
     try { 
      Connection con = dsJM.getConnection(); 
      PreparedStatement ps = con.prepareStatement("SELECT * FROM employees e, departments d WHERE e.department_id = d.id AND d.project_id = " + jmId); 
      ResultSet result = ps.executeQuery(); 
      while(result.next()){ 
       Coworker cow = new Coworker(); 
       cow.setProject(managedProject); 
       em.persist(cow); 
      }  
     } 
     catch (SQLException e) { 
      final FacesContext facesContext = FacesContext.getCurrentInstance(); 
      facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "no database!", null)); 
     } 
    } 
} 
+0

你爲什麼要注入'EntityManager',並在同一時間注射'DatasSource'? –

+0

,因爲我從DataSource(外部RDBMS)讀取一些數據並將該數據存儲在實體管理器持久化的對象中,然後 – Prefect73

回答

0

這是最好的做法,讓容器,你的情況Wildfly 10,處理數據庫連接,您可以配置在standalone.xml文件。

Documentation for configuration

0

在你的情況下,在創建一個Wildfly(池)數據源,並啓用Wildfly連接驗證和連接重試。這樣,Wildfly將管理您的數據庫連接並在失敗時重新建立連接。

一旦你安裝在Wildfly MySQL驅動程序,您可以創建Wildfly管理控制檯上的數據源(默認情況下它運行在端口9990)或JBoss的CLI。

延伸閱讀:

+0

其實我已經這樣做了。我已經在Wildfly中創建了Postgres數據源,儘管我將所有池和超時設置保留爲默認值。這是規格問題嗎?如果是這樣,我該如何設置參數讓Wildfly嘗試重新打開每個新瀏覽器會話的連接? – Prefect73

+0

數據源的配置將取決於您的應用程序使用的數據庫資源(例如,數據庫連接)。在任何Java EE規範中,沒有針對連接池的具體默認配置值。 –

+0

謝謝布哈克。我只想讓Wildfly嘗試重新連接到每個新會話的Db,或者更好地爲每個JSF頁面的新請求重新連接。 – Prefect73

相關問題