我正在为客户端的数据库应用程序工作。旧的应用程序代码在访问数据库的方式上很不一致;在一些方法中它使用Hibernate对象,在另一些方法中直接创建JDBC连接并使用纯SQL,在一些方法中它创建Hibernate连接并使用它们来获得JDBC连接。无论如何,我们将检修大量代码以保持一致。我们的客户听说过JPA,并要求我们使用它,因为客户相信它会带来性能优势。JPA的EntityManager何时可以通过普通JDBC提供性能优势?
问题是,我对JPA的性能好处的理解是JPA的EntityManager带来的巨大好处,因为它允许您在数据库调用之间持久保存内存中的对象。但是,我们正在处理的应用程序不是唯一访问数据库的应用程序,并且会在多个位置的多个实例中运行。此外,EntityManagers aren't thread-safe因此我们甚至无法在同一个应用程序的不同部分看到更改的数据。因此,看起来我们需要从每个方法中的EntityManagerFactory获取新的EntityManager,并在方法完成时关闭它。因此,我们实际上不能长时间坚持内存中的对象,因为其他应用程序需要我们更改我们需要的数据的数据。
目前的代码非常混乱,移植到JPA会给可维护性和一致性带来重大好处。但是,如果它不提供性能优势,我们应该尽快让客户知道,这样他们就不会失望。 JPA除了与持久性上下文有关的显而易见的方面还有其他的方法吗?
我检查了StackOverflow上的其他问题,但是我发现了关于大批量变更的讨论(example here)。我们的客户希望一个应用程序所做的更改能够尽快显示给其他应用程序,因此我们的应用程序将进行一些小的更改,而不是偶尔进行批量更改。
谢谢。
请注意,任何形式的表现,你可能会间接引用(执行速度,开发维护方便,代码质量,便携性)不属于JPA的属性。他们按照惯例完全由开发商控制;它非常依赖于你作为工程师的技能以及设计适当软件架构的能力,如果它实际上对你有很大的帮助或者极大的阻碍。例如,如果您打算使用JPA来处理相关数据库,则您已经处于不稳固的状态。存储过程和普通的JDBC仍然有它们的位置。 – Gimby
因为其他应用程序需要读取数据库,所以我不认为你会得到很大的性能提升,因为你的JPA代码将不得不[flush](http://docs.oracle.com/javaee/6/ api/javax/persistence/EntityManager.html#flush%28%29)。但是,获得的巨大收益将在开发阶段:维护JPA代码比维护显式JDBC容易得多。您甚至可以使用[验证约束](http://docs.oracle.com/javaee/6/api/javax/validation/constraints/package-summary.html)。 – VGR