6

很久以前我发现bcp只是一个小C程序,它调用sybase客户端api的特殊位来将大量数据移动到数据库中。它以速度的名义欺骗和窃取并跳过检查约束。太好了,我完全赞成。在 sybase 12 中,我注意到 api 暴露在 C 客户端库中,但不是 java 的。

我一直在寻找,但我没有发现任何说他们已经在 sybase 15 java 客户端库中实现了它。有谁知道这在sybase 15中是否可用?

4

4 回答 4

3

我不同意您对使用 BCP api 的 Java 的评论。虽然我同意 Java 和 ODBC/JDBC 的局限性,但这并不意味着使用 Java BCP api 没有优势。我们有一个包含大量 Java 的系统,从 Java 中脱壳并运行 BCP 命令行实用程序并不实用或非常有效。

运行命令行实用程序不会提供很好的错误报告和死锁重试。它还需要将数据写入文件,这将增加操作次数并减慢整个过程。有时我们甚至无法在没有文件系统且 tmp 太小的网格上写入文件。

至于速度,嗯,JBCP 比原生 api 慢,但它是可以接受的,而且肯定比调用重复插入命令快。

Mwillett(JBCP 的作者)

于 2011-03-24T12:06:11.110 回答
1

我不这么认为,将该操作纳入 JDBC 规范可能是一个更大的问题。

我确实在 SourceForge 上看到了一个 JBCP 项目,但没有任何经验。

于 2010-10-05T18:16:41.603 回答
1

答案是不。

但是您到底为什么要将大量数据从 Java 移动到服务器?(1) Java 不是为此而设计的,所以它会很慢 (2) 本机 bcp 或 C+bcp 或 perl+bcp 或任何 shell 命令+bcp 都会在它周围尖叫,并无论如何都会取代它。这就像想通过 ODBC 或 JDBC 运行 bcp。

我们需要摆脱马斯洛的锤子并使用正确的工具来完成工作。


更多细节,回应评论:

  1. 连接到 ASE 服务器(客户端-服务器风格)的普通程序使用提供的 Open Client Library;这是本机的,可以有效地移动 TDS 数据包。该连接是通用的一英寸花园软管。用 C、C++、COBOL、Perl 和 PowerBuilder 编写的程序使用这种传输。

  2. ODBC(因此是 JDBC,因为它建立在 ODBC 之上)是一种使用一毫米软管连接到服务器的简单方法。虽然这对于使用 Excel 直接从 ASE 表中绘制图表这样的任务来说已经足够了,但这些任务与数据传输速度无关;对于移动任何大量数据,对于正常的应用程序访问数据服务器(除非“程序员”不知道 [1] 可用这一事实除外),它是非常不合适的。
    .
    Java 没有 [1] 并且仅限于此 [2] 传输。

  3. bcp 是供应商提供的实用程序(单独存在),可更紧密地连接到服务器。它不是“客户端 API 的特殊位”。不涉及“撒谎和欺骗”,所有约束都由执行任务的 DBA 指导。该连接是一个两英寸半的消防水带,一般不向公众提供。它旨在快速移动大量数据。如果在与服务器相同的主机上使用,由于软管没有通过网络成网状,它移动数据的速度更快。

  4. 很久以后,供应商将 bcp 功能作为库(在您的术语中为 API)提供,因此可以从任何合理架构的编译器中调用。C、C++、COBOL 和 Perl 就是这样,它们会生成程序,因此可以直接从您的代码中访问该库。连接是相同的两英寸半消防水带,但由于附加层,它以两英寸消防水带的最大速度运行。

(希望这是一个完整列表的读者请注意:还有两个其他选项我在这里没有详细说明,因为它们是服务器-服务器并且与此线程无关)。

由于 Java 程序目前仅限于与 ASE 服务器的 1 毫米连接,因此向 Java 提供 bcp API 是没有用处的(您将只有一根 2.5 英寸的网状消防水带通过网络,流量为 1毫米),这是一个荒谬的企业。这是有原因的,尽管数以百万计的许多组织都涌入了 Java,但在它相当长的发展过程中,没有一个组织花钱提供一个可以移动滴滴和滴滴的消防站。

您无法从腊肠犬那里获得灰狗的速度,对其进行赛道训练是没有用的。你可以停止在它耳边低语承诺。

其次,Java 不能有效地处理大型(源)数据集,它不是为此而设计的。因此,即使解除了 JDBC 的束缚(例如,实现了原生 Open Client Library),它仍然无法像 C、C++、COBOL、Perl、PB 那样快速移动数据;它将在一英寸的软管中以涓涓细流(四分之一英寸?)移动数据。因此,即便如此,为 Java 库提供 bcp 功能也是荒谬的。如果 Java(在设计时考虑到其他优先事项)具有大数据传输能力,那将是值得的。

它可能有助于摆脱您的Java、Java 和 Java思维模式,并为工作使用正确的工具 (PROGRAM)。如果您是 Java“程序员”,那么至少您需要熟悉您的编程语言和可用库的功能和限制。最初的问题表明对此完全无知,因此我不得不在修改后的帖子中提供它。

不局限于Java的程序员,想想大数据源在哪里;尽量减少跨网络的数据传输;想想哪些程序已经编写好并且可以使用(而不是在与地球其他地方隔离的情况下编写自己的程序);并使用它们。

最后,为了理解,即使你确实在某个库中获得了 bcp 能力,并实现了它,当你将“程序”放在现实世界中时,任何合理的 DBA 都会因为它的涓流数据传输而忽略它,并使用 bcp用它的消防水带代替。

于 2010-10-23T12:29:28.697 回答
1

如果您不介意您的 Java 程序不再可移植,您可以通过 JNI 链接到任何 C 库。这比必须重写您的应用程序或调用单独的任务来 BCP 数据更可取

我假设您不想用 C++ 重写整个应用程序;-)

于 2011-04-29T20:42:31.300 回答