Тонкий драйвер JDBC: неверная длина пакета [sic] - PullRequest
2 голосов
/ 23 марта 2009

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

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

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

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

threadObject.stop();

метод, поскольку мой реальный код не является многопоточным и не существует "дружественного" способа уничтожения встроенного потока. После нескольких (~ 2-3) остановленных потоков мое соединение JDBC выдает одну "недопустимую длину пакета" ошибка, за которой следуют исключения «Socket closed» для остальных тестов.

Я пробовал все это с одинаковыми результатами:

  • Повторно использовать то же соединение, что и фактический код использует
  • Создать одно новое соединение и повторно использовать это же второе соединение для всех Тесты
  • Закройте и заново создайте тестовое соединение каждый раз, когда я останавливаю () a длительный тест
  • Создать новое соединение для каждого теста (это работает до тех пор, пока я не увеличу максимальное количество соединений)

Я определил, что из двух соединений, «test» и «фактическое», «test» соединение является тем, которое выдает исключение.

Конфигурация:

  • Затмение 3.4
  • Соответствие Java 1.6
  • ojdbc14_g.jar JDBC Driver
  • Oracle 9 DB

Что я делаю не так? Есть ли другой способ обработки моего «тестового» соединения? Нужно ли перепроектировать мое «реальное» соединение только для запуска массового теста? Что вызывает ошибку «Недопустимая длина пакета»?

1 Ответ

2 голосов
/ 24 марта 2009

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

  1. Возможно, один из ваших потоков оставляет соединение в недопустимом состоянии. Что происходит с соединением, когда поток останавливается? В общих чертах, у вас должно быть место, где вы wait() вместо InterruptedException вместо остановки потока в середине операции. Connection должен быть закрыт в блоке finally независимо от того, произошло исключение или нет.

  2. Если вы хотите установить тайм-аут для операции JDBC, используйте Statement.setQueryTimeout () .

  3. Рассмотрите возможность использования пула соединений, например C3P0 . Это действительно легко настроить в коде, обратите внимание на это в частности. Он позаботится о большей части настройки / разрыва соединения и предоставит вашему коду действительное, готовое к использованию соединение.

  4. Подумайте об использовании собственного пакета java.util.concurrent в Java, а не о развертывании собственной стратегии выполнения. Взгляните на классы Executors и ExecutorService - они предоставляют средства для выполнения задачи в отдельном потоке и установки времени ожидания.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...