У меня есть следующий метод, вызываемый в веб-приложении 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, чтобы узнать, происходит ли что-то с соединениями, но он кажется живым даже после того, как написана трассировка стека.
Если я могу предоставить любую дополнительную информацию, пожалуйста, дайте мне знать. Я сделаю все возможное, чтобы помочь.
Даже если эти вызовы находятся в блоке finally? Это не работает при вызове метода db.insertApplicationData(). – karlgrz
Нет ли шанса на то, что другая часть кода, работающая в другом месте с аналогичной плохой обработкой его объектов JDBC, вызывает у вас эту проблему здесь или у вас есть эксклюзивный доступ к db с этим? – banjollity
@KG - моя точка зрения заключается в том, что вы не закрываете/освобождаете ресурсы должным образом, так что это вызовет проблемы позже на –