批量插入数据库

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

 

 

 

 

 

 

 

 

 

 

 

 

                   

                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值