Проблемы с получением драйвера JTDS для принятия sendStringParametersAsUnicode = false? - PullRequest
6 голосов
/ 31 января 2012

Я использовал net.sourceforge.jtds.jdbc.Driver в качестве моего драйвера от MSSQL для всех моих приложений. У меня были проблемы с производительностью в подготовленном операторе, и я узнал, что sendStringParametersAsUnicode = false должно решить проблему. К сожалению, я не могу заставить водителя принять это значение. Я МОГУ заставить драйвер Microsoft com.microsoft.sqlserver.jdbc.SQLServerDriver принять параметр просто отлично:

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

работает в файле persistence.xml и в моем ds.xml. Подготовленные заявления идут быстро, 100 за 22 секунды.

Однако я не могу добиться такого же повышения производительности от 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 секунд!

У кого-нибудь были какие-нибудь идеи?

Спасибо

1 Ответ

2 голосов
/ 31 января 2012

Документация для sendStringParametersAsUnicode гласит:

Определяет, отправляются ли строковые параметры в базу данных SQL Server в Unicode или в кодировку символов по умолчанию для базы данных.Это серьезно влияет на производительность SQL Server 2000, поскольку он не приводит к автоматическому приведению типов (как это делает 7.0), а это означает, что если для столбца индекса задано Unicode, а строка передается с использованием кодировки символов по умолчанию (или наоборот), SQLServer выполнитсканирование индекса вместо поиска индекса.Для Sybase определяет, отправляются ли строки, которые не могут быть закодированы в кодировке сервера, в виде строк Unicode.У логики кодирования наблюдается снижение производительности, поэтому установите для этого параметра значение false, если типы данных unitext или univarchar не используются или если charset имеет значение utf-8.

Так что если включить его в запрос,что делает вашу производительность хуже , что говорит о том, что не подходит для вашего запроса, и вы видите именно те проблемы, о которых предупреждает документация.

Если вы видят повышение производительности в драйвере MS, вполне возможно, что sendStringParametersAsUnicode имеет слегка другое значение для JTDS, чем для драйвера MS.

Какова производительность каждого драйвера, как с опцией, так и без?Какую версию SQL Server вы используете?Что показывает ваш профилировщик запросов для этих запросов?Какой у вас запрос и какие типы полей используются?

...