当前位置: 首页 > 面试题库 >

Hibernate实现。我们要付反思费吗?

尤茂材
2023-03-14
问题内容

很久以前,我正在使用反射创建一个迷你ORM。

在阅读有关反射的文章时,我得到了类似的答案:

这完全有道理,我退出了我的小命令并增强了CTRL + C,CTRL + V键(lib的目的是避免为我正在使用的Web应用程序中的不同表重复重写相同的代码段)

几年后,由于某种原因,我现在不记得(也不想记住)我正在阅读(或试图…)Hibernate源代码,因为我想知道他们是否使用AOP即时生成代码并避免反射惩罚,但令我惊讶的是,我所看到的全部都是纯反射。

难道这意味着那里是最被接受的ORM框架,到底是在什么年前阻止我继续我的幼稚工作的?:“)

我的问题是:有人可以证实我对Hibernate实现的理解吗?他们会即时生成字节码以提高性能吗?还是我们(当我们使用它时)总是付出反射惩罚(顺便说一句,如果差异在几毫秒之内,我们当中没有人注意到或抱怨过)

我们要付反思费吗?如果是的话,我认为这是 值得的!!!

问候。


问题答案:

Hibernate可以使您的模型了解Hibernate。

使用Reflection的成本水平不尽相同。不断地为特定类查找方法特别昂贵。通过使用缓存副本进行反射执行方法不会慢很多。如果考虑到反射api必须完成的任务才能调用该方法,那么每个部分都很慢并且会占用cpu周期就很有意义。

定位方法

  • 访问特定类的每种方法
  • 测试每种方法的可见性,方法签名等
  • 找到的 方法生成字节码。

一个典型类中的方法数量受一个因素的影响,而其中一些操作琐碎琐碎,这显然很昂贵。

调用方法。

每个反射的方法都包含一些字节代码,这些字节代码用一些样板代码调用目标方法以匹配反射接口。在它可以执行此操作之前,它必须执行一些健全性检查,以便它可以用漂亮的消息进行抱怨,而不是让运行时抛出ClassCastException和类似异常。

  • 如果使用实例方法,请检查传入的实例是否为null且类型正确。
  • 检查arguments参数是否包含正确数量和类型的参数。
  • 在try catch中执行该方法。在投掷ITE等

所有这些额外功能会增加一些成本-并不多,但确实会使事情变慢。

运行时间成本

在一般的缓存方法中,调用该方法虽然不花钱,但速度较慢。反射api本身确实尝试html" target="_blank">缓存方法和类,但是找到正确的方法等等仍然是缓慢的操作。



 类似资料:
  • 问题内容: 很久以前,我正在使用反射创建一个迷你ORM。 这完全有道理,我退出了我的小命令,并增强了CTRL + C,CTRL + V键(lib的目的是避免为我正在使用的Web应用程序中的不同表重复重写相同的代码段) 几年后,由于某种原因,我现在不记得(也不想记住)我正在阅读(或试图…)Hibernate源代码,因为我想知道他们是否使用AOP即时生成代码并避免反射惩罚,但令我惊讶的是,我所看到的全

  • DaoCloud 企业版交付形式 我们采取混合云形态交付,根据用户的选择,DaoCloud 将把部分或全部 DaoShip 容器自动化交付流水线在客户提供的环境中部署,然后通过跨云跨网的方式与 DaoCloud 主站连接。这类独创的混合形态,为用户提供了以下便利: 在可控的自有主机资产上保存核心的源代码仓库和镜像仓库,免除对代码或核心知识产权安全的担心。 DaoCloud 可以将容器自动化交付流水

  • 我想知道为什么我们需要std::promise和std::future?为什么c 11标准将get和set_ value分为两个独立的类std::future和std::promise?在这篇文章的回答中,它提到: 它被分成这两个独立的“接口”的原因是为了对“消费者/阅读器”隐藏“写入/设置”功能。 我不明白躲在这里的好处。但是,如果我们只有一个类的“未来”,那不是更简单吗?例如:promise.

  • 我们通常在数据库中存储对象图。在rdbms中,我们需要男性连接来重试对象之间的关系。在cassandra中,它被提升为非规范化模型以适应查询。但是这样做,我们使模型的更新更加复杂或更加指定。在Cassandra中,它存在复杂的数据类型,如set、map、list ou元组。这些类型可以通过在列表中存储连接对象的id来以简单的方式(关联、聚合、对象组合)存储对象之间的关系。唯一的缺点是必须将sql复

  • 本文向大家介绍python Selenium实现付费音乐批量下载的实现方法,包括了python Selenium实现付费音乐批量下载的实现方法的使用技巧和注意事项,需要的朋友参考一下 必备环境 废话 每年回家都要帮我爸下些音乐,这对我来说都是轻车熟路!可当我打开网易云点击下载按钮的时候,可惜已物是人非啦! 开个 VIP 其实也不贵,临时用用也就¥15!但 IT 男的尊严必须要有,于是开始徜徉于搜索

  • 本文向大家介绍微信、支付宝二码合一扫码支付实现思路(java),包括了微信、支付宝二码合一扫码支付实现思路(java)的使用技巧和注意事项,需要的朋友参考一下 一、支付二维码(预订单) 根据需要购买的信息创建预订单,将订单信息保存到Redis中,并设置有效期,注意生产二维码的链接后的参数可以关联到Redis中的key; QRCode  为servlet扫码请求的URL; UUIDUtils.get