`

不要在一个给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数据库的交互,编写了一个类库,将常见的数据库操作如打开、关闭、查询、插入、更新、删除等函数封装在一起。这样做的好处是提高了代码的可重用性...

    mysql数据库转瀚高数据库所需要的函数列表

    1、mysql数据库转国产化瀚高数据库; 2、有些函数在瀚高数据库中不存在,需要添加自定义函数。

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

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

    net通用数据库组件

    标题中的“net通用数据库组件”指的是一个专门为.NET框架设计的软件模块,它的目的是简化数据库操作,尤其是对于数据录入、查询、排序和分页等常见任务。这类组件通常封装了复杂的SQL语句生成和ADO.NET操作,让...

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

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

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

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

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

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

    Python 实现的一个将数据库的数据进行可视化显示的图表,使用流行的canvasjs前端组件,带动画,漂亮实用且易集成

    在实现过程中,开发者可能创建了一个或多个视图函数,这些函数在Django中负责处理特定的URL请求。视图函数会连接到SQLite数据库,执行SQL查询,然后将结果序列化成JSON格式,通过HTTP响应返回给前端。前端接收到数据...

    超市管理系统 数据库源文件 查询 存储器 函数 触发器

    同时,应提供数据恢复机制,以便在系统故障或数据损坏时能够恢复到正常状态。 9. **性能优化**:随着数据量的增长,系统的性能优化变得至关重要。这可能包括索引的使用、查询优化、数据库架构调整等策略,以保证...

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

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

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

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

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

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

    MySql函数详解!!!

    MySQL数据库提供了很多函数包括: 数学函数:数学函数主要用于处理数字,包括整型、浮点数等。 字符串函数:字符串函数是MySQL中最常用的一类函数,字符串函数主要用于处理表中的字符串。 日期和时间函数:MySQL的...

    力控与access数据库.docx

    在连接Access数据库之前,我们需要新建一个变量ConnectID,这是一个返回值(整型量),用于标识数据源。在连接数据库时,我们使用SQLConnect()函数,里面有两个变量:ConnectID和DataSourceDesc。DataSourceDesc...

    使用C#语言操作ADO数据库教程,访问数据库是大多数应用程序的一部分

    ADO.NET是.NET Framework的一部分,它提供了一组数据访问组件,用于连接到各种数据库系统,如SQL Server、Oracle、MySQL等。它以数据集(DataSet)为核心,实现了离线数据处理和数据源的直接连接。 2. 数据库连接...

    创建php连接数据库及打开数据库函数,随时调用

    每次访问数据库都必须创建数据连接和打开数据库,这样每次都需要重复编写这些代码,比较耗时耗力,所以我编写两个函数:创建数据库连接函数和打开相应数据库函数,在使用时可以直接在php文件中调用,非常方便!...

    Vc++编写一个相对完善的自动创建ODBC数据源的ODBC数据库程序

    在提供的"lhwy_odbc2"压缩包中,可能包含了一个示例工程,演示了以上所述的功能。通过阅读和分析源代码,你可以更深入地了解如何在VC++中实现ODBC数据库程序,包括动态创建数据源的细节。此外,学习和理解ODBC API...

    将数据库数据添加到TreeView控件中(DeLphi)..rar

    10. **代码示例**:在提供的压缩包中可能包含一个名为`codefans.net`的文件,这可能是代码示例或教程链接。实际的代码实现会涉及上述步骤的具体代码逻辑,包括连接数据库、创建数据集、设置数据源、绑定事件以及填充...

Global site tag (gtag.js) - Google Analytics