Проблемы с получением драйвера JTDS для принятия sendStringParametersAsUnicode=false?
Я использовал 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 ответ
Документация для 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 вы используете? Что показывает ваш профилировщик запросов для этих запросов? Какой у вас запрос и какие типы полей используются?