Java oracle sql loader无法从管道中读取

Java oracle sql loader无法从管道中读取,java,linux,oracle,pipe,sql-loader,Java,Linux,Oracle,Pipe,Sql Loader,我使用命名管道和Oracle SQL*Loader将大约2000万行加载到数据库中 管道的源代码来自Java应用程序,该应用程序使用simpleFileOutputStream写入管道 可以观察到,Oracle SQL*加载器需要在Java应用程序上等待很长时间才能生成足够的数据进行加载 等待很好。但是,Oracle SQL*加载器在加载大约100万行后始终存在,其输出如下: SQL*Loader-501: Unable to read file (upipe.dat) SQL*Loader-5

我使用命名管道和Oracle SQL*Loader将大约2000万行加载到数据库中

管道的源代码来自Java应用程序,该应用程序使用simpleFileOutputStream写入管道

可以观察到,Oracle SQL*加载器需要在Java应用程序上等待很长时间才能生成足够的数据进行加载

等待很好。但是,Oracle SQL*加载器在加载大约100万行后始终存在,其输出如下:

SQL*Loader-501: Unable to read file (upipe.dat)
SQL*Loader-560: error reading file
SQL*Loader-2026: the load was aborted because SQL Loader cannot continue.
在这种情况下,Java将抛出IOException,其中包含以下信息:

Exception in thread "main" java.io.IOException: Broken pipe
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:284)
它在Linux环境下运行。 你知道为什么会这样吗


谢谢。

可能sqlloader正在尝试缓冲数据,无法从命名管道获取更多数据(可能可以在开始时等待第一个数据量,但不希望在加载过程中等待)。我的猜测是sqlldr进程赶上了java进程,无法读取更多的数据,也没有看到EOF,因此它假设读取“文件”的问题是完整堆栈转储?这些通常是套接字IO错误,通常在套接字超时时发生。这是错误产生的完整堆栈,其余堆栈来自我自己的应用程序等待似乎一直在发生。因为sql加载器消耗数据的速度比java产生的要快得多。它看起来突然失败了,没有什么特别的原因。。