Path: csiph.com!aioe.org!.POSTED!not-for-mail From: =?UTF-8?Q?Arne_Vajh=c3=b8j?= Newsgroups: comp.lang.java.programmer Subject: Re: Not closing a SQL(ite3) connection Date: Sat, 12 Aug 2017 09:52:07 -0400 Organization: Aioe.org NNTP Server Lines: 116 Message-ID: References: <87a839um2q.fsf@munus.decebal.nl> <874lte1pdj.fsf@munus.decebal.nl> <87k229z041.fsf@munus.decebal.nl> NNTP-Posting-Host: PBuS014lhzVyHjLbXmo/ZQ.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 X-Notice: Filtered by postfilter v. 0.8.2 Content-Language: en-US Xref: csiph.com comp.lang.java.programmer:37145 On 8/12/2017 4:00 AM, Cecil Westerhof wrote: > Arne Vajhøj writes: >> On 8/11/2017 4:26 AM, Cecil Westerhof wrote: >>> I have a strange problem. I made a class SQLite3ResultSet. There is a >>> lot of stuff to be removed, but that is just to find out if it is >>> doing what I think it is doing. > > You did not read this part? I did. >>> And the close method is (for now, because I want to test it): > > And also not this? I did. >>> @Override >>> stmt.close(); >>> resultSet.next(); >>> resultSet.close(); >> >> resultSet.close(); >> stmt.close(); >> >> was rather obvious. > > If you read my message a bit better, you would have seen that it is > not real code, but that I do things that are wrong to verify that the > good code does what I think it does. I got that this was test code. But it was not obvious to me exactly what was the test and what was context. >>> In the first try I close the stmt and then I do a resultSet.next(). I >>> would expect an exception, because I closed the stmt, but I do not get >>> an exception. Why not? >> >> There is nothing in documentation for next() requiring an exception to >> be thrown (ResultSet is not closed and it may not get a database error - >> maybe it does not even talk to the database). > > That was the problem. When using: > resultSet.getInt("Count"); > instead of: > resultSet.next(); > > I get the error I expected. Calling a getXxxx before next should give an error even if statement was not closed. > Now I can remove the stmt field out of my class. > > With this I verified that I did not get a Statement leak: > @Override > public void close() throws SQLite3Exception { > System.out.println("SQLite3ResultSet: closing open resources."); > try { > Statement stmt = resultSet.getStatement(); > > stmt.close(); > System.out.println("Closed stmt."); > resultSet.getInt("Count"); > System.out.println("Did getInt"); > resultSet.close(); > } catch (SQLException e) { > throw new SQLite3Exception("Could not close ResultSet."); > } > System.out.println("Closed resultSet."); > } > > I do get ‘Closed stmt, but I do not get ‘Did getInt’. So the closing > of stmt works. Unusual way to test that. But yes. > The real method is now: > @Override > public void close() throws SQLite3Exception { > boolean closedResultSet = false; > > try { > Statement stmt = resultSet.getStatement(); > > resultSet.close(); There mys be missing an assignment here. > stmt.close(); > } catch (SQLException e) { > if (closedResultSet) { > throw new SQLite3Exception("Could not close Statement after closing ResultSet."); > } > throw new SQLite3Exception("Could not close ResultSet."); I don't like this conditional here. Either separate catch or just let the SQLException propagate information about what the problem was. > } > System.out.println("Closed resultSet."); > } > > The reason that I wrote this code was that I do not want to have to > put a Statement and a ResultSet into my try with resources. I think it is common to use one try for Statement and one for ResultSet. Arne