我想在新应用程序中使用JPA而不是JDBC。我正在严格使用JPA实体管理器的命名查询和基本CRUD方法,它允许我(在Hibernate或任何其他JPA实现的帮助下)提取将在数据库上执行的所有SQL本机查询。通过这个静态查询列表,我了解到我可以构建一个DB2包,它是我请求的所有执行计划。
所以我的问题是:通过JDBC对DB2执行这些查询是否会利用这些执行计划?据我所知,PureQuery产品可以捕获sql命令列表。是否仍然通过JDBC而不是通过PureQuery特定的API提供更多?这样一个特定的DB2静态绑定功能?或者它等同于JDBC?
感谢您的回答。
答案 0 :(得分:4)
JDBC应用程序仅执行动态SQL(即DB2不使用静态包)。
获取静态SQL只有两种方法(查询存储在数据库的包中):使用SQLJ编写应用程序(消除JPA / Hibernate)或使用pureQuery(位于JDBC和数据库之间)
请记住,即使使用动态SQL,DB2也会缓存查询的执行计划,因此如果它们足够频繁地执行(即它们保留在缓存中),那么您将看不到查询编译的开销。缓存仅在查询是完全逐字节匹配时才有用,因此select * from t1 where c1 = 1
与select * from t1 where c1 = 2
不同,select * from t1 where C1 = 1
也不相同(这会产生相同的结果,但是查询不同)。使用参数标记(select * from t1 where c1 = ?
)是关键。您的DBA可以调整目录高速缓存的大小,以帮助最大化此高速缓存的命中率。
尽管缓存有助于避免重复编译查询,但它不提供静态SQL所做的计划稳定性,因此YMMV。