2015-04-03 94 views
0

我的java代码读取excel文件,并将数据写入(插入)到oracle数据库。在Java代码中进行频繁提交以插入数据库是否是一种很好的做法?

例如,我需要读取2000行excel文件中的一些类似的单元格,我的代码读取它,插入到数据库,并在提交后。

第一个约1000行插入非常快,而另外1000行插入很长。

缺乏记忆的可能原因。

因此,我认为在数据加载到数据库时(例如,在每读取50行后确实进行提交),经常进行提交。

这样做还是有其他方法可以解决这个问题吗?

+2

你为什么认为记忆是一个问题?现代数据库可以很容易地每秒插入数千条记录,而不会出汗。恐怕瓶颈更可能是你的代码。 Oracle具有用于从CSV文件加载数据的内置实用程序。你有没有考虑过使用SQL Loader或外部表? – APC 2015-04-03 19:23:11

+3

阅读[this](https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022)。答案是不。如果您的应用有内存泄漏,请找到并采取纠正措施。 – OldProgrammer 2015-04-03 19:23:41

+0

@APC - 谢谢,我只是不知道还有什么可能的原因,因为第一行插入了一秒钟,但稍后一分钟。我的应用程序应该完成这项工作,我使用apache poi读取excel文件和PreparedStatement将数据写入数据库。可能你是对的,并且在阅读excel时遇到问题,而不是将数据插入到数据库中。 – jah 2015-04-03 19:39:36

回答

4

提交为原子在数据库中的操作。你不只是把它们扔在身边,因为你喜欢它。每个事务通常(取决于隔离级别,但假设串行隔离)一个独特的全有或全无操作。

如果您不知道是什么导致数据库事务“很长时间”,则应该阅读日志或与知道如何诊断“减速”原因并对其进行补救的人交谈。最可能的原因是配置错误。

底线是,人们拥有插入100,000或甚至数百万行作为单个事务的事务,而不会造成问题。一般来说,最好不要经常出于性能考虑。

+0

感谢回答 – jah 2015-04-03 19:47:08

1

数据库必须始终保持一致,即如果数据一致,即使您的程序事后崩溃,也只能提交

(如果你不需要这种一致性,那么你为什么要使用DB?)

PS:你不会出去的内存快。

+0

谢谢,但对不起,我不完全明白你的意思,什么意思是“数据一致”? – jah 2015-04-03 19:56:07

+1

他意味着如果要将相关数据插入到表T1,T2和T3中,则在插入所有相关数据之前不要执行提交;换句话说,不要插入T1数据和提交,然后是T2数据和另一个提交,然后是T3数据和另一个提交。祝你好运。 – 2015-04-03 22:41:33

+1

对您的案例或更多:在崩溃的情况下可以结束一半的Excel表格写入吗?如果没有,那么你不应该犯。你的2000行几乎没有,看看数据库设置和日志,并可能增加内存。当缓冲区填满时,数据缓慢下降也可能来自数据的物理写入或传输,然后最初的大速度只是一种幻觉。 – maaartinus 2015-04-04 04:56:03

相关问题