当涉及从数据库中读取时,我们目前处于对性能有很高要求的项目中。
我们目前正在使用JPA(EclipseLink实现),目前只是因为它提供了方便的数据库访问和列映射。
对于我们的查询,我们使用高度特定的SQL查询。我们还使用一个数据库(SAP HANA,内存中),因此不需要语言抽象。数据库访问速度非常快,我们当前的瓶颈实际上是应用程序服务器,尤其是持久层。
结果集通常也不包含实体,因为实体由上下文组成。对于我们来说,使用像下面这样的@Id字段是没有意义的,因为我们没有唯一的字段(只有组合,但定义IdClass的开销太大)。
// Replace all underscores with dashes (-)
var str = 'ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8';
str.replace(/([\w])_([\w])/g, '$1-$2');
// ^ ^
// | Refers to second match group `([\w])`
// Refers to first match group `([\w])`
如果我想运行类型化的本机查询,这似乎是JPA强制执行的。这个假设是真的吗?目前,我们还没有找到解决ID映射的方法。
这些发现是否有效? 如果没有,我们如何才能使JPA的使用更加高效(与普通JDBC相比存在显着的延迟),而且没有为结果类型定义@Id(因为它在我们的例子中没用)? 如果是,是否有另一个Java库只在JDBC之上提供最小层而没有太多延迟,这提供了比普通JDBC更方便的用途(使用列映射和所有好东西)。
谢谢!
用例:我们希望从数据库中传输历史GPS传感器数据。除了将其转换为JSON之外,我们还进行了一些转换/验证。这就是我们实际需要构建对象的原因。所以我们基本上寻找的是将select语句的字段映射到属性的便捷方式。我希望这是有道理的。
答案 0 :(得分:0)
有许多关于改进EclipseLink / JPA性能的文章和博客,您可以查看,例如EclipseLink Performance,JPA Performance Tuning和Optimizing the EclipseLink Application
最后,尽管这完全取决于您的具体用例以及您可能需要的任何未来用例。 JPA旨在使JDBC的读取和写入更容易,更易于维护,并增加许多性能优势,如缓存。如果你所使用的只是读取原始数据,那么额外的层可能是额外的开销,而不是添加任何值。让JPA从结果集构建实体,维护缓存并仅监视应用程序的更改以忽略所有内容并获取原始数据没有多大意义。
我不明白为什么你会有一个带有单个myField的Item表。应用程序如何使用它以及它与其他表和潜在实体的关系如何?
这样的构造不是关系数据库和ORM的正常用例,但在JPA中仍然存在各种方法。数据可以由其他实体用于元素集合,甚至可以仅用于未映射,以及使用直接通过JDBC层传递的本机SQL查询。 EclipseLink本身有许多映射类型和选项,可以根据您的使用情况使用JPA。