2016-07-28 96 views
0

这是我一直试图实现的。使用Java将AS400 .MBR文件读取到平面文件

我们正在开发一个名为GO-Anywhere的供应商工具,该工具在触发选择查询后从DB2数据库读取数据,创建一个文件将数据写入它并将其拖放到我们的ETL工具所在的机器阅读。

我几乎可以在几乎同一时间内完成GA所做的工作,实际上通过使用JSCH和jaring un-jaring,可以在6.5GB文件上以5分钟的时间击打上述工具。这使得读取和写入文件的时间从先前的32分钟减少到现在的27分钟。

但为了满足我们需要进一步拉低的时间几乎什么,我有一些是半新的SLA要求各地13多分钟

为了实现上述我已经能够阅读.MBR直接文件并在13分钟或更短时间内将其推送到Linux计算机上,但该文件的格式不是纯文本。 我想知道如何将.MBR文件转换为纯文本格式使用Java或使用AS400命令而不触发SQL。

任何帮助表示赞赏。

+0

那么,我们不知道什么是“MBR文件”或者它是如何格式化的。从粗略的谷歌搜索它出现.MBR(物理文件成员)仅仅是一个容器,所以我怀疑.MBR指定说什么关于数据如何格式化。您需要找到数据格式的技术说明,然后浏览如何将其存储在.MBR中。 –

+1

“.MBR文件”不完全是文件;它更像是一个DB2文件(或表)的分区。在不知道DB2表定义的情况下,不可能给出一个很好的答案,尤其是那些不使用SQL的答案。一个答案在技术上是可行的,但它可能需要很多编程,可能需要原生API知识。即使使用DB2表定义,在没有使用SQL的情况下执行它也可能不是特别合理。 “明文”可能是最棘手的部分。 – user2338816

+0

在这种情况下,除了在DB2上发布基本SQL之外,还有其他读取文件的方式(不是很耗时)吗? (*/AUTO)DBFCCSID(37)+ STMFCODPAG('/ QSYS.LIB/FLSSL.LIB/XYZ.FILE/XYZ.MBR')+ TOSTMF('/ OUTGOING /')+ –

回答

2

您错误地认为IBM i上的“FILE”类似于Windows/Unix/Linux上的文件。

不是。

与IBM i中的每个其他对象类型一样,它是一个具有定义良好的接口的对象。

在* FILE对象的特定情况下,它是一个数据库表。 DB2 for i不是安装在操作系统上的附加DBMS; DB2 for i只是他们给集成到操作系统中的DBMS的名称。用户程序不能像在Windows/Unix/Linux上使用文件那样直接打开存储空间。你必须通过操作系统提供的接口。

有两个接口可用,记录级别访问(RLA)SQL。两者都可以从Java应用程序中使用。 RLA由com.ibm.as400.access.AS400File类提供。 SQL访问由JDBC类提供。

SQL可能会提供最佳性能,因为您处理的是一组记录,而不是一次一个地处理RLA。

看看相关JDBC properties提供的各种性能..

从性能的角度来看,这是不可能的,你的单进程将充分利用该系统,即。 CPU使用率不会达到100%,磁盘活动也不会超过60-80%。

既然如此,那么最好的办法就是把这个过程分解成多个过程。您需要一些方法将每个进程限制为一组选定的记录。主键可能分隔。这将增加一些开销,除非记录是主键顺序。如果该表没有删除记录,则使用RRN()按物理顺序隔离可能会起作用。但需要注意的是,在较早版本的操作系统中,使用RRN()需要全表扫描。

0

猜测发生了什么事情是源表中有压缩十进制字段,这些字段没有通过读取表的本地方法解压缩。

有几种可能性。

  1. 让IBM i团队创建一个视图,该视图的所有数字列均为十进制分区。此外,省略ETL不需要的列 - 它将通过不必移动这些字节来减少I/O。通过那个执行摘录。注意:系统上可能已有这样的视图。
  2. 让IBM i团队构建适当的索引。通常,适当的索引可以缓解SQL瓶颈。
  3. 请勿ZIP和UNZIP;将原始文件发送到其他系统。即使在6GB的情况下,千兆以太网也可以轻松应对。
  4. 在ETL系统上加载ODBC驱动程序,让它直接读取源表(或适当的视图),而不是将副本发送到ETL系统。
  5. SLA时间限制从何而来?如果SLA说'亚秒响应时间',你会怎么做?在某些时候,SLA需要反映物理定律所定义的某种现实版本。我并不是说你已经达到了这个极限:我是说你需要找到它的基本原理。
  6. 请IBM i团队确保它们是最新的补丁程序(PTF)。 IBM经常通过PTF解决性能问题。
  7. 让IBM i团队确保您的作业运行的子系统具有足够的内存。
+0

感谢每一位。 –

+0

如果任何答案解决了您的问题,请“接受”它作为答案。如果不是,请考虑编辑问题以提供更多细节,以便我们可以回答。 –

+0

感谢上述巴克卡拉布罗和查尔斯。这两个答案都有帮助,db2导出,我相信可能会更快,并通过java来检索数据。下面的命令运行总是失败 db2导出到del select * from SCHMEA的test.csv。表 **** CLI错误***** SQLSTATE:42601 NATIVE错误代码:-104令牌导出无效。有效令牌:(CL结束GET SET SET CALL DROP FREE HOL D LOCK使用ALTER打开 –