You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Dennis Lundberg (JIRA)" <ji...@apache.org> on 2008/03/16 22:43:24 UTC
[jira] Updated: (DBUTILS-37) BeanListHandler#handle(ResultSet) is
not optimal
[ https://issues.apache.org/jira/browse/DBUTILS-37?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Dennis Lundberg updated DBUTILS-37:
-----------------------------------
Description:
I use the BeanListHandler for huge ResultSets (about 1000000 rows), and I searched through the code to see if I could gain little time.
It appeared to me that the following code - in BeanProcessor.class - was executed too many times:
{code}
PropertyDescriptor[] props = this.propertyDescriptors(type);
ResultSetMetaData rsmd = rs.getMetaData();
int[] columnToProperty = this.mapColumnsToProperties(rsmd, props);
{code}
for the following reason.
Since BeanListHandler extends GenericListHandler, the method #handle(ResultSet) calls #handleRow(ResultSet) for each row in the ResultSet,
which in the case of a BeanListHandler, calls RowProcessor#toBean(ResultSet, Class),
which itself calls BeanProcessor#toBean(ResultSet, Class).
A very simple way to make the BeanListHandler#handle(ResultSet) method faster is to override the GenericListHandler#handle(ResultSet) method by this code:
{code}
public Object handle(ResultSet rs) throws SQLException {
return this.convert.toBeanList(rs, type);
}
{code}
This way, the code I showed would be called only once, as it would not call BeanProcessor#toBean(ResultSet, Class) for each row but BeanProcessor#toBeanList(ResultSet, Class).
was:
I use the BeanListHandler for huge ResultSets (about 1000000 rows), and I searched through the code to see if I could gain little time.
It appeared to me that the following code - in BeanProcessor.class - was executed too many times:
PropertyDescriptor[] props = this.propertyDescriptors(type);
ResultSetMetaData rsmd = rs.getMetaData();
int[] columnToProperty = this.mapColumnsToProperties(rsmd, props);
for the following reason.
Since BeanListHandler extends GenericListHandler, the method #handle(ResultSet) calls #handleRow(ResultSet) for each row in the ResultSet,
which in the case of a BeanListHandler, calls RowProcessor#toBean(ResultSet, Class),
which itself calls BeanProcessor#toBean(ResultSet, Class).
A very simple way to make the BeanListHandler#handle(ResultSet) method faster is to override the GenericListHandler#handle(ResultSet) method by this code:
public Object handle(ResultSet rs) throws SQLException {
return this.convert.toBeanList(rs, type);
}
This way, the code I showed would be called only once, as it would not call BeanProcessor#toBean(ResultSet, Class) for each row but BeanProcessor#toBeanList(ResultSet, Class).
> BeanListHandler#handle(ResultSet) is not optimal
> ------------------------------------------------
>
> Key: DBUTILS-37
> URL: https://issues.apache.org/jira/browse/DBUTILS-37
> Project: Commons DbUtils
> Issue Type: Improvement
> Reporter: Julien Aymé
> Priority: Minor
> Attachments: OptimalBeanListHandler.java, OptimalBeanListHandler.patch
>
>
> I use the BeanListHandler for huge ResultSets (about 1000000 rows), and I searched through the code to see if I could gain little time.
> It appeared to me that the following code - in BeanProcessor.class - was executed too many times:
> {code}
> PropertyDescriptor[] props = this.propertyDescriptors(type);
> ResultSetMetaData rsmd = rs.getMetaData();
> int[] columnToProperty = this.mapColumnsToProperties(rsmd, props);
> {code}
> for the following reason.
> Since BeanListHandler extends GenericListHandler, the method #handle(ResultSet) calls #handleRow(ResultSet) for each row in the ResultSet,
> which in the case of a BeanListHandler, calls RowProcessor#toBean(ResultSet, Class),
> which itself calls BeanProcessor#toBean(ResultSet, Class).
> A very simple way to make the BeanListHandler#handle(ResultSet) method faster is to override the GenericListHandler#handle(ResultSet) method by this code:
> {code}
> public Object handle(ResultSet rs) throws SQLException {
> return this.convert.toBeanList(rs, type);
> }
> {code}
> This way, the code I showed would be called only once, as it would not call BeanProcessor#toBean(ResultSet, Class) for each row but BeanProcessor#toBeanList(ResultSet, Class).
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.