2009-07-17 1 views
0

У меня есть следующий метод, вызываемый в веб-приложении Java EE.Подключение JDBC к SQL Server 2000 случайным образом сброшено на сервере Solaris

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 PC, с сервера Tomcat, работающего внутри Eclipse. Все работает правильно, и все 40 000 или около того записей попадают в базу данных.

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

com.microsoft.sqlserver.jdbc.SQLServerException: Соединение закрыто. в com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError (Unknown Source) в com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed (Unknown Source) в com.microsoft.sqlserver.jdbc.SQLServerStatement.checkClosed (Unknown Source) в com.microsoft.sqlserver.jdbc.SQLServerResultSet.checkClosed (Unknown Source) в com.microsoft.sqlserver.jdbc.SQLServerResultSet.next (Unknown Source) в (ClassNameOmittedToProtectTheInnocent.java:74)

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

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

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

ответ

0

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

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

+0

Даже если эти вызовы находятся в блоке finally? Это не работает при вызове метода db.insertApplicationData(). – karlgrz

+0

Нет ли шанса на то, что другая часть кода, работающая в другом месте с аналогичной плохой обработкой его объектов JDBC, вызывает у вас эту проблему здесь или у вас есть эксклюзивный доступ к db с этим? – banjollity

+0

@KG - моя точка зрения заключается в том, что вы не закрываете/освобождаете ресурсы должным образом, так что это вызовет проблемы позже на –