2016-11-18 71 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

相关问题