Я нахожусь в неудобной ситуации, когда некоторые тесты работают локально, но вызывают исключение после того, как Bamboo помещает в репозиторий и сборку.
Ошибка, возникающая в Bamboo, следующая:
java.sql.SQLException: The database has been closed
Это происходит здесь, в строке conn = DriverManager.getConnection(url)
:
public RequirementRepository(String folder) throws SQLException, DatabaseNotConnectedException {
new File(folder).mkdirs();
String url = "jdbc:sqlite:" + folder + "/requirement.db";
// create a connection to the database
conn = DriverManager.getConnection(url);
try (Statement statement = conn.createStatement()) {
[Very long SQL statement]
}
}
Интересно, что это происходит не всегда, а только иногда.
Я уже проверил URL как в следующих, так и в неудачных случаях, и в обоих случаях это одно и то же: jdbc:sqlite:Test_Database/requirement.db
Есть идеи, что может вызвать или повлиять на это, и почему это происходит только на Bamboo, а не на моей локальной машине? Даже если я удалю базу данных с локального компьютера, чтобы она была заново создана, я не смогу повторить ошибку локально.
РЕДАКТИРОВАТЬ:
Вот трассировка стека до точка, в которую он вводит локальный код:
java.sql.SQLException: java.sql.SQLException: The database has been closed
java.sql.SQLException: The database has been closed
at org.sqlite.core.NativeDB.throwex(NativeDB.java:478)
at org.sqlite.core.NativeDB.errmsg_utf8(Native Method)
at org.sqlite.core.NativeDB.errmsg(NativeDB.java:144)
at org.sqlite.core.DB.newSQLException(DB.java:953)
at org.sqlite.core.DB.throwex(DB.java:918)
at org.sqlite.core.NativeDB._open_utf8(Native Method)
at org.sqlite.core.NativeDB._open(NativeDB.java:78)
at org.sqlite.core.DB.open(DB.java:195)
at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:243)
at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:61)
at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28)
at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:21)
at org.sqlite.JDBC.createConnection(JDBC.java:116)
at org.sqlite.JDBC.connect(JDBC.java:90)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at dom_requirement.model.RequirementRepository.<init>(RequirementRepository.java:225)
Строка 225:
conn = DriverManager.getConnection(url);
РЕДАКТИРОВАТЬ 2:
Это также заметно, когда соединение устанавливается следующим образом:
public WorkspaceManager(String folder) throws SQLException {
new File(folder).mkdirs();
databaseConnectionUrl = "jdbc:sqlite:" + folder + "/workspace.db";
// create a connection to the database
try(Connection conn = DriverManager.getConnection(databaseConnectionUrl)){
try (Statement statement = conn.createStatement()) {
[Very long SQL statement]
}
}
}
В этом случае строка, вызывающая ошибку:
try(Connection conn = DriverManager.getConnection(databaseConnectionUrl)){
Сама трассировка стека остается неизменной.
РЕДАКТИРОВАТЬ 3:
Теперь я нашел способ заставить его работать, хотя это конкретное решение больше похоже на обходной путь, чем правильное решение, поэтому мне все еще интересно услышать об идеях, которые могут быть реальной причиной и как это исправить.
Как уже упоминалось выше, ошибка появляется только на тестах на Bamboo. В общей сложности это 134 теста, распределенных по 14 классам, каждый из которых наследуется от абстрактного класса RequirementControllerTest.
В версии, в которой происходит сбой в Bamboo, соединение SQL создается в методе @BeforeEach в RequirementControllerTest, поэтому для каждого из 134 тестов создается соединение fre sh.
Нам удалось его передать, переключив этот метод @BeforeEach на метод @BeforeAll, поэтому теперь соединение SQL создается только 14 раз вместо 134, и, что интересно, это работает на Bamboo.
Итак, сейчас мне интересно, как это сделать, если это сделано только 14 раз, а не если это сделано 134 раза? И почему это происходит только на Bamboo?