哪个是JRuby on Rails +遗留Java代码的最佳数据库策略?

时间:2010-01-26 08:49:20

标签: java ruby-on-rails database activerecord jruby

我们有一个中等规模的Java应用程序,需要进行一些重构。

我们正在考虑在Rails上迁移到JRuby。主要是因为Ruby on Rails提供的生产力以及将重新实现Web逻辑的许多现有插件。

然而,应用程序的很大一部分应该保留在Java中,我们不想重写所有业务逻辑(特别是因为它使用了许多Java技术,如RMI)。

我们的重构的一个关键点是清理我们的数据库管理,这是目前手工编写的SQL操作和存储在db4o中的一些对象的混合。

从JRuby我们可以调用任何遗留的Java代码。太好了!

然而,许多Ruby on Rails插件都假设使用ActiveRecord来管理数据库。 从Java访问ActiveRecord数据似乎并非易事。

哪个是在JRuby on Rails和遗留Java代码之间管理数据库的最佳策略?

  • 我们可以将db4o用于所有内容,但是会丢失一些Ruby on Rails插件的好处,并且需要在Ruby端“手动”管理对象
  • 我们可以将ActiveRecord用于所有内容,并在Java端定义一些类型的冗余映射。哪个是最好的策略?
  • 我们会使用Java ORM技术(Hibernate,Cayenne?),然后在ActiveRecord中映射模型。这个想法与前一个想法相比如何?
  • 我们可以使用Jruby 1.4 become_java做一些魔术!?

你怎么看?

4 个答案:

答案 0 :(得分:1)

JRuby是一门优秀的语言,但它确实是在Java虚拟机上运行的Ruby。可以集成遗留Java代码,但它不适合核心语言。

如果您对具有可靠Web框架的新动态语言感兴趣,我建议您查看Groovyhttp://grails.org/。 Groovy是在JVM上构建的。您遗留的类可以是应用程序中的一等公民。我认为这可以更容易地迁移到新的东西,因为你可以重用你拥有的东西,重写你需要的部分。

答案 1 :(得分:1)

除了在Ruby中编写新代码之外,听起来你计划在Java方面进行相当多的重构。既然如此,我建议:

1)决定Java ORM:Hibernate或db4o,并在所有Java重构中继续使用它。就像我想说的那样,使用ActiveRecord来处理所有事情,这里的底线是说服JRuby使用Java ORM要比强迫你的Java代码使用ActiveRecord对象要容易得多。

2)至少有Hibernate和db4o的Ruby接口原型示例。找一个让你入门,然后根据需要添加它,以提供你需要的ORM功能。

3)不要担心期望ActiveRecord的Rails插件。并非所有人都这样做,并且将来会更少,因为Rails 3(Rails和Merb的合并)将ActiveRecord解耦。即使有一个你绝对必须拥有的插件确实需要ActiveRecord,那么呢?这只是Ruby代码。下载它,查看它的期望,并为ORM提供一个Facade类,以提供插件所需的方法。 (在这里我们看到了Ruby的美丽 - 只要它像一个人一样徘徊和嘎嘎叫,一个对象不需要<>鸭子)。或者,您可以修补插件以删除ActiveRecord依赖项,或者只是实现插件自己提供的功能。您的情况可能会决定哪种方法有意义。

答案 2 :(得分:1)

在不了解很多细节的情况下回答这是一个棘手的问题。

首先,完全可以在不使用ActiveRecord(AR)的情况下构建Rails应用程序。我做了几个 - 通常我使用控制器来运行脚本,读/写文件等,我相信这种方法是有效的。但是,由于您确实需要在数据库中处理数据,因此请注意保持MVC方法,无论您的M是AR还是其他方式。

如果你的数据库设计得很好,你就可以有一个混合的approch。例如,您的遗留Java可能会使用任何ORM生成报告数据并将其写入数据库,然后可以轻松地将表格包装在ActiveRecord模型中,以便通过Rails应用程序替换报告。这完全取决于您的Java代码所执行的功能与Rails代码所执行的功能(如果您的数据库设计适用于AR建模)。

如果你的rails应用程序和java代码需要直接将模型实例传递给彼此(即与通过数据库相反),那么混合方法可能无效。

我建议采用“试一试”的方法。尝试一些事情,看看你遇到麻烦的速度有多快。在这样的情况下,我觉得首先尝试在你的脑海中设计这一切并不是那么富有成效。

答案 3 :(得分:0)

仅供参考:O'Reilly的书“Enterprise Rails”对制作自己的Rails插件有一些很好的建议,这样你就可以找到/维护/重用你想出的任何技巧。狂野猜测:在O / R插件上制作,您可以选择使用它来放置在旧版Java代码之上吗?

或者,在数据库中创建一些魔法,以允许旧的Java神奇地读取“new and improved!”的结果。红宝石加工?!?我假设一个带有视图,触发器和访问权限的数据库。

祝你好运,我的回答并不是很好,但我对你的工作方式非常感兴趣。