2015-07-11 5 views
1

Это может выглядеть как повторяющийся вопрос, но это не так. Я пробовал искать ответ на это более 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) 
+0

Что делает «наконец»? –

+0

в последнем блоке, я пытаюсь закрыть соединение снова. На всякий случай, соединение не происходит с первой попытки из-за какой-либо ошибки. В то же время, я делаю то же самое с PreparedStatment, однако он ошибается, говоря: соединение закрыто. –

+0

Это, похоже, не вопрос о SQLite, а вопрос о Java JDBC API. Было бы полезно предоставить трассировку стека ошибки, которую вы получаете. Кроме того, учебник JDBC на веб-сайте Oracle Java будет охватывать все материалы, которые вы хотите узнать: http://docs.oracle.com/javase/tutorial/jdbc/ – scottb

ответ

3

finally блока выполняется независимо от того, было ли выброшено исключение или нет. Поэтому вам не нужно использовать его, чтобы снова закрыть соединение , но использовать его как единственное место, где вы закрываете соединение. Во-вторых, обратите внимание, что закрытие соединения не сбросит переменную 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"); 
    } 
} 
1

Mureinik прав, но еще лучше использовать функцию try-with-resources, так что вам даже не придется беспокоиться о закрытии ничего (вручную) в первую очередь.

try (Connection cnn = DriverManager.getConnection(database.getDB_URL()); 
    PreparedStatement p = cnn.prepareStatement(query)) { 
    // prepare your statement 
    try (ResultSet rs = p.executeQuery()) { 
    // process result set 
    } 
} catch (SQLException e) { 
    throw new RuntimeException("Unexpected SQLException", e); 
} 
Смежные вопросы