插入数据库的操作时调用的存储过程。不过可以改。现在只能传参数执行一次插一次。
数据量大概不到10万。
for循环10万次岂不是太土了,其中某此出错咋办。rollback?10万次出错的概率应该很大。那我岂不是每次都不能成功插入。
不知道问题说清楚了没。求教了。
16 个解决方案
#1
怎么会一下突然插入那么多,数据是怎么获取的? 文件里的么?
#2
数据是别的数据库同步过来。放在内存或者文件里面的
#3
EXCEL么?如果是EXCEL、TXT文件的话,可以直接导入到数据库中的,建议导入到一张新表里,然后和目标表做对比,插入楼主需要的记录。
#4
怎么导?bcp吗?
我需求没说清楚。这样的表有6张。字段都不一样。搞新表的话。内存岂不是浪费很多。
6张目标表都是有数据的。
我需求没说清楚。这样的表有6张。字段都不一样。搞新表的话。内存岂不是浪费很多。
6张目标表都是有数据的。
#5
导入比较快,内存不会浪费!
#6
可以喔以前的数据时绝对要保留的呀。这好像不行的吧
#7
10万次出错的概率?
你只管向数据库发出语句
你只管向数据库发出语句
#8
我明白你的意思。可是循环10万次。我怕在其中某此出错。那我就要rollback了
#9
6张表,直接将数据一次性导入目标表不就行了?反正只是单纯的导入,又不需要进行任何规则的判断。
或者存储过程里直接使用insert into oldtable select * from new newtable不行吗?
就算你有条件约束,那就直接在后面跟where子句好了。
一条一条导入,导到何年何月去了。。。
或者存储过程里直接使用insert into oldtable select * from new newtable不行吗?
就算你有条件约束,那就直接在后面跟where子句好了。
一条一条导入,导到何年何月去了。。。
#10
关键是两个不同的数据库。要是能这样的话就好了。
有没有批量插入的办法,后者是一次插入多条比如:500
有没有批量插入的办法,后者是一次插入多条比如:500
#11
这个不做导入,估计你只能在程序里处理了。
<!- Hibernate 批量插入 -->
public void batchAddSendCus(final List<ShpSendVouchDto> shpSendVouchs) throws Exception {
super.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session){
int rows = 0;
for(ShpSendVouchDto dto: shpSendVouchs)
{
session.save(dto);
rows++;
if ( rows % 10000 == 0 ) {
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
}
return new Integer(rows);
}
});
}
ShpSendVouchDto为要插入的对向
List<ShpSendVouchDto> shpSendVouchs插入的对向的集合
<!-JDBC批量插入-->
public void batchAddSendCus(final List<ShpSendVouchDto> shpSendVouchs) throws Exception {
if (shpSendVouchs != null) {
(数据库针对MySql)
String sql = " insert into SHPSENDVOUCH(vouchid,vouchmodelid,Cusid,shopid) values(?,?,?,?) ";
(数据库针对Oracle,SEQ_SHP_SENDVOUCH.NEXTVAL为ORACLE中的序列)
// String sql = " insert into shpsendvouch(id,vouchid,vouchmodelid,Cusid,shopid)values(SEQ_SHP_SENDVOUCH.NEXTVAL,?,?,?,?) ";
this.getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
String vouchid = shpSendVouchs.get(i).getVouchid();
Long vouchmodelid = shpSendVouchs.get(i).getVouchmodelid();
Long cusid = shpSendVouchs.get(i).getCusid();
Long shopid = shpSendVouchs.get(i).getShopid();
Long difstatus = shpSendVouchs.get(i).getDifstatus();
String vouchpassword = shpSendVouchs.get(i).getVouchpassword();
Date gettime = shpSendVouchs.get(i).getGettime();
Long status = shpSendVouchs.get(i).getStatus();
ps.setString(1, vouchid);
ps.setLong(2, vouchmodelid);
ps.setLong(3, cusid);
ps.setLong(4, shopid);
}
public int getBatchSize() {
return shpSendVouchs.size();
}
});
}
}
ShpSendVouchDto为要插入的对向
List<ShpSendVouchDto> shpSendVouchs插入的对向的集合
#12
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#13
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#14
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#15
好吧,结贴吧。在程序里面批量插入算喽!
#16
还有感谢12 13 14友情帮顶!!
#1
怎么会一下突然插入那么多,数据是怎么获取的? 文件里的么?
#2
数据是别的数据库同步过来。放在内存或者文件里面的
#3
EXCEL么?如果是EXCEL、TXT文件的话,可以直接导入到数据库中的,建议导入到一张新表里,然后和目标表做对比,插入楼主需要的记录。
#4
怎么导?bcp吗?
我需求没说清楚。这样的表有6张。字段都不一样。搞新表的话。内存岂不是浪费很多。
6张目标表都是有数据的。
我需求没说清楚。这样的表有6张。字段都不一样。搞新表的话。内存岂不是浪费很多。
6张目标表都是有数据的。
#5
导入比较快,内存不会浪费!
#6
可以喔以前的数据时绝对要保留的呀。这好像不行的吧
#7
10万次出错的概率?
你只管向数据库发出语句
你只管向数据库发出语句
#8
我明白你的意思。可是循环10万次。我怕在其中某此出错。那我就要rollback了
#9
6张表,直接将数据一次性导入目标表不就行了?反正只是单纯的导入,又不需要进行任何规则的判断。
或者存储过程里直接使用insert into oldtable select * from new newtable不行吗?
就算你有条件约束,那就直接在后面跟where子句好了。
一条一条导入,导到何年何月去了。。。
或者存储过程里直接使用insert into oldtable select * from new newtable不行吗?
就算你有条件约束,那就直接在后面跟where子句好了。
一条一条导入,导到何年何月去了。。。
#10
关键是两个不同的数据库。要是能这样的话就好了。
有没有批量插入的办法,后者是一次插入多条比如:500
有没有批量插入的办法,后者是一次插入多条比如:500
#11
这个不做导入,估计你只能在程序里处理了。
<!- Hibernate 批量插入 -->
public void batchAddSendCus(final List<ShpSendVouchDto> shpSendVouchs) throws Exception {
super.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session){
int rows = 0;
for(ShpSendVouchDto dto: shpSendVouchs)
{
session.save(dto);
rows++;
if ( rows % 10000 == 0 ) {
//flush a batch of inserts and release memory:
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
}
return new Integer(rows);
}
});
}
ShpSendVouchDto为要插入的对向
List<ShpSendVouchDto> shpSendVouchs插入的对向的集合
<!-JDBC批量插入-->
public void batchAddSendCus(final List<ShpSendVouchDto> shpSendVouchs) throws Exception {
if (shpSendVouchs != null) {
(数据库针对MySql)
String sql = " insert into SHPSENDVOUCH(vouchid,vouchmodelid,Cusid,shopid) values(?,?,?,?) ";
(数据库针对Oracle,SEQ_SHP_SENDVOUCH.NEXTVAL为ORACLE中的序列)
// String sql = " insert into shpsendvouch(id,vouchid,vouchmodelid,Cusid,shopid)values(SEQ_SHP_SENDVOUCH.NEXTVAL,?,?,?,?) ";
this.getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
public void setValues(PreparedStatement ps, int i) throws SQLException {
String vouchid = shpSendVouchs.get(i).getVouchid();
Long vouchmodelid = shpSendVouchs.get(i).getVouchmodelid();
Long cusid = shpSendVouchs.get(i).getCusid();
Long shopid = shpSendVouchs.get(i).getShopid();
Long difstatus = shpSendVouchs.get(i).getDifstatus();
String vouchpassword = shpSendVouchs.get(i).getVouchpassword();
Date gettime = shpSendVouchs.get(i).getGettime();
Long status = shpSendVouchs.get(i).getStatus();
ps.setString(1, vouchid);
ps.setLong(2, vouchmodelid);
ps.setLong(3, cusid);
ps.setLong(4, shopid);
}
public int getBatchSize() {
return shpSendVouchs.size();
}
});
}
}
ShpSendVouchDto为要插入的对向
List<ShpSendVouchDto> shpSendVouchs插入的对向的集合
#12
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#13
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#14
看看,喔喔。。。真的看不懂,学习中,帮楼主顶
#15
好吧,结贴吧。在程序里面批量插入算喽!
#16
还有感谢12 13 14友情帮顶!!