Oracle 连接压缩?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

设置与这样的连接:

$ ssh -L1521:localhost:1521 username@oracleserver_ip

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

【讨论】:

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

【讨论】:

以上是关于Oracle 连接压缩?的主要内容,如果未能解决你的问题,请参考以下文章

win10下oracle11g数据库突然连接失败怎么办

Navicat 连接oracle数据库问题

PLSQL连接Oracle

win7-64位,vs32位,odbc 连接oracle问题总结

PLSQL Developer连接远程Oracle数据库

sqlplus连接oracle失败分析和解决