公司正在做的一个项目中使用了 BeanProcessor 来将 ResultSet 转换为 Bean , 数据库中有个表有 300 多个字段(这里暂且不论数据库设计上的问题), 这时发现将结果集实例化的过程比较耗时, 分析了一下 BeanProcessor 的源码,发现问题出在 mapColumnsToProperties 这个方法:
public Object toBean(ResultSet rs, Class type) throws SQLException {
...
int[] columnToProperty = mapColumnsToProperties(rsmd, props);
...
}
public List toBeanList(ResultSet rs, Class type) throws SQLException {
...
int[] columnToProperty = mapColumnsToProperties(rsmd, props);
...
}
private Object createBean(ResultSet rs, Class type,
PropertyDescriptor[] props, int[] columnToProperty) throws SQLException {
...
for (int i = 1; i < columnToProperty.length; ++i) {
...
}
...
}
protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
PropertyDescriptor[] props) throws SQLException {
int cols = rsmd.getColumnCount();
int[] columnToProperty = new int[cols + 1];
Arrays.fill(columnToProperty, -1);
for (int col = 1; col <= cols; ++col) {
String columnName = getPropertyName(rsmd.getColumnName(col));
for (int i = 0; i < props.length; ++i) {
if (columnName.equalsIgnoreCase(props[i].getName())) {
columnToProperty[col] = i;
break;
}
}
}
return columnToProperty;
}
这样在全字段查询时,外层循环有300多次,内存循环又有300多次,耗时的部分就在这个嵌套循环里面(当然,一般情况下字段数不多时,这里的差别可以忽略不计)。
于是着手改了一下:
...
private Map properties = new HashMap();
public Object toBean(ResultSet rs, Class type) throws SQLException {
PropertyDescriptor[] props = propertyDescriptors(type);
for (int i = 0; i < props.length; i++) {//将实体类所有属性放到Map中
properties.put(props[i].getName(), props[i]);
}
return createBean(rs, type);
}
public List toBeanList(ResultSet rs, Class type) throws SQLException {
List results = new ArrayList();
if (!(rs.next())) {
return results;
}
PropertyDescriptor[] props = propertyDescriptors(type);
for (int i = 0; i < props.length; i++) {//将实体类所有属性放到Map中
properties.put(props[i].getName(), props[i]);
}
do {
results.add(createBean(rs, type));
} while (rs.next());
return results;
}
private Object createBean(ResultSet rs, Class type) throws SQLException {
Object bean = newInstance(type);
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
for (int col = 1; col <= cols; col++) {
String columnName = getPropertyName(rsmd.getColumnName(col));
if (properties.containsKey(columnName)) {//实体类存在该属性
PropertyDescriptor prop = (PropertyDescriptor) properties.get(columnName);
Class propType = prop.getPropertyType();
Object value = processColumn(rs, col, propType);
if ((propType != null) && (value == null) && (propType.isPrimitive())) {
value = primitiveDefaults.get(propType);
}
callSetter(bean, prop, value);
}
}
return bean;
}
...
...
姑且算字段数为 300 , 用 toBean 方法转换一个实体
这样改动后的效果就是将原来的约 300 * 300 + 300 次的循环(忽略内层循环里的 break) 变为 300 + 300 次循环。
BTW:如果发现问题,欢迎指正。
分享到:
相关推荐
DBUtils 是一个非常重要的 Python 模块,专为数据库连接设计,它在 Python 的数据库应用开发中扮演着不可或缺的角色。这个模块主要目的是提供一个稳定、健壮的接口,用于管理和操作数据库连接,使得开发者能够更方便...
Python的DBUtils是一个非常实用的库,主要用于增强Python标准库中的`DB-API 2.0`接口,提供了线程安全性和连接池管理等功能。DBUtils是基于PEP 249设计的,它使得数据库连接的管理和维护变得更加简单,尤其在多线程...
4. 错误处理:DBUtils对数据库操作进行了异常处理封装,当出现如SQLException等异常时,会自动捕获并抛出更友好的DbUtilsException,简化了异常处理流程。 5. 高效的批处理:DBUtils还支持批处理操作,通过`...
6. **性能优化**:由于DBUtils对JDBC API进行了封装,它能够有效地管理和重用数据库连接,从而提高了性能和资源利用率。同时,对于批量操作,DBUtils也提供了批量执行的接口。 7. **代码简洁性**:使用DBUtils,...
BeanProcessor BeanProcessor匹配列明到Bean属性名,并转换结果集列到Bean对象的属性中. DbUtils 一个JDBC辅助工具集合. ProxyFactory 产生JDBC接口的代理实现. QueryLoader 属性文件加载器,主要用于加载属性文件中...
- `commons-dbutils-1.3.jar`: 较旧的版本,可能不包含一些后来引入的优化和修复。 - `commons-dbutils-1.6.jar`: 相对于1.3版,可能会有性能改进、bug修复和新功能的添加。 - `commons-dbutils-1.7.jar`: 最新...
Dbutils 是 Apache Commons DbUtils 的简称,它是一个用于简化 Java 数据库编程的开源库。Dbutils 基于 JDBC(Java Database Connectivity),提供了一套简洁、高效且易于使用的API,帮助开发者更方便地处理数据库...
4. **异常处理**: DBUtils对常见的数据库操作异常进行了封装,如SQLException,提供了更友好的异常处理方式。在这个模仿实现中,你可以看到如何捕获和处理这些异常,以及如何优雅地结束数据库操作。 5. **事务管理*...
Apache Commons DbUtils是Java开发中的一个实用工具库,专门针对JDBC(Java Database Connectivity)进行优化,以提供更简洁、高效的数据库操作API。这个库在Java社区中广泛使用,因为它大大减轻了开发者处理数据库...
在Java开发中,数据库连接管理是一项关键任务,它涉及到资源的有效利用和系统的稳定运行。C3P0和DBUtils是两个...在实际项目中,根据具体需求调整C3P0的配置参数和DBUtils的操作方式,可以进一步优化数据库访问性能。
这篇博文可能是作者分享了自己在原有DbUtils基础上进行的功能增强或优化的经验。通常,扩展可能包括但不限于增加新的查询处理方法,支持更复杂的事务管理,改进异常处理,或者添加对新数据库特性的支持。通过阅读...
Python DBUtils 是一个非常实用的库,专门设计用于管理和优化Python程序与数据库之间的连接。它遵循Python的DB-API 2规范,确保与多种数据库适配器兼容,如psycopg2(PostgreSQL)、pyodbc(ODBC)、sqlite3等。...
5. **性能优化**:HSQldb 2.0.0 版本对性能进行了优化,包括索引的改进和内存管理的提升。 6. **备份和恢复**:提供了备份和恢复数据库的工具和命令,便于数据管理和灾难恢复。 在分析 DButils 和 HSQldb 的源代码...
在IT行业中,数据库操作是日常开发中的重要环节,而`dbutils`是一个非常实用的Java数据库操作工具包,它简化了对数据库进行增删改查(CRUD)操作的过程。本示例着重介绍如何结合`dbutils`与Oracle数据库进行高效的...
DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 Webware for Python 一部分用来结合 PyGreSQL 访问 PostgreSQL 数据库,当然他也可以用在其他Python应用程序中来访问 DB-...
DButils内部对JDBC进行了优化,例如自动关闭资源,减少了内存消耗和资源泄露的风险。同时,由于其对连接池的支持,可以进一步提升数据库操作的性能。 7. **事务管理** 虽然DButils本身不提供完整的事务管理功能,...
**dbutils** `dbutils` 是一个开源的...尽管现代的ORM框架如Hibernate和MyBatis提供了更强大的功能,但`dbutils` 仍然是进行基础数据库操作的一个优秀选择,特别是在对性能有较高要求,且不需要复杂对象映射的场景下。
5. **ExceptionTranslator**:DBUtils包含了对JDBC异常的翻译,将数据库特有的异常转换为更通用的DbUtilsException,这样可以简化异常处理逻辑。 6. **PreparedStatement的使用**:DBUtils鼓励使用...
6. **性能优化**:由于DBUtils对JDBC进行了封装,避免了重复创建和关闭连接,减少了内存消耗,从而提升了程序的运行效率。 7. **安全性**:DBUtils使用PreparedStatement来防止SQL注入攻击,这是处理用户输入数据时...