java.sql.SQLException:数据库已在DriverManager.getConnection(url)处关闭(仅适用于竹子)

java.sql.SQLException:数据库已在DriverManager.getConnection(url)处关闭(仅适用于竹子),java,sqlite,bamboo,Java,Sqlite,Bamboo,我处于一种不舒服的情况下,一些测试在本地工作,但一旦被推到存储库和由bambon构建,就会导致异常 竹子上发生的错误如下: java.sql.SQLException: The database has been closed 它出现在此处的conn=DriverManager.getConnection(url)行中: 有趣的是,这并不总是失败,但只是有时失败 我已经在成功和失败的情况下检查了URL,这两种情况下都是相同的: jdbc:sqlite:Test_数据库/requirement.

我处于一种不舒服的情况下,一些测试在本地工作,但一旦被推到存储库和由bambon构建,就会导致异常

竹子上发生的错误如下:

java.sql.SQLException: The database has been closed
它出现在此处的
conn=DriverManager.getConnection(url)
行中:

有趣的是,这并不总是失败,但只是有时失败

我已经在成功和失败的情况下检查了URL,这两种情况下都是相同的:
jdbc:sqlite:Test_数据库/requirement.db

你知道什么会导致或影响这种情况吗?为什么这种情况只发生在竹子上,而不发生在我的本地机器上?即使我从本地机器上删除了数据库,因此它必须是新创建的,我也不能在本地复制错误


编辑:

以下是直到输入本地代码的堆栈跟踪:

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)

编辑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:

我现在找到了一种方法让它发挥作用,尽管这个特定的解决方案看起来更像是一个解决问题的方法,而不是一个合适的解决方案,所以我仍然有兴趣听到一些想法,什么可能是真正的原因,以及如何修复它

如上所述,错误仅出现在竹子上的测试中。共有134个测试分布在14个类中,所有这些测试都继承自RequirementControllerTest抽象类

在Bambol上失败的版本中,SQL连接是在RequirementControllerTest中的@BeforEach方法中创建的,因此为134个测试中的每一个都创建了一个新的连接

我们通过将这个@beforeach方法切换到@BeforeAll方法,成功地使它通过了,所以现在SQL连接只创建了14次,而不是134次,有趣的是,这在Bambol上有效


所以我现在想知道的是,如果它只做了14次,但如果它做了134次,它怎么能工作呢?为什么它只发生在竹子上?

我认为
url中的路径格式错误
无效

也就是说,这个
jdbc:sqlite:Test\u 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.
        } 
    }
注意:
文件夹
字段应包含创建目录的完整路径

例如:

String folder = "D:/Test_Database";
jdbc:sqlite:D:/Test_Database/requirement.db or jdbc:sqlite:requirement.db 
遵循以下语法:

jdbc:sqlite:db_file_path
-这里的
db_file_path
应该是绝对或相对路径

例如:

String folder = "D:/Test_Database";
jdbc:sqlite:D:/Test_Database/requirement.db or jdbc:sqlite:requirement.db 
照此


阅读此内容。

根据此错误,表示数据库不存在。您可能想尝试为数据库文件指定一个绝对路径。不,我尝试了这个,但相同的错误仍然存在。请注意,虽然这两种变体在我的本地机器上都能工作,但Bambor仍然抛出相同的旧错误。这应该行得通。在当地,它确实如此,但不是在竹子上。我已经尝试过用各种常见的方法调试它,但没有一种方法能让我成功。这就是为什么我在这上面贴了悬赏。如果这很容易,我就不会这么做了。无论如何,在本地,以下连接字符串(令人惊讶地)可以工作:
jdbc:sqlite:C:\projects\camelot\knight\db/workspace.db
。我还将在这里发布竹串,以防出现故障,只要我设法让竹串恢复工作,这在周末就中断了。我很想这样做,但由于某种原因,竹串现在已经中断,所以我现在无法验证。我在过去的3个小时里一直在努力让他们重新开始工作,但我们仍然被卡住了。但是,请允许我再次指出,我认为这是一个非常不可能的解决方案,因为如果我使用BeforeAll而不是beforeach创建连接,并且即使使用beforeach,一些测试通过,而其他测试失败,即使连接字符串对于通过和失败的测试都是相同的,测试也会通过。我以前已经试过了。刚刚让Bambol再次工作,失败的原因是:
jdbc:sqlite:/var/atlassian/application data/bambol/xml data/build dir/CAM-KNIG48-JOB1/knight/db/workspace.db
无论如何,我认为这不是我想要的,所以我不会把它作为答案,但既然这至少给了我一些思考的东西,我希望你无论如何都能得到赏金。