这是我目前的代码。我有几个问题:
如果我想防止这两个错误,我应该使用哪种代码结构?我需要在try块中连接吗?我需要在哪里关闭连接?我需要在哪里关闭准备语句?
直到现在,我还无法通过自己连接不同页面的信息来找到解决方案。
public boolean checkForUser(String username){
try(Connection con = this.connect();
PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
ResultSet rs= pstmt.executeQuery();)
{
if (rueck.next()){
pstmt.close();
rs.close();
con.close();
//do some stuff
}
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
private PreparedStatement createPreparedStatementRegistrate(Connection conn, String username) throws SQLException {
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
return pstmt;
}
private Connection connect() {
String url = "jdbc:sqlite:user.db";
Connection con = null;
try {
con = DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
java.sql.SQLException: ResultSet closed
at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69)
at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:38)
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:443)
at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:215)
at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
at main.Server.<init>(Server.java:29)
at main.Server.main(Server.java:46)
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)
at org.sqlite.core.DB.newSQLException(DB.java:909)
at org.sqlite.core.CoreStatement.internalClose(CoreStatement.java:115)
at org.sqlite.jdbc3.JDBC3Statement.close(JDBC3Statement.java:35)
at org.sqlite.jdbc4.JDBC4Statement.close(JDBC4Statement.java:27)
at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:238)
at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
at main.Server.<init>(Server.java:29)
at main.Server.main(Server.java:46)
问题是,在处理结果集之前,您正在关闭结果集、语句和连接。这是不允许的:当您使用getString检索值时,需要打开结果集(未显示在代码中,但存在于堆栈跟踪中)。
由于您正在使用try with resource,它将在退出时关闭资源,因此甚至没有必要显式关闭。SQLite驱动程序似乎也不符合JDBC的要求,即关闭已经关闭的资源应该是不可操作的,因为它引发了一个异常,即在关闭语句时关闭了连接(可能是通过try with resources)。
您需要将代码更改为
public boolean checkForUser(String username){
try(Connection con = this.connect();
PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
ResultSet rs= pstmt.executeQuery();)
{
if (rueck.next()){
//do some stuff
}
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
也就是把线去掉
pstmt.close();
rs.close();
con.close();
问题内容: 我试图关闭数据库连接,但是有点困惑 我是否必须靠近它 要么 两者之间有什么区别? 问题答案: 这些方法只能关闭。您仍然必须关闭全部和实例。我建议这样做。就像是, 如果您使用我的实用程序,则finally块可能是,
问题内容: 我正在尝试使用jdbc-odbc桥创建一个简单的连接: 但是然后我得到这个异常: 有任何想法吗? 2009年3月24日更新:现在可以使用了。创建了一个用户数据源,由于某种原因该异常消失了。 作为一个普遍的问题,用Java处理数据库连接的最佳方法是什么? 问题答案: 为了回答您的一般问题,我想说处理Java中数据库连接的最佳方法是避免JDBC- ODBC桥。可以测试或学习JDBC,但不能
我试图关闭数据库连接。但是有了一点困惑,说 我是否必须靠近它 或者 这两者之间有什么区别?
我想通过pymongo阅读集合,但我得到以下错误: 回溯(最近的调用为last):文件“C://users/gsingh/pycharmprojects/mc/quizQuestionAnswers.py”,第21行,pprint.pprint(posts.find_one())文件“C:\users\gsingh\appdata\local\continuum\anaconda2\lib\sit
我在我的网络应用程序中使用spring mongo。当我在Tomcat7中取消部署应用程序时,内存泄漏。我怀疑可能是我没有明确关闭的Mongo对象。我想知道关闭它的正确方式(和位置)。
据我所知,每次初始化PreparedStatement时,语句都会缓存在为数据库连接分配的内存中。因此,如果初始化过多的PreparedStatement变量,则存在连接可用内存溢出的风险。 > 是否通过调用实例来释放缓存内存? 是否有两个包含相同的SQL的准备声明创建重复的缓存事件,或者数据库是否足够智能,不会缓存重复的准备声明的新实例? 示例1,此连接会溢出内存吗?: 如果会,那这个呢?: