【问题标题】:Oracle connection compression?Oracle 连接压缩?
【发布时间】:2009-12-23 17:44:16
【问题描述】:

我有一个使用 JDBC 连接到 Oracle 11g 的应用程序。不幸的是,运行我的应用程序的机器和 Oracle 机器是通过带宽有点低的连接连接的。我没有嗅探连接,但我很确定通过连接的数据流没有被压缩。对于我的应用程序,我更关心带宽而不是延迟。

有没有办法告诉 JDBC 驱动程序和 Oracle 压缩通过连接的数据?谷歌提供了很多关于数据文件压缩的​​答案,但我找不到任何关于网络协议压缩的信息。

我正在使用 Oracle 的瘦驱动程序,但如果仅受 OCI 驱动程序支持,我可以切换到该驱动程序。感谢您的任何建议!

【问题讨论】:

    标签: java oracle jdbc compression


    【解决方案1】:

    我不知道有关 Oracle 瘦驱动程序和 OCI 驱动程序的详细信息。但是你可以使用SSH隧道来实现compression

    1. 因此,在您的 Oracle 机器中,您设置了一个 SSH 守护程序。如果您的 Oracle 服务器在 RedHat Linux 下运行,那么您就完成了
    2. 在您的客户端计算机(托管您通过 JDBC 连接的应用程序的计算机)上设置 SSH 连接,启用压缩隧道。您可以使用命令行 SSH 或 Putty(如果您在 Windows 下)来执行此操作。

    设置与这样的连接:

    $ ssh -L1521:localhost:1521 username@oracleserver_ip
    

    然后,在您的应用程序中,使用 localhost:1521 作为 Oracle 的地址。

    【讨论】:

    • 不,VPN 连接肯定不会工作。带宽有限 - 增加 VPN 开销将确保每个数据包存储 更少 的实际数据。
    • 虽然有可能,但我希望看看 Oracle 驱动程序是否内置了这个功能,以保持简单。
    • 这不是 VPN。这只是一个隧道。它起作用。如果您使用压缩隧道并且您尝试传输的内容可​​以被压缩(如大量文本或 XML),它将被压缩。
    • @joev 我知道在驱动程序中使用标志或在 URL 中使用参数会更容易,但这就是我所知道的。 :-) 也许 URL 连接参数文档上有一些东西......
    • SSH 是一个加密隧道 (en.wikipedia.org/wiki/Tunneling_protocol),使其成为事实上的 VPN。也就是说,如果压缩比足以克服 VPN/隧道开销,它可以很好地工作。
    【解决方案2】:

    为了直接回答这个问题,驱动程序(瘦或 OCI)没有这种压缩机制。而且由于发送的数据可能是一些时髦的二进制格式,我不确定它是否能通过 SSL 很好地压缩。需要采用其他一些提高网络性能的机制。

    【讨论】:

    • 通过 JDBC 使用 SSH 隧道压缩可以减少延迟
    【解决方案3】:

    根据我的经验,高延迟对使用 Oracle JDBC 驱动程序的性能的损害远远超过低带宽。 (至少在我处理的应用程序中)。您说您不担心延迟,但您能否估计一下您的低带宽环境的延迟?

    您发送的数据有多大?有 BLOB 列吗?是否涉及其他技术,例如连接池或 Hibernate?有很多潜在因素,而不仅仅是您的数据是否被压缩。

    您是否进行过任何 WAN 仿真来尝试找出最会降低您的性能的因素? WANem 很容易设置。

    我在这个问题上花费了数周时间,100-200 毫秒的延迟对我们的伤害远大于 1Mbit 的带宽限制。希望你是在另一条船上 - 压缩是一个更容易解决的问题。

    【讨论】:

    • 64 字节 ping 只需要 4ms 就可以被确认,所以这还不错。没有 BLOB,但有很多 INSERT 活动。没有连接池,它是单个连接。假期的人员配备有点少,所以我暂时无法深入 WAN 诊断。这似乎是下一个显而易见的事情。但是感谢指向 WANem 的指针,我会调查的!
    • 如果只有 4 毫秒,我会说你是对的,延迟应该起到非常小的作用。
    【解决方案4】:

    只是一个更新。

    12.2 中的 Oracle JDBC 连接现在具有此帖子中声明的压缩功能:http://www.oracle.com/technetwork/topics/jdbc-faq-090281.html#0000_00

    【讨论】:

      【解决方案5】:

      请参阅Oracle JDBC Developer's guide 以启用网络压缩。请注意,这是 Oracle12c Release 2 的一个特性。

      【讨论】:

        【解决方案6】:

        由于问题和答案已过期或链接断开,添加方法以启用连接压缩。

        数据库服务器端:

        请咨询您的 DBA 以配置文件:$DB_HOME\NETWORK\ADMIN\sqlnet.ora

        添加以下行:

        SQLNET.COMPRESSION=on
        SQLNET.COMPRESSION_THRESHOLD=1024
        SQLNET.COMPRESSION_LEVELS=(high)
        

        服务器上SQLNET.COMPRESSION_LEVELS的默认值为(low)。如果使用OCI驱动可以正常工作,但是如果使用一般推荐的thin驱动,则需要专门配置为(high)

        客户端 Java 代码:

        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
        OracleDataSource ds = new OracleDataSource();
        
        Properties prop = new Properties();
        prop.setProperty("user", "myuser");
        prop.setProperty("password", "mypassword");
        prop.setProperty("oracle.net.networkCompression", "on"); 
        prop.setProperty("oracle.net.networkCompressionThreshold", "1024");
        
        ds.setConnectionProperties(prop);
        ds.setURL("jdbc:oracle:thin:@<HOSTNAME>:<PORT>/<SERVICENAME>");
        
        Connection conn = ds.getConnection();
        

        请注意,如果启用高压缩,则客户端尤其是数据库服务器上的 CPU 使用率会增加。除非网络延迟确实是个问题,否则这是您需要做出的选择。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-21
          • 1970-01-01
          • 2012-07-10
          • 2018-12-06
          • 2014-08-08
          • 1970-01-01
          相关资源
          最近更新 更多