Это может выглядеть как повторяющийся вопрос, но это не так. Я пробовал искать ответ на это более 48 часов без каких-либо результатов.Каков точный синтаксис для SQLite JDBC Connections?
Во-первых, закрывается 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();
}
}
Как вы можете видеть, я закрыл PreparedStatement
внутри блока Try. Однако, когда я проверяю состояние одного и того же вне блока try, результат всегда является ложным. (что означает, что он не закрыт).
Кроме того, если в блоке finally есть код ниже, он выдает сообщение об ошибке, указывающее, что соединение закрыто. Я очень смущен тем, что делать. Должен ли я просто оставить это как есть. Разве у моего кода не было бы утечки?
} 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)
Что делает «наконец»? –
в последнем блоке, я пытаюсь закрыть соединение снова. На всякий случай, соединение не происходит с первой попытки из-за какой-либо ошибки. В то же время, я делаю то же самое с PreparedStatment, однако он ошибается, говоря: соединение закрыто. –
Это, похоже, не вопрос о SQLite, а вопрос о Java JDBC API. Было бы полезно предоставить трассировку стека ошибки, которую вы получаете. Кроме того, учебник JDBC на веб-сайте Oracle Java будет охватывать все материалы, которые вы хотите узнать: http://docs.oracle.com/javase/tutorial/jdbc/ – scottb