2009-09-18 84 views
-1

我想通过用Java编写的Web服务向MySQL插入50 000条记录,但只有20 000条记录被插入。在MySQL中插入5万条记录

我不认为有我的sql中的大小(记录数)的限制。

是有什么,我可以插入/选择50K记录在一个单一的去(散装)

+10

请通过添加代码片段来完成您的问题。 – Umesh 2009-09-18 12:13:45

+0

一次插入一千个,它甚至可能会更高性能。 – 2009-09-18 19:59:17

回答

9

将它分成多个事务,不连续插入50K记录。我认为这是问题。

编辑:由于它是一个web服务,可能在传输过程中连接断开。请确保它不是这种情况=)。

答到OP的评论: 而不是

INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
... 49 990 INSERT later 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 

BEGIN TRANSACTION my_beloved_transaction 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
... 2k INSERT later 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
COMMIT TRANSACTION my_beloved_transaction 

BEGIN TRANSACTION my_beloved_transaction 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
... 2k INSERT later 
INSERT (......) INTO table (...) 
INSERT (......) INTO table (...) 
COMMIT TRANSACTION my_beloved_transaction 

等等

+0

将它拆分成多个事务,不要在连续插入50k记录---请xplain .. – hrishi 2009-09-18 12:20:11

+4

上帝禁止你为'sql事务'实际搜索或搜索堆栈溢出。 – 2009-09-18 13:20:52

2

我不知道你怎么做你的插入,但是您可以循环访问您想要插入的内容,并且在每个例如5000条记录中使用Web服务插入该批次,然后继续继续下一批,直到完成。因此,在这个例子中,您将对Web服务进行10次调用,每次调用5000条记录。

检查MySQL使用的交易,所以如果有什么毛病了一批可以停止这个(我还没有在MySQL中使用这些我自己,所以我不能用这部分帮助。)

0

机会是,这是批量/批量插入/更新过程的实施导致的限制。如果每一行都有更多的数据,那么您会发现它死于更少的行被插入。

尝试使用多个批处理/批量插入一次执行子集。

1

除非这是一个概念的快速和肮脏的证据,它应该无关紧要,它的网络服务。 Web服务只是外部接口。

您应该将此视为MySQL/JDBC问题。如果您需要全部或非全部插入成功,您需要一个长时间运行的事务,可能需要一个批量插入。

Web服务问题应该是分开的 - 您可能很担心客户端是否可以等待插入完成确认,使其同步或是否需要回叫。这是Web服务设计的一个问题。分别解耦和处理两者。

1

也许内存问题?尝试使用带有addBatch()命令的PreparedStatement并分批进行提交:

PreparedStatement stmt = prepareStatement(...); 
int count = 0; 
for (MyObject eachData : dataList) { 
    stmt.setObject(1, eachData.getDate()); 
    stmt.setBigDecimal(2, eachData.getValue1()); 
    stmt.setBigDecimal(3, eachData.getValue2()); 
    stmt.addBatch(); 
    if (count++ > 100) {// flush the batch periodically, so batches don't get too large 
     int[] ints = stmt.executeBatch(); 
     log.log(Level.INFO, "Inserted " + ints.length + " new records"); 
     stmt.clearBatch(); 
     count = 0; 
    } 
} 
final int[] ints = stmt.executeBatch(); 
log.log(Level.INFO, "Inserted " + ints.length + " new records"); 
0

您可以使用mysql的load infile命令。首先将所有数据写入一个文本文件,然后使用load infile命令加载到数据库中,这将花费非常少的时间和插入大型记录的最佳方式。

0

当您在事务中运行时,数据必须保留一个回滚段以防事务失败。磁盘和内存与此日志相关联,因此必须设置限制。我会检查默认值,看看你是否已经超过了一个或两个。

提交较小批次的好处是回滚段每次都会重置为零。这就是为什么将它分成更小批量的原因。