gpt4 book ai didi

java - SQLite JDBC 连接的准确语法是什么?

转载 作者:行者123 更新时间:2023-11-29 03:07:32 25 4
gpt4 key购买 nike

这可能看起来像一个重复的问题,但事实并非如此。我已经尝试在 48 小时内寻找答案,但没有结果。

首先,关闭PreparedStatment & ResultSet 是否需要SQLite JDBC Connection?因为我做不到。

try {
Class.forName(database.getJDBC_DRIVER());
cnn = DriverManager.getConnection(database.getDB_URL());
p = cnn.prepareStatement(query);
rs = p.executeQuery();
p.close();
cnn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
System.out.println(p.isClosed());
if (cnn != null) cnn.close();
System.out.println(p.isClosed());
} catch (SQLException e) {
e.printStackTrace();
}
}

如您所见,我在 try block 中关闭了 PreparedStatement。但是,当我在 try block 外检查 same 的状态时,结果总是错误的。 (这意味着它没有关闭)。

此外,如果我在 finally block 中有以下代码,它会抛出一个错误,指出连接已关闭。我对要做什么感到非常困惑。我应该保持原样吗?我的代码不会有一些泄漏吗?

} finally {
try {
if (p != null) p.close(); *// It errors out here...*
if (cnn != null) cnn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

下面是堆栈跟踪 -

java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)
at org.sqlite.core.DB.newSQLException(DB.java:890)
at org.sqlite.core.CoreStatement.internalClose(CoreStatement.java:109)
at org.sqlite.jdbc3.JDBC3Statement.close(JDBC3Statement.java:35)
at tg.cat.DropDown.getData(DropDown.java:28)
at tg.loginscreen.LoginScreenLayout.<init>(LoginScreenLayout.java:22)
at tg.cat.CatMain.getScene(CatMain.java:27)
at tg.cat.CatMain.start(CatMain.java:18)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$53/855499929.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/186276003.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/1635925971.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/237061348.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

最佳答案

无论是否抛出异常,finally block 都会执行。所以你不需要使用它来关闭连接再次,而是将它用作你关闭连接的唯一地方。其次,请注意关闭连接不会将变量重置为 null:

try {
Class.forName(database.getJDBC_DRIVER());
cnn = DriverManager.getConnection(database.getDB_URL());
p = cnn.prepareStatement(query);
rs = p.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (p != null) {
p.close();
}
if (cnn != null) {
cnn.close();
}
} catch (SQLException e) {
System.err.println("Can't close an object, not much I can do");
}
}

关于java - SQLite JDBC 连接的准确语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31353808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com