2010-03-18 64 views
1

我想使用JPA over JDBC来创建新应用程序。我严格使用JPA实体管理器的命名查询和基本CRUD方法,它允许我(在Hibernate或任何其他JPA实现的帮助下)提取将在数据库上执行的所有SQL本机查询。通过这个静态查询列表,我明白我可以构建一个DB2包,它是我的请求的所有执行计划。针对不使用PureQuery的DB2执行静态SQL查询

所以我的问题是:通过JDBC对DB2执行这些查询是否会利用这些执行计划,或不是?我了解PureQuery产品可以捕获sql订单的列表。它是否仍然通过JDBC而不是通过PureQuery特定的API提供更多?这种特定的DB2静态绑定功能?或者它相当于JDBC?

谢谢你的任何回答。

+0

问题已回答,无论如何,请随时添加与此主题相关的其他评论! – aravisski 2010-03-19 09:23:00

回答

4

JDBC应用程序只执行动态SQL(即DB2不使用静态包)。

只有两种方法可以获得静态SQL(其中查询存储在数据库的包中):使用SQLJ(它消除了JPA/Hibernate)或使用pureQuery(它位于JDBC和数据库之间)编写应用程序)。请记住,即使使用动态SQL,DB2也会缓存查询的执行计划,因此如果它们的执行频率不够(即它们仍保留在缓存中),那么您将看不到查询编译的开销。只有当查询是一个确切的逐字节匹配时,缓存才有用,因此select * from t1 where c1 = 1select * from t1 where c1 = 2select * from t1 where C1 = 1(它们给出相同的结果,但查询不同)不一样。使用参数标记(select * from t1 where c1 = ?)是关键。您的DBA可以调整目录高速缓存的大小,以帮助最大限度地提高此高速缓存的命中率。

尽管缓存有助于避免反复编译查询,但它不提供静态SQL所执行的计划稳定性,因此YMMV。

+0

谢谢你这个有价值的答案:) – aravisski 2010-03-19 09:22:17