【问题标题】:using sqlldr from java使用来自 java 的 sqlldr
【发布时间】:2011-05-19 11:13:35
【问题描述】:
我有一个用于数据库导入的 Java 实用程序。我希望能够在 oracle 上使用 sqlldr 来提高性能。我可以创建 control 和 data 文件,但这似乎不是 The Right Thing™ 要做的事情。我应该能够通过在控制文件中提供INFILE "-" 来流式传输数据(q1 - 如何?从命令行,我可以通过管道将“echo <data...>”传送到 sqlldr,但必须有一个将字符串流式传输到进程的输入流的方法?以前从未使用过Java)。我看不到如何流式传输控制文件本身(q2 - 还是我遗漏了一些明显的东西?)。我可以使用命名管道,但我不知道如何在 Windows 中从 Java 实例化和使用它们(q3 - 那会起作用吗?如何?)。
<moan>为什么oracle一定要这么复杂?这在 mysql 中是微不足道的...<moan>
【问题讨论】:
标签:
java
oracle
named-pipes
sql-loader
【解决方案1】:
“为什么 oracle 一定要这么复杂?
在 mysql 中是微不足道的”
您必须记住的是,Oracle 是一个古老的产品。 SQL Loader 作为一个实用程序必须有二十年的历史,也许更久。所以自然比一些较新的工具更难使用。
这就是为什么您应该停止尝试将 SQL Loader 安装到您新奇的 Java 应用程序中的原因 :-) 改为查看外部表。因为这些是数据库对象,我们可以对它们使用 SQL SELECT,因此使用它们自动化加载过程会更容易。我在回答另一个问题时写了更多关于外部表的内容。 Check it out.
【解决方案2】:
从根本上说,SQLLDR 是关于从一个或多个文件中获取数据到数据库表中。它在这个角色上非常强大,尤其是在处理多个文件或从单个文件并行加载时(它可以有多个线程/进程同时从同一个文件中读取)。
并非所有这些都适合从非真实文件中读取。如果您的数据流来自 Web 服务,那么我会使用 UTL_HTTP 提取它。如果它来自 FTP,那么我会以 CLOB/BLOB 的形式直接 FTP 到数据库中并从那里处理它。
根据您的版本,还要查看外部表的preprocessor 功能