Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从手写持久层迁移到ORM_Java_Sql_Database_Performance_Orm - Fatal编程技术网

Java 从手写持久层迁移到ORM

Java 从手写持久层迁移到ORM,java,sql,database,performance,orm,Java,Sql,Database,Performance,Orm,我们目前正在评估从手写持久层迁移到ORM的选项 我们有一堆遗留的持久对象(~200),它们实现了如下简单接口: interface JDBC { public long getId(); public void setId(long id); public void retrieve(); public void setDataSource(DataSource ds); } 调用retrieve()时,对象通过使用在setter中接收到的ID(这通常是查询的唯

我们目前正在评估从手写持久层迁移到ORM的选项

我们有一堆遗留的持久对象(~200),它们实现了如下简单接口:

interface JDBC {
    public long getId();
    public void setId(long id);
    public void retrieve();
    public void setDataSource(DataSource ds);
}
调用
retrieve()
时,对象通过使用在setter中接收到的ID(这通常是查询的唯一参数)向提供的连接发出手写SQL查询来填充自身。它自己管理自己的语句、结果集等。有些对象具有特殊风格的
retrieve()
方法,如
retrieveByName()
,在这种情况下会发出不同的SQL

查询可能非常复杂,我们经常连接几个表来填充表示与其他对象关系的集合,有时连接查询是在特定的getter(延迟加载)中按需发出的。所以基本上,我们已经手动实现了ORM的大部分功能

原因是他们的表现。我们对速度有很强的要求,早在2005年(编写此代码时),性能测试表明,没有一种主流的ORM比手写SQL更快

我们现在面临的让我们想到ORM的问题是:

  • 这段代码中的大多数路径都经过了很好的测试,并且是稳定的。然而,一些很少使用的代码很容易出现结果集和连接泄漏,很难检测到
  • 我们目前正在通过向持久层添加缓存来压缩一些额外的性能,在这个设置中手动维护缓存对象是一件非常痛苦的事情
  • 在数据库模式更改时支持此代码是一个大问题
我正在寻找一个关于什么可能是我们最好的选择的建议。据我所知,ORMs在过去5年中取得了进步,所以现在可能有一款提供了可接受的性能。在我看来,我们需要解决这些问题:

  • 找到一些方法来重用至少一些编写的SQL-to-express映射
  • 可以在不需要手动分解结果的情况下发出本机SQL查询(即避免手动
    rs.getInt(42)
    ,因为它们对架构更改非常敏感)
  • 添加非侵入式缓存层
  • 保留性能数据
关于这一点,您可以推荐什么ORM框架吗

更新了解我们正在谈论的绩效数据:

  • 后端数据库是TimesTen,内存中的数据库,与JVM运行在同一台机器上
  • <>我们发现,改变<代码> R.GETIN(“CulnN1”)< /C> > <代码> R.GETIN(42)带来了我们认为显著的性能提升。

如果您想使用标准持久层来发布本机SQL查询,请考虑使用iBATIs。它是对象和SQL之间相当薄的映射

对于缓存和惰性连接,Hibernate可能是更好的选择。我没有使用iBATIS来实现这些目的

Hibernate提供了很大的灵活性,允许您在遍历对象图时为延迟加载指定某些默认值,但当您需要更好地了解加载时间时,还可以使用SQL或HQL查询将数据预取到您的核心内容。然而,转换工作对您来说将是复杂的,因为它在学习和配置方面有相当高的门槛。注释使这对我来说更容易

切换到标准框架有两个您没有提到的好处: (1) 当你有大量的网站和论坛支持你的时候,运行bug会变得更容易。 (2) 新员工更便宜、更容易、更快


祝您在解决性能和可用性问题方面好运。你指出的权衡是很常见的。抱歉,如果我宣传了这一点。

我最近钻研了一系列Java ORM,没有找到比Hibernate更好的方法。Hibernate的性能可以帮助您达到目标,并满足您的性能目标

很多人认为,迁移到Hibernate会让一切变得非常棒,但实际上这只是将一系列问题从JDBC查询转移到Hibernate调优中。读一堆书或者(更好)雇一个“冬眠人”来帮忙


在重构过程中,我建议您使用JPA,这样当下一件大事发生时(或者您转到Oracle),您可以取消并重新插入新的持久性提供程序。

对于大部分查询,我会使用hibernate。它被广泛使用,有很好的文档记录,并且通常性能良好。如果hibernate不能生成足够有效的查询,您可以使用手工编写的SQL。Hibernate在指定域对象映射到的表名和列时为您提供了很多控制,并且在大多数情况下,您可以将其重新调整到现有模式

  • 找到一些方法来重用至少一些编写的SQL-to-express映射 映射使用注释在JPA中表示。创建查询时,可以使用现有SQL作为指南

  • 添加非侵入式缓存层

hibernate中的缓存是自动和透明的,除非您特别选择参与其中。您可以将实体标记为只读,或从缓存中逐出,控制何时将更改刷新到数据库(当然,在事务内部-当考虑到网络延迟时,自动使用批处理可以提高性能)

  • 有可能发行本地债券 SQL查询,而无需 手动分解其结果(即。 避免手动rs.getInt(42),因为它们 对架构更改非常敏感)
Hibernate允许您编写SQL,并将其映射到您的实体。您不直接处理结果集——hibernate负责对实体进行解构。请参阅hibernate手册中的

  • 当数据库模式更改时支持此代码