将JavaEE应用程序从Oracle迁移到SQL Server 2016。 使用Java 1.7,jboss 4.2.3.GA和hibernate 3.2.4.sp1。
应用程序使用javax EntityManager进行数据库访问,因此查询如下所示:
List<ServiceProvider> providers = entityManager
.createQuery("FROM ServiceProvider sp order by sp.id")
.setMaxResults(spCount)
.getResultList();
但SQL跟踪显示查询包含在exec sp_executesql
中。
例如,上面的内容变为exec sp_executesql N'SELECT TOP (50) ....'
如果我追踪来自SSRS报告的查询,则不会包含在sp_executesql
中。
这种转变的原因是什么?
**编辑成一个专注的问题。
答案 0 :(得分:0)
正如@MarkRotteveel在他的评论中提到的,在执行预准备语句时,似乎MS JDBC驱动程序使用sp_executesql
。修复丢失的pool-size
和prepared-statement-cache-size
选项后,我们发现Oracle 12g和SQL Server 2016之间没有区别,所以我不相信使用sp_executesql
或者在那里,它非常最小。
<min-pool-size>20</min-pool-size>
<max-pool-size>220</max-pool-size>
<prepared-statement-cache-size>100</prepared-statement-cache-size>
有趣的是,Hibernate在针对MSSQL而不是Oracle时执行的查询更少。我原始帖子中的查询导致12个Oracle查询与MSSQL中的10个查询。