java. sql .SQLException: база данных была закрыта в DriverManager.getConnection (url) только для Bamboo - PullRequest
2 голосов
/ 08 апреля 2020

Я нахожусь в неудобной ситуации, когда некоторые тесты работают локально, но вызывают исключение после того, как 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?

1 Ответ

0 голосов
/ 21 апреля 2020

Я думаю, что неверно сформирован путь в url неверно.

То есть этот jdbc:sqlite:Test_Database/requirement.db сформирован неверный путь.

Обновите код так:

public RequirementRepository(String folder) throws SQLException, DatabaseNotConnectedException {
        File file = new File(folder);
        file.mkdirs();
        String url = "jdbc:sqlite:" + file.getAbsolutePath() + "/requirement.db";
        try (Connection conn = DriverManager.getConnection(url);
             Statement statement = conn.createStatement();) {
            [Very long SQL statement]
        } catch(SQLException e) {
           // TODO: throw exception.
        } 
    }

Примечание: поле folder должно содержать полный путь, по которому должен быть создан каталог.

Например:

String folder = "D:/Test_Database";

Следуйте этому синтаксису:

jdbc:sqlite:db_file_path - здесь db_file_path должен быть абсолютным или относительным путем.

Например:

jdbc:sqlite:D:/Test_Database/requirement.db or jdbc:sqlite:requirement.db 

Следуйте этому blog

Читать Рабочий каталог Bamboo Поддержка Atlassian .

...