代码之家  ›  专栏  ›  技术社区  ›  Andrew Grothe

MSSQL、SP\U EXECUTESQL和javax。坚持不懈实体管理器

  •  0
  • Andrew Grothe  · 技术社区  · 7 年前

    拥有一个正在从Oracle迁移到SQL Server 2016的JavaEE应用程序。 使用Java 1.7、jboss 4.2.3。GA和hibernate 3.2.4。sp1。

    应用程序使用javax EntityManager进行DB访问,因此查询如下所示:

        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 回复  |  直到 7 年前
        1
  •  0
  •   Andrew Grothe    7 年前

    正如@MarkRottveel在评论中提到的,MS JDBC驱动程序似乎使用 sp_executesql 执行准备好的语句时。一旦我们修复了我们的失踪 pool-size prepared-statement-cache-size 选项我们看不到Oracle 12g和SQL Server 2016之间的区别,因此我不认为使用 sp\U 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个。