Это сложная проблема для решения SO, но я собираюсь сделать дикое предположение, основываясь на деталях, которые вы дали.
Гипотеза: все вставки в тесте происходят в транзакции, которая откатывается. (Вот почему BasicDataSource оставляет базу данных чистой - она откатывается в конце). Когда это перестает происходить (с помощью DriverManagerDataSource), тест проходит, но база данных не откатывается.
Это говорит о том, что хотя "оно только что создало предприятие в предыдущей строке кода!" транзакцию можно откатить, чтобы удалить запись.
Дальнейшая гипотеза (хорошо, что с переутомлением, попробуйте дикие догадки), что-то (либо в BasicDataSource, либо, скорее, в вашем собственном коде фреймворка) вызывает откат транзакции в финализаторе. Вот почему он работает более 10 раз, а затем завершается сбоем, и только как часть проекта - именно этот запуск запускает сборку мусора в этой точке, вызывая откат транзакции, вызывая новую строку кода для запуска новой транзакции. с записями в недопустимом состоянии.
РЕДАКТИРОВАТЬ: Из вашего редактирования кажется, что по какой-то причине при неудачном тесте вы получаете новое соединение с базой данных. Это соответствует моему сценарию выше, но также может быть объяснено, если указать, что по какой-то причине в этот момент в коде появляется новая транзакция, когда тест выполняется как часть всего проекта. Новая транзакция не видит вставку корпоративной записи, которая происходит в другой транзакции, и транзакция остается открытой и незафиксированной. Чтобы проверить это, нужно установить максимальный уровень изоляции транзакций, чтобы ничто не могло сканировать корпоративную таблицу, пока в ней есть транзакция. Тогда ваш код заблокируется, если этот сценарий верен.
Дальнейшее РЕДАКТИРОВАНИЕ: я имею в виду под финализатором, который вызывает close, что-то вроде этого:
public class SomeConnectionWrapper {
private Connection dbConnection;
protected void finalize() {
dbConnection.close();
}
}
Если SomeConnectionWrapper собрана сборщиком мусора и соединение закрыто, ваш пул соединений с базой данных вернет другое соединение.