Соединение JDBC с SQL Server 2000 сбрасывается случайным образом на сервере Solaris - PullRequest
0 голосов
/ 18 июля 2009

У меня следующий метод вызывается в веб-приложении Java EE.

public static void submitToPending()
{
    Db db;
    ResultSet rs;

    try
    {
        db = new Db("Database.properties");

        rs = db.issueQuery(getDescriptorList());

        while (rs.next())
        {
            db.insertApplicationData(rs.getString("Id"));
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        db = null;
        rs = null;
    }
}

Это сокращенный фрагмент кода, который я выполняю, чтобы вставить около 40 000 новых записей в базу данных SQL Server 2000. Этот код выполняется из JSP, размещенного на сервере Solaris 10 в рабочей среде. До этого года этот код должен был обрабатывать только около 18 000 записей, и он работал безупречно. В этом году было сделано несколько обновлений, и, если не сказать больше, сейчас обрабатывается около 40 000 записей.

Во время разработки я тестирую это в той же базе данных, которая используется в производстве (поскольку наборы записей не конфликтуют) с моего ПК с Windows с сервера Tomcat, работающего внутри Eclipse. Все работает правильно, и все около 40 000 записей попадают в базу данных.

Когда я установил сайт на рабочий сервер и запустил тест, я заметил, что в середине процесса произошел сбой, со следующим сообщением об исключении:

com.microsoft.sqlserver.jdbc.SQLServerException: соединение закрыто. в com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError (Неизвестный источник) на com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed (Неизвестный источник) на com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed (неизвестный источник) на com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed (Неизвестный источник) на com.microsoft.sqlserver.jdbc.SQLServerResultSet.next (неизвестный источник) at (ClassNameOmittedToProtectTheInnocent.java:74)

SQL Server настроен на неограниченное количество одновременных подключений, неограниченное время ожидания. Предполагая, что мой код в классе Db в порядке (так как он работает на стороне Windows и до увеличения данных хорошо работал на стороне Solaris), какие идеи стоит начать проверять

Я попытался отследить SQL Server, чтобы выяснить, происходит ли что-то с соединениями, но он, кажется, жив, даже после записи трассировки стека.

Если я могу предоставить какую-либо дополнительную информацию, пожалуйста, дайте мне знать. Я сделаю все возможное, чтобы помочь.

1 Ответ

0 голосов
/ 18 июля 2009

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

Я предполагаю, что вы столкнулись с ограничением ресурсов, таким как максимальное количество дескрипторов открытых файлов на процесс, и причиной закрытия этой проблемы будет сбой при закрытии результирующего набора / соединения.

...