批量插入数据库

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 11:16   25   0

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大小,计算批次数——>循环更新一批数据

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP