list包含有几万条数据,如果一次处理的话,页面提交就没响应了,基本就死了
请问,有什么处理方法呢?
数据库是mysql
而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?
50 个解决方案
#1
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
#2
而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?
这个可以发送 sql语句,就交给数据库去处理吧
这个可以发送 sql语句,就交给数据库去处理吧
#3
我想问的是,如何处理可以成功导入数据,不要出现后台程序负载不了的情况
#4
后台肯定得忙死,我也碰到过这情况,到现在也不知道咋办.
#5
分批导入,一次导入1000条
addBatch
addBatch
#6
#7
感觉这个靠谱
#8
up下
唉
唉
#9
#10
感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我的思路
1是把list中的数据写入文件 然后通过后台线程去执行LOAD DATA LOCAL INFILE "D:\SQL.txt" INTO TABLE tb; 效率和效果应该还不错
2数据库读写分离策略 具体可以去网上搜索
#11
后台做控制,当数据达到一定条数时commit一次。
#12
bs的缺点了
10楼的意见很不错
这种情况还不如直接上传文件,然后处理
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
持久层: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楼说的有点道理
什么夜间执行 亏你想的出来
还是感觉15楼说的有点道理
什么夜间执行 亏你想的出来
#20
几万条数据对数据而言不是问题,但是数据会越来越多,而且放到list里面不是一个很好的想法,会很占内存的,数据到达一定数量服务器死掉太正常了!用sql语句让数据库执行吧,应该快一些!
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。
#21
up大家再说说
#22
不是特别清楚你的问题……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是1万7千多,是一个企业内部一个省的所有用户数据,我用的是db2数据库,且是从excel导入到数据库的操作。
你现在的问题可能是一个几万级的list,已经在页面上了,你是想把这个list的所有数据插入数据库?
这个肯定要考虑的一是执行特定数量(50-100)的插入,执行con.commit()操作,其二就是页面的操作,需要给出数据操作中的友好提示信息给用户,防止用户重复提交等操作。
mysql的效率,几万行数据不是问题吧,当然也得看你要插入的数据复杂度等问题。
这个还是有待考虑的,总感觉对你的问题不是太清楚,所以就不多说了。。。。
第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是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
这个棒
#29
想问下楼主是在什么情况下要导入这么多数据啊
#30
batch insert
Hibernate的话,每一百条时清空一下Session,让其强制更新到数据
JDBC的话,循环就可以了。内存够大就问题。
Hibernate的话,每一百条时清空一下Session,让其强制更新到数据
JDBC的话,循环就可以了。内存够大就问题。
#31
这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。
#32
JDBC里有很多优化大数据量sql的方法,比如batch insert,prepareStatemet....
要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好
要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好
#33
分批提交,不要一次性提交
#34
请问LZ的这一个list是啥样的,能放这么多条数据?
#35
我觉得还是这样做好些,要不的话就用sql,循环插入也用不了多久
#36
个人观点,设计思路不对,B/S系统最忌讳的就是批量插入数据,像这种一次性插入几万条数据的系统就连C/S系统都无法解决,以前做过一个项目,是让用户一条一条的往数据库中插入,每插入一条以后页面接着跳转到插入界面,不会出现一次插入大批量数据的情况。
至于必须大批量插入数据的时候专门做一个导入功能。
至于必须大批量插入数据的时候专门做一个导入功能。
#37
楼主是想插入数据而页面不死;
采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。
哈哈哈哈哈哈哈!!分拿来吧
采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。
哈哈哈哈哈哈哈!!分拿来吧
#38
对,之前我也这样做过
#39
谁能给我写个批处理让我可以把SqlServer的tcpip打开并重启服务啊,电脑还原,每天都要去点,麻烦。
#40
如果是 oracle数据库,可以先将list数据导出到txt,然后用 sql loader 读取 txt.用系统的任务计划后台导入数据库,这样就不会占用你应用程序的资源了。
#41
addBatch数据多的时候也是个问题
试试40楼的方法
试试40楼的方法
#42
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的
写一个批处理。
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的
写一个批处理。
#43
你的业务逻辑肯定就有问题.怎么会在WEB程序的内存里保存着几万条数据呢?这样如果有系统错误不全丢了吗?你应该把这几万条数据保存到数据的一个临时表或中间表中,当要提交时,再移到另一个表中.
#44
非常关注此类知识
#45
用个进度条也可以
#46
慢慢等会,这个帖子就快加精了。。
#47
第一,把这么大量的数据存放在内存中 本来就是一个很不得体的操作
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。
#48
up一下
#49
jdbc 的批量提交
#50
有解决的好办法吗?
#1
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
#2
而如果是把数据库表A的数据导到表B,也可能几万条数据,又可以怎么处理呢?
这个可以发送 sql语句,就交给数据库去处理吧
这个可以发送 sql语句,就交给数据库去处理吧
#3
我想问的是,如何处理可以成功导入数据,不要出现后台程序负载不了的情况
#4
后台肯定得忙死,我也碰到过这情况,到现在也不知道咋办.
#5
分批导入,一次导入1000条
addBatch
addBatch
#6
这里API和源码例子
一个英文的,一个翻译的:
http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
一个英文的,一个翻译的:
http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
#7
感觉这个靠谱
#8
up下
唉
唉
#9
#10
感觉这个也不靠谱 几万条数据 估计要一直显示 “数据正在提交过程中,请稍后。”
我的思路
1是把list中的数据写入文件 然后通过后台线程去执行LOAD DATA LOCAL INFILE "D:\SQL.txt" INTO TABLE tb; 效率和效果应该还不错
2数据库读写分离策略 具体可以去网上搜索
#11
后台做控制,当数据达到一定条数时commit一次。
#12
bs的缺点了
10楼的意见很不错
这种情况还不如直接上传文件,然后处理
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
持久层: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楼说的有点道理
什么夜间执行 亏你想的出来
还是感觉15楼说的有点道理
什么夜间执行 亏你想的出来
#20
几万条数据对数据而言不是问题,但是数据会越来越多,而且放到list里面不是一个很好的想法,会很占内存的,数据到达一定数量服务器死掉太正常了!用sql语句让数据库执行吧,应该快一些!
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。
如果是批量导入的话,以excel的形式上传附件的形式,在写一个批处理,在固定的时间自动执行入库操作。
#21
up大家再说说
#22
不是特别清楚你的问题……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是1万7千多,是一个企业内部一个省的所有用户数据,我用的是db2数据库,且是从excel导入到数据库的操作。
你现在的问题可能是一个几万级的list,已经在页面上了,你是想把这个list的所有数据插入数据库?
这个肯定要考虑的一是执行特定数量(50-100)的插入,执行con.commit()操作,其二就是页面的操作,需要给出数据操作中的友好提示信息给用户,防止用户重复提交等操作。
mysql的效率,几万行数据不是问题吧,当然也得看你要插入的数据复杂度等问题。
这个还是有待考虑的,总感觉对你的问题不是太清楚,所以就不多说了。。。。
第二个问题,两个表之间的数据copy?这个不难吧,可以程序实现,也可以sql实现。
期待详细的操作需求……
只是从你的描述中,发现跟我前几天做的系统用户数据初始化类似,当时我的数据是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
这个棒
#29
想问下楼主是在什么情况下要导入这么多数据啊
#30
batch insert
Hibernate的话,每一百条时清空一下Session,让其强制更新到数据
JDBC的话,循环就可以了。内存够大就问题。
Hibernate的话,每一百条时清空一下Session,让其强制更新到数据
JDBC的话,循环就可以了。内存够大就问题。
#31
这个正解……我以前做ERP遇到过80多万条数据的导入,通过批处理,然后页面给个层和一个进度条,这样用户体验也比较好。
#32
JDBC里有很多优化大数据量sql的方法,比如batch insert,prepareStatemet....
要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好
要是用了这些优化还是觉得慢,写存储过程,总之在数据库层做这种优化比较好
#33
分批提交,不要一次性提交
#34
请问LZ的这一个list是啥样的,能放这么多条数据?
#35
我觉得还是这样做好些,要不的话就用sql,循环插入也用不了多久
#36
个人观点,设计思路不对,B/S系统最忌讳的就是批量插入数据,像这种一次性插入几万条数据的系统就连C/S系统都无法解决,以前做过一个项目,是让用户一条一条的往数据库中插入,每插入一条以后页面接着跳转到插入界面,不会出现一次插入大批量数据的情况。
至于必须大批量插入数据的时候专门做一个导入功能。
至于必须大批量插入数据的时候专门做一个导入功能。
#37
楼主是想插入数据而页面不死;
采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。
哈哈哈哈哈哈哈!!分拿来吧
采用循环的方法批量提交。
先插入了一定数量的数据,就传个参数到本页面,由本页面根据这个参数再次插入剩下的数据,然后一定数量在传个参数到本页面……然后循环吧,这样就不会死了。
哈哈哈哈哈哈哈!!分拿来吧
#38
对,之前我也这样做过
#39
谁能给我写个批处理让我可以把SqlServer的tcpip打开并重启服务啊,电脑还原,每天都要去点,麻烦。
#40
如果是 oracle数据库,可以先将list数据导出到txt,然后用 sql loader 读取 txt.用系统的任务计划后台导入数据库,这样就不会占用你应用程序的资源了。
#41
addBatch数据多的时候也是个问题
试试40楼的方法
试试40楼的方法
#42
能不能给用户个有好提示?
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的
写一个批处理。
比如用ajax异步提交。
提交后,然后弹出一个层,数据正在提交过程中,请稍后。
如果处理完成后,返回一个状态码。如果成功,则隐藏层。如果失败。提示错误就行了。
这个靠谱啊!!
引用楼上的
写一个批处理。
#43
你的业务逻辑肯定就有问题.怎么会在WEB程序的内存里保存着几万条数据呢?这样如果有系统错误不全丢了吗?你应该把这几万条数据保存到数据的一个临时表或中间表中,当要提交时,再移到另一个表中.
#44
非常关注此类知识
#45
用个进度条也可以
#46
慢慢等会,这个帖子就快加精了。。
#47
第一,把这么大量的数据存放在内存中 本来就是一个很不得体的操作
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。
第二,无论什么样的算法也不会把这个速度提升到很快
一般大数量的操作放到批处理,非工作时段处理比较好
如果非要这么做,我觉得只有想2楼大虾说那样 加一个层 提示用户,处理需要大量时间 请耐心等待。。。。
#48
up一下
#49
jdbc 的批量提交
#50
有解决的好办法吗?