6

一直使用 net.sourceforge.jtds.jdbc.Driver 作为我所有应用程序的 MSSQL 驱动程序。我在准备好的语句中遇到了性能问题,并且了解到 sendStringParametersAsUnicode=false 应该可以解决问题。不幸的是,我似乎无法让司机接受这个价值。我可以让微软驱动程序 com.microsoft.sqlserver.jdbc.SQLServerDriver 接受参数就好了:

jdbc:sqlserver://servername:1433;databaseName=dbname;sendStringParametersAsUnicode=false

在persistence.xml 和我的ds.xml 中工作。准备好的语句很快,22 秒内 100 条。

但是,我似乎无法从 JTDS 中获得同样的性能提升。它仍然在准备好的语句周围徘徊,每次迭代需要几秒钟。

我在字符串上尝试了几种变体,并在我的测试(persistence.xml 与 Hibernate.connection.url)和服务器与 JTA 和 ds.xml 中看到相同的滞后。

jdbc:jtds:sqlserver://server:1433/dbname;sendStringParametersAsUnicode=false

jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;databaseName=dbname

jdbc:jtds:sqlserver://server:1433;sendStringParametersAsUnicode=false;selectMethod=cursor;socketKeepAlive=true;databaseName=dbname

我读到的所有内容都表明 Microsoft 驱动程序较慢,而且我的公司过去曾遇到过问题。如果可能的话,我真的很想使用 JTDS,但不能等待准备好的语句 10 秒!

有人有什么想法吗?

谢谢

4

1 回答 1

2

状态的文档sendStringParametersAsUnicode

确定字符串参数是以 Unicode 还是以数据库的默认字符编码发送到 SQL Server 数据库。这会严重影响 SQL Server 2000 的性能,因为它不会自动转换类型(如 7.0 所做的那样),这意味着如果索引列是 Unicode 并且使用默认字符编码(或其他方式)提交字符串,SQLServer 将执行索引扫描而不是索引查找。对于 Sybase,确定不能在服务器字符集中编码的字符串是否作为 unicode 字符串发送。编码逻辑会影响性能,因此如果未使用 unitext 或 univarchar 数据类型或 charset 为 utf-8,则将此选项设置为 false。

因此,如果将它包含在您的查询中会使您的性能变差,这表明它适合您的查询,并且您会看到文档警告的确切问题。

如果您看到MS 驱动程序的性能提升,那么sendStringParametersAsUnicodeJTDS 的含义可能与 MS 驱动程序的含义略有不同。

有和没有这个选项的每个驱动程序的性能如何?您使用的是什么版本的 SQL Server?您的查询分析器为这些查询显示了什么?您的查询是什么?所涉及的字段类型是什么?

于 2012-01-31T07:16:05.367 回答