`

不要在一个给UIData组件提供数据的函数中访问数据库!

    博客分类:
  • jsf
阅读更多
不要在一个给UIData组件提供数据的函数中访问数据库!例如<h:dataTable>,我经常看到有人这样做。这是个坏建议,只会带来坏的实施。 不要这样做!

大多数人都没有意识到(或许他们根本就没有关注他们使用的ORM工具的 SQL 输出日志)在 JSF 生命周期中, 这些表达式不仅仅被计算一次-- 通常多于一次。当每次值表达式提供给UIData组件值的时候,都会访问下数据库。在这之上,根据你获取的内容和如何实现的方式可能会改变结果集。On top of that, the result set could change depending on what you are retrieving and how you are doing it.

我将给出一个简单的示例,然后讲解下如何在 Seam中解决这个问题。

假设,你使用下面的类来取得一个User实体的数据,UserService 示例用来代理查询数据库的操作。

package example;

public class UserListBean {
    private UserService userService;

    public List getUsers() {
        return userService.findAll();
    }
}

然后在JSF配置文件中配置该类为managed bean。UserService通过一个EL值表达式注入(或许使用一个 EL
resolver 从Spring 容器中得到一个示例). 顺便提一下,设置该bean的作用域为session是另外一个坏的实践
这里我不讨论这个问题。如果你打算使用Session作用域,建议你去看看Seam的会话作用域。

<manage-bean>
  <managed-bean-name>userList</managed-bean-name>
  <managed-bean-class>example.UserListBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>userService</property-name>
    <property-value>#{userService}</property-value>
  </managed-property>
</manage-bean>

使用UserListBean类的 getUsers()方法给一个UIData组件提供数据是一个坏的实践,如下示例:

<h:dataTable id="users" var="user" value="#{userList.users}">
  <h:column>
    <f:facet name="header">Name</f:facet>
    #{user.name}
  </h:column>
</h:dataTable>

在这种情况下,当渲染页面的时候,SQL日志记录会显示多个查询记录,假设在该页面中还有个UICommand组件,在JSF postback节段会有其他的查询记录,

正确的做法是,绑定该list到一个上下文变量中,可以使用Seam的工厂组件,这样不管这个变量没查询了多少次,这个用户的list就会只在每个页面执行一次。注意下面我们使用了Seam的组件来代替上面的类。使用page 作用域就避免了在JSF postback节段重新查询数据。

package example;

@Name("userList")
public class UserListBean {
    @In
    private UserService userService;

    @Factory(value = "users", scope = ScopeType.PAGE)
    public List getUsers() {
        return userService.findAll();
    }
}

现在,我们就可以在JSF view中使用这个users 上下文变量了。

<h:dataTable id="users" var="user" value="#{users}">
  <h:column>
    <f:facet name="header">Name</f:facet>
    #{user.name}
  </h:column>
</h:dataTable>

请不要再一次进入前面提及的陷阱!
分享到:
评论

相关推荐

    在SQL2005/2008数据库中调用.NET组件中的函数方法例子程序

    这个例子程序展示了如何在SQL数据库环境中调用C#编写的.NET组件中的函数方法。 首先,我们需要了解SQL Server中的CLR集成。SQL Server 2005开始引入了对.NET Framework的内置支持,允许开发者使用.NET语言(如C#或...

    com组件的数据库连接文件

    在描述中提到的"封装类",意味着有开发者或团队为了简化MFC与ACCESS数据库的交互,编写了一个类库,将常见的数据库操作如打开、关闭、查询、插入、更新、删除等函数封装在一起。这样做的好处是提高了代码的可重用性...

    狂学数据库之关系模式的设计问题及数据的函数依赖

    关系模式的设计问题及数据的函数依赖一. 关系模式的设计问题1.1 数据依赖1.2 数据依赖对关系模式的影响二. 数据的函数依赖2.1 函数依赖2.1.1 函数依赖的定义2.1.2 函数依赖的3种基本情形2.2 函数依赖和码(关键字)...

    谈采用ASP数据库存取组件访问SQL Server数据库.pdf

    - 数据源:一个可以配置数据库连接信息的位置或配置项,可能是一个配置文件或者系统数据库中的设置。 2. 访问SQL Server数据库的方法 - 创建数据库连接:在访问数据库之前,首先需要创建一个数据库连接。可以通过两...

    用DB-Library for C函数访问SQL Server数据库.pdf

    DB-Library for C 是一个访问 SQL Server 数据库的函数库,提供了丰富的功能函数,能够使客户机和服务器之间的数据流在细粒度上进行控制。该函数库包括四个组件:应用程序、驱动程序管理器、驱动程序和数据源。 DB-...

    嵌入式SQL——C语言访问数据库

    这种方式极大地简化了数据库应用程序的开发,因为开发者可以在C语言程序中方便地执行各种数据库操作,如查询、插入、更新和删除数据。 在C语言中使用嵌入式SQL,首先需要了解SQL的基本语法,包括DML(数据操纵语言...

    MT4、MT5数据库访问dll组件fxdbs-demo

    MT4、MT5测试脚本是通过连接sqlserver(所以机器上要安装sqlserver数据库)读取northwind数据库中的Employees表中数据显示。 组件dll目录有四个函数 fnDBOpen 打开数据库 fnDBClose 关闭数据库 fnDBExecute 执行一...

    Excel函数应用之数据库函数.pdf

    数据库函数是 Microsoft Excel 中的一类函数,用于对存储在数据清单或数据库中的数据进行分析。这些函数统称为数据库函数(Dfunctions)。数据库函数有三个参数:database、field 和 criteria,这三个参数指向函数所...

    InTouch与关系数据库的数据交互.PDF

    8. 在InTouch中,需要新建一个窗口,并在新窗口中建立按钮和脚本来实现与关系数据库的数据交互。 9. 使用SQLConnect函数可以连接到关系数据库,并读取或写入关系数据库数据。 10. 使用SQLExec函数可以执行SQL语句...

    Excel函数之数据库函数

    在Excel中,数据库函数是一组专门设计用于处理大型数据列表的工具,它们允许用户执行类似于在数据库管理系统中进行的操作,如筛选、查询、计算和汇总数据。这些函数可以帮助用户高效地管理和分析数据,无需借助复杂...

    delphi XE5 ANDROID平台 调用 webservice并访问操作MSSQL数据库

    在服务端上,添加一个函数以访问操作 MSSQL 数据库。该函数使用 ADO 连接来连接 MSSQL 数据库,并执行 SQL 语句来获取数据。然后,将获取的数据转换为 XML 格式,并将其传递给客户端。 在客户端上,使用 THTTPRIO ...

    函数计算访问数据库示例集(MySQL、SQLServer、MongoDB、Redis)

    总的来说,这个示例集涵盖了四种不同类型数据库的访问方法,旨在帮助开发者熟练地在函数计算环境中集成和操作这些数据库。通过学习这些示例,你可以了解到如何在无服务器架构中灵活地处理数据存储和检索,这对于构建...

    vba连接访问数据库(access)

    在“vba连接访问数据库(access)”这个主题中,我们将探讨如何通过VBA代码与Access数据库进行交互,这对于数据处理、报告生成以及自动化工作流程非常有用。 首先,我们需要了解Access数据库的基本结构。Access...

    保存到数据库程序(VB6.0源代码编写)可将数据保存到access数据库中

    在VB6.0中与数据库交互,通常会使用ActiveX Data Objects (ADO)技术,它是Microsoft的数据访问接口,用于连接和操作各种数据源,包括Access数据库。下面我们将深入探讨如何利用VB6.0和ADO来实现数据保存到Access...

    神通数据库-数据库快速入门.pdf

    作为企业级大型、通用...在数据的转换过程中,向导能根据源数据和目标数据具体类型,通过内置的转换规则提供数据类型 的默认映射关系、数据类型的精度匹配、空与非空信息提取、主键及相关索引建立等辅助功能,帮助用

    qt 实现数据库操作和显示

    在提供的"StudentManageSystem"项目中,很可能是实现了一个学生管理系统,包括对学生的增删改查功能,并使用模型视图组件显示学生信息。你可能需要查看源代码以了解具体实现细节,例如如何构建模型,如何处理数据库...

    力控与access数据库.pdf

    在力控中,我们需要新建一个Access数据库,用于存储力控中的数据。新建Access数据库时,我们需要选择数据库名称,例如“表1”,并创建两个字段,ID(数字型)和Name(文本型)。 三、力控变量写入到Access数据库 ...

    怎样在PB中实出,将EXCEL数据表,导入到SQLSERVER数据库中[定义].pdf

    在 PB 中,可以通过多种方式将 EXCEL 数据表导入到 SQL SERVER 数据库中。下面是其中的一些方法: 1. 使用 IMPORTFILE() 函数 在 PB 中,可以使用 IMPORTFILE() 函数将 EXCEL 数据表导入到数据窗口中。例如: ``` ...

    PB-数据库保存图片并在Datawindow中显示

    标题 "PB-数据库保存图片并在Datawindow中显示" 涉及到的是使用PowerBuilder(PB)这个开发工具,将图片数据存储在数据库中,并在DataWindow控件中进行显示的技术。下面,我们将深入探讨这一主题。 1. **Power...

Global site tag (gtag.js) - Google Analytics