Derby SQL Script批量导入

时间:2013-12-15 10:58:52

标签: java database maven derby bulk

我的目标是将数据导入到derby数据库中。数据是以SQL转储的形式从MySQL实例中提取的,我使用了一个脚本,我只使用insert-statements,并且MySQL特定语法的转义正确转换为Derby。 要测试,我使用derby-maven-plugin:

导出MAVEN_OPTS = -Xmx2048m; mvn derby:运行

在第一步中,我在derby实例中创建了模式(使用MySQL的DDLUtils,这很好)。 其次,我尝试导入数据。我在命令行上使用ij和以下(shortend)脚本:

CONNECT 'jdbc:derby://localhost:1527/foodmart';
SET SCHEMA APP;
autocommit off;
INSERT INTO "ACCOUNT" VALUES (1000,NULL,'Assets','Asset','~',NULL),                            (2000,NULL,'Liabilities','Liability','~',NULL),(3000,5000,'Net Sales','Income','+',NULL),(3100,3000,'Gross Sales','Income','+','LookUpCube(\"[Sales]\",\"(Measures.[Store Sales],\"+time.currentmember.UniqueName+\",\"+ Store.currentmember.UniqueName+\")\")'),(3200,3000,'Cost of Goods Sold','Income','-',NULL),(4000,5000,'Total Expense','Expense','-',NULL),(4100,4000,'General & Administration','Expense','+',NULL),(4200,4000,'Information Systems','Expense','+',NULL),(4300,4000,'Marketing','Expense','+',NULL),(4400,4000,'Lease','Expense','+',NULL),(5000,NULL,'Net Income','Income','+',NULL);
...
commit;

如您所见,对于表的每一行,都有一个包含样本数据的括号。 当然还有几个其他表的插入语句。正确完成一些插入后,由于以下异常(来自derby-logs),批量导入过程会在一个非常大的数据集(> 1000行)中窒息:

java.lang.StackOverflowError
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.TableOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.SetOperatorNode.bindExpressions(Unknown Source)
at org.apache.derby.impl.sql.compile.UnionNode.bindExpressions(Unknown Source)
... and many lines more repeatingly because of the recursive nature...
Cleanup action completed 

ij在命令行上打印:

FEHLER XJ001: DERBY SQL error: SQLCODE: -1, SQLSTATE: XJ001, SQLERRMC:  java.lang.StackOverflowError^T^TXJ001.U

这是否意味着德比不支持使用SQL-bulk-import场景? 我应该改为切换到基于csv的导入吗? 我假设从stacktrace方法调用,derby无法创建查询计划。 是否有可能,对于insert语句的每个'数据括号',它将创建一个UNION语句,为每个INSERT查询添加大量开销。 那么我应该尝试在许多简洁的陈述中分割我的长INSERT语句吗? 我没有时间看德比来源,所以请帮助我!

1 个答案:

答案 0 :(得分:0)

我刚使用了很多Import语句,但它确实有效。

似乎对于INSERT语句的每个数据括号,Derby在堆栈上生成一个方法调用,由于许多递归方法调用而导致许多括号到堆栈溢出。

但是您只需要从

转换INSERT语句

插入INTO VALUES(1,2,3),...,(4,5,6);

对多个陈述:

插入INTO VALUES(1,2,3); ... 插入INTO VALUES(4,5,6);