【问题标题】:Best Practices to support MySQL and Oracle支持 MySQL 和 Oracle 的最佳实践
【发布时间】:2014-07-03 15:06:16
【问题描述】:

我有一个必须同时支持 MySQL 和 Oracle DBMS 的 Java 应用程序。
它最初是为 MySQL 编写的,由于各种原因,我不使用 Hibernate 等框架,因此查询是用存储在配置文件中的“纯”SQL 编写的。

到目前为止,我所看到的是有一些工具可以自动从 MySQL 转换到 Oracle,反之亦然,例如 Razor-SQL。
使用该工具对我有帮助,但现在我必须为查询、表 DDL 等维护 2 个不同的文件。这是一场噩梦!

为了避免过多地改变现有的查询,我写了一些PL/SQL函数来模拟我最常用的MySQL函数,比如UNIX_TIMESTAMP、FROM_UNIXTIME等。

我想问的是,是否有人有一些建议或有更好的方法来处理此类问题。
是否有一些最佳实践可以遵循?

提前谢谢你

【问题讨论】:

    标签: java mysql sql database oracle


    【解决方案1】:

    我过去使用过模板。想想一个 SQL 语句,但其中有一个模板 if/else 以支持不同的数据库。

    例如

    select a,b,c
    from T
    where
       id = ?
    #if ORACLE
       and oracleFunc(d,c)
    #else
       and MYSQLFunc(d,c)
    #end
    order by b
    

    【讨论】:

    • 谢谢你的建议,这样我只需要维护一个文件,但它会复杂得多..我需要考虑一下:)
    • 确实如此。天下没有免费的午餐。我合作过的大多数团队都对 SQL 使用了 DSL 语法,这隐藏了他们之间的数据库差异。例如 HSQL 或用 Scala 编写的自定义语法。但是,您会受到该 DSL 的限制/学习曲线/怪癖的束缚。
    【解决方案2】:

    我不熟悉 oracle 和 mySQL 之间的区别,但我已经有效地使用 oracle 和 derby 完成了相同的事情。

    对于许多差异(例如从序列中获取值、窗口查询等),我在 java 中定义了一个描述功能的 api,并根据特定的连接类型提供了不同的实现来完成工作(例如获取序列值)或正确组装 sql 片段(例如窗口查询)。这涵盖了大部分差异。

    在其他情况下,如果两者都不支持相同的概念(例如tuple in clauses),我最终会管理单独的 sql。

    【讨论】:

    • 这似乎是个好主意,但我们的情况是我们正在使用大约 10 年前在我们公司编写的旧数据库管理器来组装 sql 片段,仅用于 MySQL。现在该库在公司中被广泛使用,以至于很难放弃它。我们无法重写它,我们也不想在管理器和数据库之间添加一个新层来支持 oracle。
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2015-12-02
    • 2023-04-10
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多