Derby SQL脚本大容量导入



我的目标是将数据导入derby数据库。数据是以SQL转储的形式从MySQL实例中提取的,我处理了一个脚本,该脚本只使用插入语句,并且MySQL特定语法的转义被正确地转换为Derby。为了测试,我使用derby maven插件:

导出MAVEN_OPTS=-Xmx2048m;mvn德比:运行

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

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日志),大容量导入过程在一个非常大的数据集(>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

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

我刚刚使用了许多Import语句,它起了作用。

看起来,对于INSERT语句的每个数据括号,Derby都会在堆栈上生成一个方法调用,由于有许多递归方法调用,因此会将许多括号转移到堆栈。

然而,您只需要从转换INSERT语句

插入INTO值(1,2,3)。。。,(4,5,6);

对多个语句:

插入INTO值(1,2,3);。。。插入数值(4,5,6);

最新更新