JDBC requires that each execution of ps.executeQuery() returns a new ResultSet object, thus looking at the code within EmbedResultSet() constructor is worth while.
There are at least four sub-optimal pieces of code:
1) (long)stmt.getQueryTimeout() * 1000L;
Each creation a multiplication by 1000 is executed, could be avoided by having the
value in ms calculated once and stored in EmbedStatement when setQueryTimeout is called.
This call checks the Statement object to see if it is open, but it must be open since it is creating a ResultSet. Can be avoided by having EmbedResultSet use the final field that holds the concurrency, if iw was made package protected.
3) final int columnCount = getMetaData().getColumnCount();
This creates a ResultSetMetaData object that will not be used in the typical case (at least I think it will not be used). Using resultDescription.getColumnCount() would get the count with no object creation.
4) this.currentRow = factory.getValueRow(columnCount);
The call to getValueRow() creates a ValueRow with a new DataValueDescriptor array within it, the next line nulls out the refrence to the array. Thus this creates a short lived object for no value. Possibly work around is to have currentRow use the array directly, or create a ValueRow with no array within it.