![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[z/OS]](../images/ngzos.gif)
动态和部署 EJB 查询服务比较
您可使用 Dynamic Query Service 在运行时对动态构造的实体 Bean 构建和执行查询,而不是在部署时定义它们。使用动态查询,您可以灵活地获取运行时定义的查询并使用 Enterprise JavaBeans (EJB)-Query Language (QL) 功能。除了支持 EJB-QL 查询的所有功能外,动态查询还将添加对于标准静态查询不可用的功能。两个示例是直接从 Bean 本身选择多个数据字段(静态查询当前仅允许选择一个字段)的能力和直接执行查询中的业务方法的能力。
您可以通过动态查询有效地创建效率更高和资源要求更少的应用程序。例如,查询结果中需要两个数据字段。因为标准 EJB-QL 查询只可以选择一个数据字段,所以必须选择整个 EJB 对象并从通过数据访问方法(可能遍历进程中容器管理关系 (CMR) 的边界)返回的结果中抽取所需的数据。然而,当使用动态查询时,您可以在不使用其他 CMR 遍历或 accessor 方法的情况下,直接从查询中获取两个数据段。此原理是评估动态查询是否可用于获取更高性能的关键。除了检索它所需的业务逻辑量外,您还 应该查看必须检索的数据量,例如,CMR 遍历或 accessor 方法。
使用查询中的参数而不是字面值,是另一个性能注意事项。在大多数情况下,最好将条件值定义为查询中的参数,然后通过适当的机制传递那些参数。通过使用此方法,您有较大机会匹配高速缓存的查询计划,而且就不需要从头开始解析和构建计划了。例如,“SELECT Object(o) FROM schemaname AS oWHERE o.fieldname LIKE foo”,更适合表示为“SELECT Object(o)FROM schemaname AS o WHERE o.fieldname LIKE ?1”并具有作为参数传递给 executeQuery 方法的值 foo。结果是同一动态查询结构的任何接下来的执行(除了不同字符串文字值情况),都作为计划高速缓存命中(其交付较好的“受观察”性能)注册。
当作为等价的静态查询的直接替换使用时,动态查询大约比静态变体慢 25%。除了执行查询计划外,为查询解析和构建计划的需要也会引起这种速度减慢。在静态变化中,这些成本将在部署时支付。尽管这样,使用动态查询获得的添加的功能(特别是在单个查询中、甚至是跨 CMR 选择多个数据字段的能力)创造了机会以利用动态查询,从而提高了性能。