我需要构建一个我的网站的报告部分,其中包含一些非常复杂的查询,包括UNION,GROUP_CONCAT等等。到目前为止,JPA与我的实体的集成保持了数据库独立性。目前系统使用的是MsSQL,但我们希望以后可以在需要时切换到Postgres或MySQL。
使用这些报告有什么好的方法,这样我可以在没有太多工作的情况下使其在MySQL或Postgres上运行?
该网站也使用Spring
答案 0 :(得分:2)
正如我所看到的,您的问题或多或少是“如何在不与该供应商联系的情况下利用供应商特定功能?”。
这个结果不是一个简单的答案;可能最灵活的是坚持使用JPA并且可以提高性能。
其他可能性:
将报告定义为发布一组接口的组件。使用CDI注入与您选择的数据库相关的实现
上述变体,设置您自己的DAO接口以进行数据访问。像另一个ORM框架一样,更具体,可以有更好的性能。在此基础上构建报告。
如果您的商务允许,请选择RDBM来处理报告。在夜间(甚至可能需要,如果没有太多数据),请将生产数据库转储到其中。
答案 1 :(得分:0)
最佳选择是使用data access objects,每个数据库一个,每个都符合通用接口。任何客户端代码都可以使用公共DAO接口,而无需了解底层数据库。
使用Spring,很容易在DAO实现类之间作为配置选项进行交换,例如:如果你有一个具有Oracle和DB2实现的CustomerDao
接口,那么使用:
<bean id="customerDao" class="my.package.customer.OracleCustomerDao"/>
或
<bean id="customerDao" class="my.package.customer.Db2CustomerDao"/>
答案 2 :(得分:0)
如果您希望SQL跨多个数据库工作,那么这是您可以遵循的计划:
要获得可移植性,您需要编写可移植的SQL。确保SQL可移植的唯一方法是检查它的可移植性。
如果你坚持使用标准SQL,那么这应该是相当简单的;你将无法使用特定于数据库的功能,但是如果没有它们,你可以做很多事情(它们主要是语法糖,或者用于跨越关系模型,你希望不需要这样做) 。如果您已经误用了非标准SQL,那么可能很难找到可以做到这一点的点,但是如果你开始以一种有纪律的方式工作,我会对你坚持标准的能力持乐观态度
如果您正在使用SQL Server,PostgreSQL将是第二个要测试的数据库的不错选择,因为它是免费的,易于设置且非常强大。