一个list,包含好几万条数据,插入到数据库表,该如何处理?

时间:2021-04-30 23:33:42
要把list中的数据,插入到数据库表中,
list包含有几万条数据,如果一次处理的话,页面提交就没响应了,基本就死了
请问,有什么处理方法呢?
数据库是mysql


而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?

50 个解决方案

#1


能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

#2


而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?

这个可以发送 sql语句,就交给数据库去处理吧

#3


我想问的是,如何处理可以成功导入数据,不要出现后台程序负载不了的情况

#4


后台肯定得忙死,我也碰到过这情况,到现在也不知道咋办.

#5


分批导入,一次导入1000条
addBatch

#7


引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

#8


up下

#9


该回复于2010-07-14 11:29:28被版主删除

#10


引用 7 楼 thegodofwar 的回复:
引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我的思路
1是把list中的数据写入文件 然后通过后台线程去执行LOAD DATA LOCAL INFILE "D:\SQL.txt" INTO TABLE tb; 效率和效果应该还不错
2数据库读写分离策略 具体可以去网上搜索

#11


后台做控制,当数据达到一定条数时commit一次。

#12


bs的缺点了

10楼的意见很不错

这种情况还不如直接上传文件,然后处理

#13


写一个批处理,让数据在夜间处理,这样用户就察觉不到了

#14


批量提交

#15


1)插入几万条也会死,这个只能说是你的代码没优化。曾经处理过EXCEL数据上传,每个报表15k行以上,近20列。一次性上传40多个。算算也有60多万条,100多MB。包括网传(intranet,时间忽略不计)、POI解析EXCEL、存入数据库,所有流程加起来不超过5分钟。服务器一般,2G内存,intel 2核cpu。也是mysql
持久层:hibernate

核心代码:用好jdbc的batch操作。
for(...){
   session.saveOrUpdate(obj);
   if(i%20 == 0){
      session.flush();  //同步到数据库
      session.clear();  //及时清空缓存
   }
   i++;
}
tx.commit();

这样搞不信你还会挂机

2) A数据导入B数据
mysql的sql:
select * from a into b

要求:a和b的字段一一对应。

你也可以这样:
create table b as select * from a
要求:B不存在。这样创建了A的一个副本表,字段、数据全部相同,但是会丢失A的所有键,包括主键,外键,index

#16


处理的过程无论如何都是很耗费时间的,加个友好的用户提示吧,就像楼上说的,用点ajax的技巧

#17


解决方法很多,用ajax提示,或者后台处理,批量插入达到一定数量就要commit

#18


关注中。。。

#19


晕死 我也想学习呢  楼上的给点实质性的建议好不 


还是感觉15楼说的有点道理


什么夜间执行 亏你想的出来

#20


几万条数据对数据而言不是问题,但是数据会越来越多,而且放到list里面不是一个很好的想法,会很占内存的,数据到达一定数量服务器死掉太正常了!用sql语句让数据库执行吧,应该快一些!
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。

#21


up大家再说说

#22


不是特别清楚你的问题……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是1万7千多,是一个企业内部一个省的所有用户数据,我用的是db2数据库,且是从excel导入到数据库的操作。
你现在的问题可能是一个几万级的list,已经在页面上了,你是想把这个list的所有数据插入数据库?
这个肯定要考虑的一是执行特定数量(50-100)的插入,执行con.commit()操作,其二就是页面的操作,需要给出数据操作中的友好提示信息给用户,防止用户重复提交等操作。
mysql的效率,几万行数据不是问题吧,当然也得看你要插入的数据复杂度等问题。
这个还是有待考虑的,总感觉对你的问题不是太清楚,所以就不多说了。。。。

第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……

#23


第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……

#24


使用SQL提供的批处理操作,不行吗?

#25


15楼说的感觉挺靠谱,学习ING

#26



for(int i=0;<1000000;i++){
  session.saveOrUpdate(obj);
  if(i%20 == 0){
  session.flush(); //同步到数据库
  session.clear(); //及时清空缓存
  }
  i++;
}
tx.commit();


Hibernate 得可以分批处理,一般情况,如果是Hibernate海量数据提交的话,是Hibernate的瓶颈。。

#27


触发器好好利用就好了

#28


引用 10 楼 epiphone 的回复:
引用 7 楼 thegodofwar 的回复:

引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我……


这个棒

#29


想问下楼主是在什么情况下要导入这么多数据啊

#30


batch insert 

Hibernate的话,每一百条时清空一下Session,让其强制更新到数据

JDBC的话,循环就可以了。内存够大就问题。

#31


引用 5 楼 xuhuanchao 的回复:
分批导入,一次导入1000条
addBatch


这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。

#32


JDBC里有很多优化大数据量sql的方法,比如batch insert,prepareStatemet....

要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好

#33


分批提交,不要一次性提交

#34


请问LZ的这一个list是啥样的,能放这么多条数据?

#35


引用 31 楼 lingang1359 的回复:
引用 5 楼 xuhuanchao 的回复:
分批导入,一次导入1000条
addBatch


这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。



我觉得还是这样做好些,要不的话就用sql,循环插入也用不了多久

#36


个人观点,设计思路不对,B/S系统最忌讳的就是批量插入数据,像这种一次性插入几万条数据的系统就连C/S系统都无法解决,以前做过一个项目,是让用户一条一条的往数据库中插入,每插入一条以后页面接着跳转到插入界面,不会出现一次插入大批量数据的情况。
至于必须大批量插入数据的时候专门做一个导入功能。

#37


楼主是想插入数据而页面不死;

采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。

哈哈哈哈哈哈哈!!分拿来吧

#38


引用 13 楼 etracer 的回复:
写一个批处理,让数据在夜间处理,这样用户就察觉不到了


对,之前我也这样做过

#39


谁能给我写个批处理让我可以把SqlServer的tcpip打开并重启服务啊,电脑还原,每天都要去点,麻烦。

#40


如果是 oracle数据库,可以先将list数据导出到txt,然后用 sql loader 读取 txt.用系统的任务计划后台导入数据库,这样就不会占用你应用程序的资源了。

#41


addBatch数据多的时候也是个问题
试试40楼的方法

#42


能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的

写一个批处理。

#43


引用楼主 dreamsky 的回复:
要把list中的数据,插入到数据库表中,
list包含有几万条数据,如果一次处理的话,页面提交就没响应了,基本就死了
请问,有什么处理方法呢?
数据库是mysql


而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?
你的业务逻辑肯定就有问题.怎么会在WEB程序的内存里保存着几万条数据呢?这样如果有系统错误不全丢了吗?你应该把这几万条数据保存到数据的一个临时表或中间表中,当要提交时,再移到另一个表中.

#44


非常关注此类知识

#45


引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。


用个进度条也可以

#46


慢慢等会,这个帖子就快加精了。。

#47


第一,把这么大量的数据存放在内存中 本来就是一个很不得体的操作
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。

#48


up一下

#49


jdbc 的批量提交

#50


有解决的好办法吗?

#1


能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

#2


而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?

这个可以发送 sql语句,就交给数据库去处理吧

#3


我想问的是,如何处理可以成功导入数据,不要出现后台程序负载不了的情况

#4


后台肯定得忙死,我也碰到过这情况,到现在也不知道咋办.

#5


分批导入,一次导入1000条
addBatch

#6


#7


引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

#8


up下

#9


该回复于2010-07-14 11:29:28被版主删除

#10


引用 7 楼 thegodofwar 的回复:
引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我的思路
1是把list中的数据写入文件 然后通过后台线程去执行LOAD DATA LOCAL INFILE "D:\SQL.txt" INTO TABLE tb; 效率和效果应该还不错
2数据库读写分离策略 具体可以去网上搜索

#11


后台做控制,当数据达到一定条数时commit一次。

#12


bs的缺点了

10楼的意见很不错

这种情况还不如直接上传文件,然后处理

#13


写一个批处理,让数据在夜间处理,这样用户就察觉不到了

#14


批量提交

#15


1)插入几万条也会死,这个只能说是你的代码没优化。曾经处理过EXCEL数据上传,每个报表15k行以上,近20列。一次性上传40多个。算算也有60多万条,100多MB。包括网传(intranet,时间忽略不计)、POI解析EXCEL、存入数据库,所有流程加起来不超过5分钟。服务器一般,2G内存,intel 2核cpu。也是mysql
持久层:hibernate

核心代码:用好jdbc的batch操作。
for(...){
   session.saveOrUpdate(obj);
   if(i%20 == 0){
      session.flush();  //同步到数据库
      session.clear();  //及时清空缓存
   }
   i++;
}
tx.commit();

这样搞不信你还会挂机

2) A数据导入B数据
mysql的sql:
select * from a into b

要求:a和b的字段一一对应。

你也可以这样:
create table b as select * from a
要求:B不存在。这样创建了A的一个副本表,字段、数据全部相同,但是会丢失A的所有键,包括主键,外键,index

#16


处理的过程无论如何都是很耗费时间的,加个友好的用户提示吧,就像楼上说的,用点ajax的技巧

#17


解决方法很多,用ajax提示,或者后台处理,批量插入达到一定数量就要commit

#18


关注中。。。

#19


晕死 我也想学习呢  楼上的给点实质性的建议好不 


还是感觉15楼说的有点道理


什么夜间执行 亏你想的出来

#20


几万条数据对数据而言不是问题,但是数据会越来越多,而且放到list里面不是一个很好的想法,会很占内存的,数据到达一定数量服务器死掉太正常了!用sql语句让数据库执行吧,应该快一些!
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。

#21


up大家再说说

#22


不是特别清楚你的问题……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是1万7千多,是一个企业内部一个省的所有用户数据,我用的是db2数据库,且是从excel导入到数据库的操作。
你现在的问题可能是一个几万级的list,已经在页面上了,你是想把这个list的所有数据插入数据库?
这个肯定要考虑的一是执行特定数量(50-100)的插入,执行con.commit()操作,其二就是页面的操作,需要给出数据操作中的友好提示信息给用户,防止用户重复提交等操作。
mysql的效率,几万行数据不是问题吧,当然也得看你要插入的数据复杂度等问题。
这个还是有待考虑的,总感觉对你的问题不是太清楚,所以就不多说了。。。。

第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……

#23


第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……

#24


使用SQL提供的批处理操作,不行吗?

#25


15楼说的感觉挺靠谱,学习ING

#26



for(int i=0;<1000000;i++){
  session.saveOrUpdate(obj);
  if(i%20 == 0){
  session.flush(); //同步到数据库
  session.clear(); //及时清空缓存
  }
  i++;
}
tx.commit();


Hibernate 得可以分批处理,一般情况,如果是Hibernate海量数据提交的话,是Hibernate的瓶颈。。

#27


触发器好好利用就好了

#28


引用 10 楼 epiphone 的回复:
引用 7 楼 thegodofwar 的回复:

引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。

感觉这个靠谱

感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我……


这个棒

#29


想问下楼主是在什么情况下要导入这么多数据啊

#30


batch insert 

Hibernate的话,每一百条时清空一下Session,让其强制更新到数据

JDBC的话,循环就可以了。内存够大就问题。

#31


引用 5 楼 xuhuanchao 的回复:
分批导入,一次导入1000条
addBatch


这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。

#32


JDBC里有很多优化大数据量sql的方法,比如batch insert,prepareStatemet....

要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好

#33


分批提交,不要一次性提交

#34


请问LZ的这一个list是啥样的,能放这么多条数据?

#35


引用 31 楼 lingang1359 的回复:
引用 5 楼 xuhuanchao 的回复:
分批导入,一次导入1000条
addBatch


这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。



我觉得还是这样做好些,要不的话就用sql,循环插入也用不了多久

#36


个人观点,设计思路不对,B/S系统最忌讳的就是批量插入数据,像这种一次性插入几万条数据的系统就连C/S系统都无法解决,以前做过一个项目,是让用户一条一条的往数据库中插入,每插入一条以后页面接着跳转到插入界面,不会出现一次插入大批量数据的情况。
至于必须大批量插入数据的时候专门做一个导入功能。

#37


楼主是想插入数据而页面不死;

采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。

哈哈哈哈哈哈哈!!分拿来吧

#38


引用 13 楼 etracer 的回复:
写一个批处理,让数据在夜间处理,这样用户就察觉不到了


对,之前我也这样做过

#39


谁能给我写个批处理让我可以把SqlServer的tcpip打开并重启服务啊,电脑还原,每天都要去点,麻烦。

#40


如果是 oracle数据库,可以先将list数据导出到txt,然后用 sql loader 读取 txt.用系统的任务计划后台导入数据库,这样就不会占用你应用程序的资源了。

#41


addBatch数据多的时候也是个问题
试试40楼的方法

#42


能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的

写一个批处理。

#43


引用楼主 dreamsky 的回复:
要把list中的数据,插入到数据库表中,
list包含有几万条数据,如果一次处理的话,页面提交就没响应了,基本就死了
请问,有什么处理方法呢?
数据库是mysql


而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?
你的业务逻辑肯定就有问题.怎么会在WEB程序的内存里保存着几万条数据呢?这样如果有系统错误不全丢了吗?你应该把这几万条数据保存到数据的一个临时表或中间表中,当要提交时,再移到另一个表中.

#44


非常关注此类知识

#45


引用 1 楼 closewbq 的回复:
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。


用个进度条也可以

#46


慢慢等会,这个帖子就快加精了。。

#47


第一,把这么大量的数据存放在内存中 本来就是一个很不得体的操作
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。

#48


up一下

#49


jdbc 的批量提交

#50


有解决的好办法吗?