【问题标题】:How to Call Java Code from MySQL?如何从 MySQL 调用 Java 代码?
【发布时间】:2011-01-03 07:50:26
【问题描述】:

我发现一篇 2008 年的文章讨论如何call Java code from MySQL。有很多警告和免责声明,因为该过程涉及使用 MySQL 的实验分支。

对于我想到的一个项目,能够访问 MySQL 中的 Java 库将非常有用,类似于 Oracle 的 Java Stored Procedures。这个功能现在是否作为 MySQL 的标准功能存在?如果没有,哪些开源 RDBMS 支持类似于 Oracle 的 Java 存储过程的东西?

【问题讨论】:

  • +1 有趣。我一直只是将数据存储在数据库中,并在业务层中实现任何逻辑。事实上,我一直对此持虔诚的态度。我有兴趣看到一个从 db 调用 java 代码是一个很好的设计决策的项目。有链接吗?
  • 例如超出 DB 能力的自定义函数。然而,我也高度质疑能够做这样的事情的价值。数据库用于存储/管理数据,而不是做一些业务。
  • @darren,该示例涉及基于图形的数据类型(化学结构),无法与使用内置 MySQL 函数的查询匹配。 Java 库会将文本字段的查询和内容转换为可以匹配的内存对象。例如,将这个逻辑保留在 DB 层中会在数据库中保留连接,这似乎是它们所属的地方。至少是这样的想法。

标签: java mysql java-stored-procedures


【解决方案1】:

PostgreSQL 支持可插入的过程语言,并且有一个项目以PL/Java 作为语言来扩展 PostgreSQL。

我不建议在 RDBMS 中放置太多代码。在应用层开发、测试和调试代码的工具比 RDBMS 中的代码工具要好。

还有很多开发人员不理解 RDBMS 中的代码应该遵守事务隔离。他们尝试从触发器等发送电子邮件。我认为带有副作用的代码应该在应用程序层中,因此您不会创建幻像效果(例如,电子邮件可能会通知数据库更改,即使更改已回滚)。

【讨论】:

  • 当然,没有头脑正常的人直接从 RDBMS 发送电子邮件(例如,邮件服务器可能已关闭)。执行此操作的正确方法是将电子邮件添加到电子邮件队列表,并有一个单独的进程检查此电子邮件队列表并实际发送电子邮件。这解决了事务问题,因为回滚会将电子邮件添加到队列表中。
【解决方案2】:

我完全同意 Bill 的观点,但我可以想象将业务规则存储(未处理)在数据库中。我在这里想drools。引擎可以在应用程序中,但规则可以在具有管理前端的数据库中。

这样的野兽对于不仅参数会改变,而且公式也会改变的场景会很有趣。

【讨论】:

    【解决方案3】:

    如果您可以使用 HSQLDB,那么您可以直接从 SQL 调用 java 方法:http://hsqldb.org/doc/2.0/guide/sqlroutines-chapt.html#N1240C

    【讨论】:

      【解决方案4】:

      根据您迄今为止提供的有限信息,很难给出好的建议。然而:

      ...该示例涉及基于图形的数据类型(化学结构),无法与使用内置 MySQL 函数的查询匹配。 Java 库会将文本字段的查询和内容转换为可以匹配的内存对象。例如,将这个逻辑保留在 DB 层中会在数据库中保留连接,这似乎是它们所属的地方。至少是这样的想法。

      我认为我不会为此在 MySQL 中使用数据库端 Java。相反,我想我会考虑以下选项:

      • 使用 JDO 或 JPA 等对象关系映射(例如使用 Hibernate)来处理基于图形的数据模型与数据库提供的数据之间的映射。您不一定必须使用 RDBMS 作为后端,但这可能是最好的起点……除非您已经发现这是一个性能问题。

      • 重新审视您的数据模型和数据访问模式。看看你是否可以找出一些转换,让你的应用程序的主要查询被实现为(有效的)表连接,而无需求助于服务器端应用程序逻辑。

      • 如果您确实需要使用服务器端应用程序逻辑(出于性能原因!),请坚持使用您的 RDBMS 支持的机制。例如,在 Oracle 中,您将使用 PL/SQL 和 PostgreSQL,您有很多选择。准备好切换到更适合您的应用程序需求的不同 RDBMS。

      我(个人)会避免依赖某个数据库的实验分支:

      • 考虑如果实验分支没有合并回主分支会发生什么。根据不受支持的分支,您可能会被代码库困住,并且可能会停止维护并失败。

      • 使用(当前)不受支持的 RDBMS 分支将成为可能想要使用您的软件的其他人的障碍。

      现在很明显,如果您的软件的长期生存能力不是主要问题,您可以选择忽略此建议。但这可能对某人很重要;例如你的研究主管。

      【讨论】:

      【解决方案5】:

      我知道这是一篇相当老的文章,但它值得更新。从数据库触发器调用 java 的能力是“Java 编程语言的 SQL 例程和类型”(SQL/JRT) 标准的一部分。

      通过https://en.wikipedia.org/wiki/SQL/JRT 了解更多相关信息。

      在兼容的数据库引擎中有..

      HyperSQL:http://hsqldb.org/ 甲骨文:https://www.oracle.com/database/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2012-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多