【问题标题】:Performance issues when calling database in getter method for dataTable, getter is called multiple times在dataTable的getter方法中调用数据库时的性能问题,getter被多次调用
【发布时间】:2015-07-10 03:38:04
【问题描述】:

我是 JSF 2.0 和 Primefaces 的新手,但看到 primefaces 展示,我决定使用它们创建我的应用程序。

我已经完成了我的申请,但注意到它非常慢。我在不同的地方放置了一些 system.out.println 来查看被调用的内容,我注意到有时我的控制器中的方法(例如调用我的 DAO 以从数据库中检索值的方法)在一个事件中被调用多达 6 次!我的页面中有很多数据表,所以有时多个数据表 * 6 调用每个表中填充的每个列表似乎这就是导致速度缓慢的原因。

我不确定我做错了什么,或者我是否做错了什么,但例如在我的控制器中,我有一个可能看起来像这样的方法,

public List<Addresses> getAddresses() {
     List<Addresses> addr = systemDao.getAddresses(userBean.userId);
     return addr;
}

在视图中,我将像在数据表元素上一样调用此方法来显示结果。

当我第一次加载它时,它只会调用一次,但是当我单击一个按钮以打开一个包含完全不相关数据的对话框时,这个 getAddresses() 可能会被调用 3-6 次,它与数据无关我在当前行动期间请求。有谁熟悉这个以及我可以如何加快我的申请速度?

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    您应该将业务/数据库逻辑放在 getter 中。它们旨在仅返回数据,而不是初始化/加载/填充 bean 的数据。您应该在 bean 的 @PostConstruct、action 方法或任何事件方法中执行业务/数据库逻辑,它们都只被调用一次,而不是在 getter 中。

    private List<Addresses> addr;
    
    @PostConstruct
    public void init() {
         addr = systemDao.getAddresses(userBean.userId);
    }
    
    public List<Addresses> getAddresses() {
         return addr;
    }
    

    如果您真的出于某种特殊原因需要在 getter 中执行此操作,那么您需要引入延迟加载。

    另见:

    【讨论】:

    • 我尝试过这种方法,但每次我这样做都会得到“构造函数抛出异常”的异常,所以我认为这是错误的做法。我再次调用我的 DAO,所以我不确定在我的托管 bean 构造函数中调用它时是否出现问题
    • 只处理异常。使用try-catch 或添加throws 子句。这与 JSF 无关,只是基本的 Java。
    • hrmm 我想在我的构造函数中抛出这样的异常对我来说似乎很奇怪,不过谢谢,我会试一试。
    • 为什么会很奇怪?当数据库关闭或查询毕竟是虚假的时,您希望您的应用程序做什么?显示错误页面,对吗?抛出异常是方法。
    • 不,我明白,但问题是我的数据库没有关闭,查询不是伪造的,每次都会抛出异常。我不太擅长 Java,但对我来说,获取该异常似乎是在说在构造函数中调用 DAO 是不对的。现在我确定你是对的,我的应用程序肯定有其他问题,因为当我从构造函数中调用我的 dao 时它不喜欢它。只有当我在 getter 等方法中调用 DAO 时,它才会编译和运行。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2016-01-04
    • 1970-01-01
    • 2018-05-21
    • 2018-07-14
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多