JAVA循环大量插入数据库

时间:2022-06-17 21:46:27
我目前做的功能是这样的,JAVA开启一个服务,这个服务长时间运行在服务器,解析固定文件夹里的文件,解析之后插入到数据库中(sql Server或Oracel),每个文件里大约会有100-500条记录需要插入到数据库,每天大约会有10W-20W个文件的数据需要插入到数据库中,就是每天大约需要插入2000W-3000W万的数据到数据库中。目前设计是每天自动创建一个表,插入方式是JDBC的PreparedStatement批处理模式,但是每解析一个文件就需要提交一次,来保证数据完整。但是每天的表插入到1000W的数据之后感觉再插入就会很慢,请问有什么好的方式能解决吗。

31 个解决方案

#1


首先要看你的数据存入数据库后会不会经常的进行删改操作  , 如果删改操作少的话 。那就采用Hbase+solr   毕竟数据量有点大

#2


1.自己实现事务控制
2.写一个定时任务,定时提交该事务,也可以缓存一下数据,具体优化一下,类似的东西我搞过,肯定是可以的

#3


引用 1 楼 jkl012789 的回复:
首先要看你的数据存入数据库后会不会经常的进行删改操作  , 如果删改操作少的话 。那就采用Hbase+solr   毕竟数据量有点大

不会进行删改操作,不过数据库是客户指定的,只能是SQL或者Oracle

#4


引用 2 楼 BadMoree 的回复:
1.自己实现事务控制
2.写一个定时任务,定时提交该事务,也可以缓存一下数据,具体优化一下,类似的东西我搞过,肯定是可以的

缓存数据是说把当前数据先插入到一个临时表,再定时把临时表的数据导入到主数据表吗?

#5


要先查一下瓶颈在什么地方,CPU还是IO

#6


不是,可以使用google的开源库guava.jar中的缓存(CacheLoading),,还可以使用java.util.ConcurrentHashMa,需要注意线程安全问题,所以才推荐使用这两个实现。

#7


你的表是不是有索引?大量插入时,先插入再建索引

#8


大数据一般都是分而治之,分表呗

#9


分库分表  你值得拥有

#10


1、建立小时的分表
2、用es存储数据

#11


你每天可以创建两张表,插满1000w用另一张表。其次每50条左右,提交一次事务,避免占用太大的内存,影响系统运行。

#12


大量插入数据,最好先不要加索引和主键,等插入完成后如果需要再去添加

#13


该回复于2017-11-08 14:39:03被管理员删除

#14


这个逻辑,除了jdbc技术方面的优化之外,业务本身就会是瓶颈,所有的数据都放到一个表,这肯定会影响效率的,
最快速解决的方法就是在数据库,将数据库分成多表,或者多库,比如说 根据时间分成上午和下午两个表,这明显就会提升效率,当然这这是一种举例,具体的还得和业务结合,大量数据存一个表 这种方式肯定是需要改善的,

#15


该回复于2017-11-09 08:31:48被管理员删除

#16


好东西,真心感谢

#17


分表吧,数据量有点大啊

#18


送你一点好东西,  http://blog.csdn.net/educast/article/details/72880224
可惜你结贴了, 俺拿不到分了…… JAVA循环大量插入数据库

#19


顶!!!!!!!!!!!!!!!!

#20


顶一个县!!!!!!!!!!!!

#21


分表吧,数据量有点大啊

#22


你的表是不是有索引?大量插入时,先插入再建索引

#23


该回复于2017-11-14 08:28:00被管理员删除

#24


可以用一个缓存,先存一下,然后在插入吗

#25


oracle有一个外部表的机制,就是建立一个表,这个表的数据是链接一个外部路径下的结构化的文件,这样子就可以直接解析到该文件了,然后将这个外部表解析出来的
数据插入到另外一个表里就行了;考虑到数据插入效率,可以建立一个分区表,可以按照每天进行分区,插入时数据就会自动插入到对应的分区中;
这种操作模式依赖的是数据库本身的机制,就不用通过编码语言进行相关设置了...至于多了文件,是否需要建立多个外部表就需要自己去百度了

#26


该回复于2017-11-16 10:32:09被管理员删除

#27


JAVA循环大量插入数据库

#28


现在已经是一天一个表,表可以不用分了,还是看看cup/ios是够了,能不能多起个线程解析文件插入库操作,解析完成时候后移动到别目录下,目前的数据估计是一个小时需要处理100万数据。一分钟一万多,一个线程的最大是多少,而已还有看文件行的多少。还是优化后,试试多线程,

#29


不错学习学习

#30


要考虑数据分块存储,还有多进程问题

#31


bulk insert 

#1


首先要看你的数据存入数据库后会不会经常的进行删改操作  , 如果删改操作少的话 。那就采用Hbase+solr   毕竟数据量有点大

#2


1.自己实现事务控制
2.写一个定时任务,定时提交该事务,也可以缓存一下数据,具体优化一下,类似的东西我搞过,肯定是可以的

#3


引用 1 楼 jkl012789 的回复:
首先要看你的数据存入数据库后会不会经常的进行删改操作  , 如果删改操作少的话 。那就采用Hbase+solr   毕竟数据量有点大

不会进行删改操作,不过数据库是客户指定的,只能是SQL或者Oracle

#4


引用 2 楼 BadMoree 的回复:
1.自己实现事务控制
2.写一个定时任务,定时提交该事务,也可以缓存一下数据,具体优化一下,类似的东西我搞过,肯定是可以的

缓存数据是说把当前数据先插入到一个临时表,再定时把临时表的数据导入到主数据表吗?

#5


要先查一下瓶颈在什么地方,CPU还是IO

#6


不是,可以使用google的开源库guava.jar中的缓存(CacheLoading),,还可以使用java.util.ConcurrentHashMa,需要注意线程安全问题,所以才推荐使用这两个实现。

#7


你的表是不是有索引?大量插入时,先插入再建索引

#8


大数据一般都是分而治之,分表呗

#9


分库分表  你值得拥有

#10


1、建立小时的分表
2、用es存储数据

#11


你每天可以创建两张表,插满1000w用另一张表。其次每50条左右,提交一次事务,避免占用太大的内存,影响系统运行。

#12


大量插入数据,最好先不要加索引和主键,等插入完成后如果需要再去添加

#13


该回复于2017-11-08 14:39:03被管理员删除

#14


这个逻辑,除了jdbc技术方面的优化之外,业务本身就会是瓶颈,所有的数据都放到一个表,这肯定会影响效率的,
最快速解决的方法就是在数据库,将数据库分成多表,或者多库,比如说 根据时间分成上午和下午两个表,这明显就会提升效率,当然这这是一种举例,具体的还得和业务结合,大量数据存一个表 这种方式肯定是需要改善的,

#15


该回复于2017-11-09 08:31:48被管理员删除

#16


好东西,真心感谢

#17


分表吧,数据量有点大啊

#18


送你一点好东西,  http://blog.csdn.net/educast/article/details/72880224
可惜你结贴了, 俺拿不到分了…… JAVA循环大量插入数据库

#19


顶!!!!!!!!!!!!!!!!

#20


顶一个县!!!!!!!!!!!!

#21


分表吧,数据量有点大啊

#22


你的表是不是有索引?大量插入时,先插入再建索引

#23


该回复于2017-11-14 08:28:00被管理员删除

#24


可以用一个缓存,先存一下,然后在插入吗

#25


oracle有一个外部表的机制,就是建立一个表,这个表的数据是链接一个外部路径下的结构化的文件,这样子就可以直接解析到该文件了,然后将这个外部表解析出来的
数据插入到另外一个表里就行了;考虑到数据插入效率,可以建立一个分区表,可以按照每天进行分区,插入时数据就会自动插入到对应的分区中;
这种操作模式依赖的是数据库本身的机制,就不用通过编码语言进行相关设置了...至于多了文件,是否需要建立多个外部表就需要自己去百度了

#26


该回复于2017-11-16 10:32:09被管理员删除

#27


JAVA循环大量插入数据库

#28


现在已经是一天一个表,表可以不用分了,还是看看cup/ios是够了,能不能多起个线程解析文件插入库操作,解析完成时候后移动到别目录下,目前的数据估计是一个小时需要处理100万数据。一分钟一万多,一个线程的最大是多少,而已还有看文件行的多少。还是优化后,试试多线程,

#29


不错学习学习

#30


要考虑数据分块存储,还有多进程问题

#31


bulk insert