Hibernate 和 MS sql server 的性能很慢

use*_*806 5 java hibernate

我正在使用 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格式发送字符串。

请建议我如何处理这个场景。

谢谢。

gpa*_*gpa 7

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

jdbc:sqlserver://localhost:1433;databaseName=mydb;sendStringParametersAsUnicode=false
Run Code Online (Sandbox Code Playgroud)


Ana*_*rma 0

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

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