我的目标是将数据导入到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语句吗? 我没有时间看德比来源,所以请帮助我!
答案 0 :(得分:0)
我刚使用了很多Import语句,但它确实有效。
似乎对于INSERT语句的每个数据括号,Derby在堆栈上生成一个方法调用,由于许多递归方法调用而导致许多括号到堆栈溢出。
但是您只需要从
转换INSERT语句插入INTO VALUES(1,2,3),...,(4,5,6);
对多个陈述:
插入INTO VALUES(1,2,3); ... 插入INTO VALUES(4,5,6);