Java7 sqljdbc4 - ошибка SQL 08S01 в ​​getConnection () - PullRequest
9 голосов
/ 24 января 2012

Я пытаюсь написать действительно простое приложение с графическим интерфейсом для вставки некоторых записей. в базу данных и чтение некоторых записей (ничего сложного, только 1 таблица с 3 строками, без отношений). Источник ...

package EntryProg;
import java.sql.*;
import com.microsoft.sqlserver.jdbc.*;



public class CourseDataEntryHandler
{
    private Connection connect;
    private CallableStatement callState;
    private ResultSet rSet;
    private SQLServerDataSource dSource;

    public CourseDataEntryHandler()
    {
        rSet = null;
        callState = null;

        dSource = new SQLServerDataSource();
        dSource.setUser(REDACTED);
        dSource.setPassword(REDACTED);
        dSource.setServerName(REDACTED);
        dSource.setPortNumber(REDACTED);
        dSource.setDatabaseName(REDACTED);
        dSource.setEncrypt(true);
        dSource.setTrustServerCertificate(true);
        try
        {

Ошибка здесь

            connect = dSource.getConnection();

ошибка конца

        }
        catch (SQLServerException e)
        {
            //TODO Figure out how to handle -- logging for now, console
            do
            {
                System.out.println(e.getErrorCode());
                System.out.println(e.getMessage());
                System.out.println(e.getSQLState());
                e = (SQLServerException) e.getNextException();
            } while (e != null);
            System.out.println("END");
            System.out.println();
        }
    }

Я получаю следующую ошибку ...

(код) 0

(сообщение) SQL Server не вернул ответ. Соединение было закрыто.

(состояние) 08S01

Я проверил, что пользователь, пароль, имя сервера, порт и имя базы данных являются точными. Если я изменяю имя пользователя на недопустимое, я получаю сообщение об ошибке «Не удалось войти в систему», поэтому я знаю, что попал на сервер.

Мне не удалось полностью подключиться один раз, поэтому я знаю, что это не проблема «слишком большого количества подключений», поскольку единственный человек, который в настоящее время вошел на сервер, - это я через sql management studio. Это не работает, когда я выхожу из системы, так что определенно не проблема # соединений.

Пользователь приложения также имеет права доступа для чтения данных / записи данных. (Я использую Eclipse, если это имеет значение. И я ссылаюсь на библиотеку sqljdbc4.jar).

Я в недоумении, куда идти с устранением неполадок. Любая помощь будет принята с благодарностью.

EDIT Обновление - я также попробовал строку подключения и с помощью DriverManager.getConnection (connString) установил соединение, которое тоже не работало. Результат тот же. Кроме того, SQL Server 2008 r2 - это версия сервера sql, которую я использую.

EDIT Я написал быструю C # -программу для проверки соединения, конечно же, соединение прекрасно работает в .net, к сожалению, я должен использовать Java для этого проекта (это проект, который я решил сделать самостоятельно для класса, единственным требованием является это будет на Java ... учитель не имеет ни малейшего представления, что происходит).

Ответы [ 2 ]

15 голосов
/ 25 января 2012

Прокомментируйте строку с помощью setEncrypt(true):

...
dSource.setDatabaseName(REDACTED);
//dSource.setEncrypt(true);
dSource.setTrustServerCertificate(true);
...

У вас могут быть проблемы с настройкой шифрования.Из документации setEncrypt (...) :

Если для свойства шифрования установлено значение true , драйвер JDBC для Microsoft SQL Server использует JVM по умолчаниюПоставщик безопасности JSSE для согласования шифрования SSL с SQL Server.Поставщик безопасности по умолчанию может не поддерживать все функции, необходимые для успешного согласования шифрования SSL.Например, поставщик безопасности по умолчанию может не поддерживать размер открытого ключа RSA, используемого в SSL-сертификате SQL Server.В этом случае поставщик безопасности по умолчанию может вызвать ошибку, которая заставит драйвер JDBC разорвать соединение.Чтобы решить эту проблему, выполните одно из следующих действий:

  • Настройте SQL Server с сертификатом сервера, имеющим открытый ключ RSA меньшего размера

  • Настройка JVM для использования другого поставщика безопасности JSSE в файле свойств безопасности "/lib/security/java.security"

  • Использование другой JVM

Обновление

С версиями Java 1.6.0_29 и 7.0.0_1 Oracle представила исправление безопасности для атаки SSL / TLS BEAST, которое, скорее всего, приведет к оченьта же проблема.Известно, что указанное выше исправление безопасности создает проблемы при подключении базы данных к серверу MSSQL с драйвером jTDS и драйвером Microsoft.Вы можете либо

  • принять решение не использовать шифрование, не используя setEncrypt(true) (как указано выше)
  • , либо, если это выполняется MSSQL Server, вы можете отключить Javaисправить в вашей JVM, установив системное свойство -Djsse.enableCBCProtection=false.Имейте в виду, это повлияет на все соединения SSL в пределах одной и той же виртуальной машины.
0 голосов
/ 05 апреля 2013

Иногда конфигурация двигателя изменяется таким образом, что он не принимает внешние подключения. После некоторых исследований у меня сработало следующее:

  1. Открыть диспетчер конфигурации SQL Server
  2. Настройка конфигурации сервера SQL Server
  3. MSSQLSERVER Protocols (Двойной щелчок)
  4. Просмотр TCP / IP (должен быть включен) (Открыть)
  5. Перейти на вкладку «IP-адреса»
  6. Введите "TCP-порт": 1433
  7. Включенные и активированные параметры должны быть включены: Да
  8. Перезапустить службу
...