> Glad to see that I was on the right track. Just one little
> question. Why do
> you have
> two finally blocks in the DAO - can't you close both the statement and the
> result set
> in the same finally block?
This is because when you close the statement, the result set might not
necessarily exists. See comments below:
> > public Page findByKey(Connection connection, String key, int start,
> int
> > count )
> > throws SQLException
> > {
> > PreparedStatement stmt = connection.prepareStatement (
> > SQL_FIND_BY_KEY,
> > ResultSet.TYPE_SCROLL_INSENSITIVE,
> > ResultSet.CONCUR_READ_ONLY );
> > try {
> >
> > stmt.setString ( 1, key );
If the above line throws an exception, the ResultSet doesn't exist yet.
Execution will resume at stmt.close() in the second finally. You can't have
rs.close() in the second finally as rs is out of scope.
> > stmt.setString ( 2, key );
> > stmt.setString ( 3, key );
> >
> > ResultSet rs = stmt.executeQuery ( );
> > try {
> > return toPage ( rs, start, count );
> > }
> > finally {
> > rs.close();
> > }
> > }
> > finally {
> > stmt.close();
> > }
> > }
If you allocate a lot of stuff, e.g. a Connection, a PreparedStatement and a
ResultSet in a method, all the finally clauses can clutter the code, and in
that case I usually do something like this instead:
void method() {
Connection connection = null;
PreparedStatement statement = null;
ResultSet results = null;
try {
connection = getConnection();
statement = connection.prepareStatement(...);
statement.setString(...);
results = statement.executeQuery();
...
}
finally {
if(results != null) results.close();
if(statement != null) statement.close();
if(connection != null) connection.close();
}
}
What I don't like about this is the C-ish convention of declaring all
variables in the beginning of the method. It works fine, though. In reality
I'd also encapsulate if(xxx != null) xxx.close() into a method to avoid code
duplication.
Unfortunately, both of these solutions clutter the code more or less.
Paradoxally, garbage collected languages such as Java force you to do a lot
of resource handling using finally clauses. In C++, code like the above
would be much cleaner, thanks to the RAII pattern.
Martin
-------------------------------------------------------
This SF.NET email is sponsored by: eBay
Great deals on office technology -- on eBay now! Click here:
http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user