1

我正在尝试执行以下操作:我有一个网站,并且我的网站上有 jsf 页面。在某些页面中,我有一个DataTable,其中填充了数据库中的一些值。我想定期更新这个数据库,这样这些表中的值也会改变。当我搜索时,我发现我需要为此使用石英。我正在考虑制作一个托管 bean 来填充数据库中的表,然后从该 bean 的数据库中获取值。这是我的示例代码:

 <h:form>
        <rich:extendedDataTable style=" column-width: 174px; width:174px;" value="#{exchangeRates.values}" var="values"  id="accountsTable"  styleClass="accountsTable" headerClass="accountsTableHeader" rowClasses="accountsTableOddRow,accountsTableEvenRow"  >

            <rich:column width="40px;">
                <f:facet name="header">Currency</f:facet>
                   #{values.type}
            </rich:column>
            <rich:column width="45px;">
                <f:facet name="header">Alış</f:facet>
                   #{values.buy}
            </rich:column >
            <rich:column  width="45px;" >
                <f:facet name="header">Satış</f:facet>
                   #{values.sell}
            </rich:column>

        </rich:extendedDataTable>

以及此 jsf 页面的托管 bean:

private String value;
private ArrayList<Money> values = new ArrayList<>();

public ArrayList<Money> getValues() {
    try {
        getCurrentExchangeValue();
    } catch (IOException ex) {
        Logger.getLogger(ExchangeRates.class.getName()).log(Level.SEVERE, null, ex);
    }
    return values;
}

private void getCurrentExchangeValue() throws IOException {
     //GET THE VALUES FROM THE DATABASE AND
     //FILL THE  "values" ArrayList
}


public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

我在页面中的数据表已成功填充此代码,但未定期更新。我的问题是,我应该将“手动更新数据库”代码放在哪里?它应该在另一个函数中的这个托管 bean 上吗?我觉得我需要在免费中运行另一个线程,每当像 #{values.buy} 这样的东西调用托管 bean 时,线程应该更新数据库。我该怎么做?

谢谢

编辑:我认为我的问题不清楚,所以总结一下:我希望数据库定期更新,比如每 10 分钟一次。由于我从数据库中填充我的数据表,因此每当用户浏览查看此数据表的页面时,该表都会填充最新更新的数据库值。

4

3 回答 3

1

使用数据表内容自动更新数据库,您需要定期向服务器发出 AJAX 请求。

除非并且直到您向服务器发出请求,否则在服务器端代码上使用多线程将无济于事。

要发送周期性的 AJAX 请求,您可以使用 JS 计时器和 Richfaces AJAX 支持组件。

像这样启动计时器...

var pingInterval = 1000; // 1 sec
setInterval(contactServer, pingInterval);

function contactServer(){
    // send request to server 
}

您可以参考这里以了解有关使用 Richfaces 发送 AJAX 请求的各种选项。

于 2013-07-09T07:07:59.993 回答
0

在后台更新数据库不需要托管 bean。它都与服务器应该处理的业务逻辑有关。

您可以在上下文初始化期间或使用 Application Scoped Bean Post 构造方法启动ScheduledExecutorService 。

查看 Scoped 数据表可以使用 db 中的最新更改进行刷新。

于 2013-07-09T07:30:23.223 回答
0

前段时间我也遇到过类似的问题,得出以下结论:

至于在用户网络浏览器中自动更新页面,您可以使用 ajax。

至于更新数据库,您有哪些替代方案取决于您在什么环境中工作(web-server/servlet 容器和框架)。

如果您使用JPA来完成您的数据库工作,那么您将想要掌握EntityManager无法注入石英线程的数据库。同样在由石英管理的线程中,您将无法访问 JSF上下文(如果您使用它,也无法访问 CDI 上下文)。如果您在使用EJB 3.1的 Web 服务器上,那么您可以使用@Schedule. 这样,您将能够注入EntityManager并获取 JSF/CDI 上下文,尽管它在调度方面没有石英所做的一切。如果您直接连接到数据库,那么石英是一个非常好的选择。如果您需要访问 JSF/CDI 上下文并且没有 EJB 3.1(或者如果您需要石英具有但@Schedule缺少那么您可以拥有一个调用 Web 服务(例如 JAX-RS)的石英作业,该服务将访问上下文。

总结一下:

如果您需要 JPA 或 JSF/CDI 上下文并且可以使用@Schedule在作业
中更新数据库。@Schedule

如果您需要 JPA 但不能使用@Schedule或需要高级调度:
设置一个调用 web 服务并让 web 服务更新数据库的石英作业。

如果您直接连接到数据库:
使用石英作业并直接从那里更新数据库。

于 2013-07-10T13:21:46.767 回答