MSSQL,SP_EXECUTESQL和javax.persistence.EntityManager

时间:2017-12-08 19:38:28

标签: java sql-server hibernate jdbc

将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中。

这种转变的原因是什么?

**编辑成一个专注的问题。

1 个答案:

答案 0 :(得分:0)

正如@MarkRotteveel在他的评论中提到的,在执行预准备语句时,似乎MS JDBC驱动程序使用sp_executesql。修复丢失的pool-sizeprepared-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个查询。