java.sql.SQLException:数据库已在DriverManager.getConnection(url)处关闭(仅适用于竹子)
我处于一种不舒服的情况下,一些测试在本地工作,但一旦被推到存储库和由bambon构建,就会导致异常 竹子上发生的错误如下: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.
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
无论如何,我认为这不是我想要的,所以我不会把它作为答案,但既然这至少给了我一些思考的东西,我希望你无论如何都能得到赏金。