【问题标题】:performance is slow with hibernate and MS sql server休眠和 MS sql 服务器的性能很慢
【发布时间】:2011-07-01 08:25:38
【问题描述】:

我用的是hibernate,db是sqlserver。 SQL Server 将支持 Unicode 的数据类型与仅支持 ASCII 的数据类型区分开来。例如,支持 Unicode 的字符数据类型是 nchar、nvarchar、longnvarchar,其中它们的 ASCII 计数器部分分别是 char、varchar 和 longvarchar。默认情况下,所有 Microsoft 的 JDBC 驱动程序都将 Unicode 格式的字符串发送到 SQL Server,而不管 SQL Server 中定义的相应列的数据类型是否支持 Unicode。在列的数据类型支持Unicode的情况下,一切都很顺利。但是,在列的数据类型不支持 Unicode 的情况下,会出现严重的性能问题,尤其是在数据提取期间。 SQL Server 在进行比较之前尝试将表中的非 unicode 数据类型转换为 unicode 数据类型。此外,如果非 unicode 列上存在索引,它将被忽略。这最终会导致在数据获取期间进行全表扫描,从而大大减慢搜索查询的速度。

我们使用的解决方案是,我们发现有一个名为 sendStringParametersAsUnicode 的属性有助于摆脱这种 unicode 转换。此属性默认为“true”,这使得 JDBC 驱动程序默认将 Unicode 格式的每个字符串发送到数据库。我们关闭了这个属性。

我的问题是现在我们无法以 unicode 转换发送数据。将来如果 varchar 的 db 列更改为 nvarchar(只有一列而不是所有 varchar 列),现在我们应该以 unicode 格式发送字符串。

请建议我如何处理这种情况。

谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您需要在连接字符串url中指定属性:sendStringParametersAsUnicode=false。

    jdbc:sqlserver://localhost:1433;databaseName=mydb;sendStringParametersAsUnicode=false
    

    【讨论】:

      【解决方案2】:

      Unicode 是用于与 SQL Server 通信的本机字符串表示形式,如果您要转换为 MBCS(多字节字符集),那么您将对每个字符串进行 2 次转换。我建议如果您关心性能,请使用所有 Unicode 而不是所有 MBCS

      参考:http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/249c629f-b8f2-4a8a-91e8-aad0d83919ca

      【讨论】:

      • 您好 Anantha Sharma,感谢您的回复。该链接没有任何内容,如果您有任何其他链接或信息,请与我分享。
      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2014-07-26
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多