什么时候应该将Java存储过程与Oracle数据库一起使用...有哪些缺点?

时间:2008-09-16 07:29:05

标签: java oracle stored-procedures plsql

PL / SQL不是我的母语。 Oracle支持用Java编写存储过程。与在PL / SQL

中编写存储过程相比,这样做有什么好处

8 个答案:

答案 0 :(得分:18)

在Oracle世界中,开发的一般顺序应该是:

尽可能纯粹使用SQL。 如果您需要的不仅仅是SQL,请使用PL / SQL。 如果您需要PL / SQL无法做到的事情,那么使用Java。 如果其他所有方法都失败了 如果你不能用C做到这一点,那就慢慢退出问题......

PL / SQL存储过程是将业务逻辑移动到任何集成技术都可访问的层的绝佳方式。包中的业务逻辑(不要单独编写函数和过程 - 它们将以无法管理的方式随着时间的推移而增长)可以由Java,C#,PL / SQL,ODBC等执行。

PL / SQL是在纯SQL之外抛出大量数据的最快方法。 “批量绑定”功能意味着它可以很好地与SQL引擎配合使用。

Java存储过程最适合创建与网络或操作系统交互的功能。例如,发送电子邮件,FTP数据,输出到文本文件并将其压缩,一般执行主机命令行。

我在使用Oracle时从未编写过任何C代码,但可能会将其用于与旧版应用程序集成。

答案 1 :(得分:11)

只有当你不能在PL / SQL中做到这一点时(或PL / SQL证明太慢,我相信这种情况很少见。)

作为一个案例研究......我们有一个在生产中运行的Java存储过程(Oracle 9i),它最初是用java编写的,因为当时我们认为java很酷,我早就改变了想法关于。无论如何。有一天,数据库崩溃,重新启动后,java SP无效。经过oracle支持后,他们并不真正知道问题是什么,他们唯一的建议涉及很多停机时间。不是一种选择的东西。 30分钟后,我在PL / SQL中重写了java SP。

现在,运行速度更快,是oracle“native”,与其他对象共享相同的部署过程,并且更容易调试。

PL / SQL是一种非常强大的语言。如果您正在编写存储过程,请花时间学习它,而不仅仅是在Java中做事,因为这就是您所知道的。

答案 2 :(得分:4)

主要优点是可以访问PL / SQL中没有的API和语言功能。例如,我已经将它们用于正则表达式处理,文件/目录操作和XML解析。

有许多缺点:

  • 工具支持不佳
  • 缺乏对JVM的控制
  • DBA通常不接受Java培训。为了支持您的生产代码,您要么需要为DBA提供更多培训,要么雇用受过Java培训的支持人员

将Java移动到应用程序服务器通常是一种更好的方法,因为这可以抵消这些缺点。有出色的工具支持,对JVM的高度控制,并且在流行的应用程序服务器中训练有很多人,因此很容易找到支持人员。从数据库中移除性能的机会成本,但保持Java接近数据库并不会带来很大的性能提升。

你肯定需要在数据库中使用Java而不是a)PL / SQL存储过程或b)数据库外的Java。

答案 3 :(得分:2)

Java可以编写与数据库无关的代码。它允许您重用现有代码并显着提高工作效率。

我发现Java存储过程有用的一件事是文件IO。与Oracle的UTL_FILE包相比,Java拥有更丰富的文件IO功能,允许开发人员删除文件,添加目录等。

答案 4 :(得分:1)

我使用Oracle emmbedded java来解决两个问题:

1)执行PLSQL过程,该过程在文本文件中填充查询结果并通过FTP发送。这个文件非常大,我使用Java来压缩它。

2)在与DB直接连接的客户端 - 服务器应用程序中,将用户发送的密码与应用程序(不是数据库用户密码)进行比较,用MD5进行哈希处理,以便密码不通过网络以纯文本形式传送。我不确定这是否是解决这个问题的更好方法,我现在就问它。 :)

答案 5 :(得分:1)

<强>优点:

  • 可以在客户端和数据库中共享相同的应用程序逻辑
  • 访问Java API。注意每个数据库支持的java版本 - 我相信10g只支持1.4(这意味着在我的工作中我们必须非常小心,因为我们的主代码库最近已经移动到1.5)。

<强>缺点:

  • 执行大量数据库访问的Java存储过程可能非常慢
  • 更难部署代码

答案 6 :(得分:1)

当你无法在PL / SQL,中使用Java时,如果Java可以让你获得更高的性能,那就使用Java。

例如,如果您希望在PL / SQL程序中使用套接字(记录,外部调用等),您可以:

  1. 编写使用UTL_TCP的PL / SQL客户端。但是,仅使用原生PL / SQL无法进行UDP。
  2. 编写使用TCP或UDP套接字的Java客户端。
  3. 在第一种情况下,如果远程服务出现问题,您有一个可以备份PL / SQL调用的同步套接字。此外,如果您正在使用dbms_session.reset_package(如在OWA中),则必须为每个请求重新连接套接字,这非常昂贵。

    在第二种情况下,TCP仍然是同步的,但如果您需要异步,非阻塞行为,则可以使用UDP。此外,reset_package不会重置Java TCP或UDP套接字,因此您无需处理拆卸/重新连接的痛苦。

答案 7 :(得分:0)

答案是从不。如果您需要编写程序来加载或处理数据,则需要在数据层之外从网络上的另一台计算机执行此操作。

直接在您的数据层或上帝中运行外部应用程序禁止在您的数据层进行处理,或者当本机查询语言更适合手头的工作时误用外部语言对于小规模定制来说是完美的,并且完全可以接受内部申请。他们根本没有在那个舞台之外的地方。