1.场景
当需要批量插入数据库很多记录时,需要进行特殊处理
2.解决
2.1使用连接池
2.1.1什么是连接池
数据库连接对象的一个缓冲池,用时从池中取,用完还回池中。
使用数据库连接池可以极大提高系统性能
2.1.2实现数据库连接池
|—定义一个类实现java,sql.DataSource接口、
|—定义一个集合存储Connection对象(LinkedList)
|—实现getConnection方法返回一个Connection对象
难点:返回连接对象=集合中删除Connection
用户用完=close方法释放资源,还会连接池
|—重写close方法——装饰者模式,动态代理模式
2.1.3使用C3p0开源JDBC连接池(Hibernate+Spring)
使用方法:1. 创建ComboPooledDataSource对象,然后直接设置参数
2. 创建ComboPooledDataSource对象,构造函数中传入配置名(c3o0-config.xml中配置)
2.1.4ResultSetMetaData对象(ResultSet对象的元数据)
ResultSetMetaData md=rs.getMetaData()
|—获得结果集的列数,指定列的名称,指定列的类型
2.1.5JDBC工具类
public static int update(String sql, Object[] params)
public static Object query(String sql, Object[] params, ResultSetHandler rsh)
2.1.6结果集处理器(策略模式—用不同的算法实现同一个接口)
1|——创建接口,声明Handle(ResultSet)方法
2|——创建多个对象实现接口
2.2使用Batch进行批量更新
2.2.1三种Statement接口
Statement:只支持静态sql
PreparedStatement:支持动态参数,预编译,极大避免oracle解析时间
CallableStatement:针对存储过程
3 查询优化
3.1设置Statement批量值(FetchSize):JDBC默认每次检索10条记录,若访问100条记录,就会10次网络传输(TCP/IP协议,进行三次握手,四次挥手)、
但是过多的fetchSize会导致oom问题
3.2设置ResultSet批量值
3.3 合理使用ResultSet的get方法 getString()
3.4 分批获取数据 替代 一次获取大批数据
|——Server缓存数据,分批发给Client
|——Server不缓存数据,通过存储过程 迭代返回小批数据
4. 更新优化——使用Batch批量更新
定义Batch大小,计算批次数——>循环更新一批数据