【问题标题】:Does sybase 15 support the bcp api in java?sybase 15 是否支持 java 中的 bcp api?
【发布时间】:2010-10-04 21:02:47
【问题描述】:

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

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

【问题讨论】:

    标签: sybase bcp sybase-bcp


    【解决方案1】:

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

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

    在速度方面,嗯,JBCP 比原生 api 慢,但是可以接受,而且肯定比调用重复插入命令要快。

    Mwillett(JBCP 的作者)

    【讨论】:

    • 我不是一个非常善于表达的人,但在我的灵魂中,我知道每个程序员都知道,正如您所提到的,您只是不使用命令行程序来完成工作。你只是不这样做。谢谢你写得这么好。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为你是对的。可悲的是,规范会阻碍公司编写有用的软件。
    【解决方案3】:

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

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

    【讨论】:

    • 这是一个非常好的观点,我不知道为什么 4 年前我没有想到这一点。 :-) 但是,唉,这个问题不再是问题了,但这将是一个非常好的可行的想法。
    【解决方案4】:

    答案是否定的。

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

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


    更多细节,回复cmets:

    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 英寸的网状消防水带通过网络,一毫米的流量),这是一个荒谬的企业。这是有原因的,尽管有数以百万计的组织涌入 Java,但在其相当长的发展过程中,没有一个组织花钱提供一个可以移动滴滴和滴滴的消防站。

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

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

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

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

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

    【讨论】:

    • 我发现了这篇关于为什么不应该运行 shell 来完成任务的好文章。
    • 您正在寻找支持您的固定立场的证据。实现所报告系统的白痴不了解如何在 Unix 系统上设置安全性。 MySQL RUby 等,所有免费软件都对黑客开放,企业数据库则不然。但我们不要分心,地球上有数百万(也许数十亿)的 shell 和 perl 脚本成功运行(最安全,但一些米老鼠商店是不安全的)。
    • Java 可能非常慢,尤其是当程序员坚持使用大量对象结构时,这些结构都构建在堆上,每个对象有 12 字节的开销,并且指针到处乱飞。然而,对于低级循环,Java 并不比 C++ 慢多少(一个有趣的例外是一些糟糕的浮点函数)。 Sybase的原生java驱动肯定早就有了,不用经过ODBC。
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2013-03-28
    • 2023-03-11
    相关资源
    最近更新 更多