加入收藏 | 设为首页 | 会员中心 | 我要投稿 宜春站长网 (https://www.0795zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

用Javascript制作随机星星效果图

发布时间:2021-02-02 15:55:00 所属栏目:动态 来源:互联网
导读:然而要实现UOW模式的Repository,使用JPA依然是最佳选择,你几乎不用自己做任何的工作,只要把聚合中的对象和表映射好就可以了。 JPA/Hibernate还提供了易用的乐观锁功能,在聚合根上维护一个乐观锁非常简单 JPA/Hibernate在国内不受待见的一个重要原因,不

然而要实现UOW模式的Repository,使用JPA依然是最佳选择,你几乎不用自己做任何的工作,只要把聚合中的对象和表映射好就可以了。

JPA/Hibernate还提供了易用的乐观锁功能,在聚合根上维护一个乐观锁非常简单

JPA/Hibernate在国内不受待见的一个重要原因,不是它不好用,而是太好用了——隐藏了很多实现细节有时候显得不太灵活,提供了太多的高级功能用不好容易踩坑。

所以,使用JPA,请遵循以下几点建议:

  • 只用它的功能的一个子集,比如要禁用Many-to-Many映射、禁用延迟加载的功能等;
  • 还记得之前关于CQRS这篇文章吧,很多查询场景不需要聚合内的全部数据,所以,有些Query的实现,你完全可以不使用JPA,而是用原始的SQL去查,比如用JDBC或MyBatis;理解了CQRS,这些技术是可以很好地结合在一起使用的;
  • 确定你的聚合中的数据不需要分库分表。即使你使用了Proxy模式的分库分表中间件,使用JPA还是有问题的,这个以后专门写一篇文章说说为什么有问题,以及如何解决这个问题;

嫌弃JPA不够精简的人很多,以至于Spring的官方推出了 Spring-Data-JDBC,一个专门为DDD的聚合存储设计的ORM框架,它比JPA轻量很多,简单很多,然而,为了轻量简单,它也没有对对象状态修改进行跟踪,所以在保存聚合的时候无法像JPA一样按需更新数据库,而是如IDDD_Sample一样,粗暴地覆盖更新,甚至会先删除聚合下所有子实体后再重新插入(无论子实体数据有没有变更),这可能会带来不可控的性能问题。

如果我们又想用关系数据库,又不能使用JPA,那还有别的办法吗?

自己写代码实现资源库

前段时间我尝试过一种方法:自己手写Repository的实现,在聚合保存前,先从库里load出来一个聚合,把这两个聚合里的对象进行比较(diff),找出差异,生成操作数据库的SQL语句,去增量更新数据库。

这样做的问题是需要写很多的Repository代码,而且很容易出错也不容易维护,我试图做一些抽象来简化代码,最后发现抽象越多越像JPA了。
 

它把整个聚合序列化后存储了。由于没有跟踪对象变更,所以也无法实现增量的更新,只能粗暴地用最新的聚合序列化后完全覆盖之前的聚合存储了。 但这种方式对我们大部分场景参考性不大,一个原因是我们最常用的还是关系型数据库, 另一个原因是这种非增量的更新开销还是比较大的。

合适的就是最好的,我有个朋友曾用MongoDB作存储,使用了这样的模式,效果很好,他所做的那个应用数据量不大,并发不高,用这种方式大大节约了开发和维护的成本。

那我们看看当使用关系型数据库的时候有什么框架可以选择。

使用JPA实现Repository

JPA (Java Persistence API) 是一个Java 持久化规范,最流行的一个实现是Hibernate,它可以大大简化对数据库的操作,然而,JPA在国内不受待见:
 

对应的有两种机制可以与构建系统通讯:

  1. 由构建系统提供构建 API。如 Gradle Tooling API,在那篇《Gradle IDEA 的项目模型》中,我们实际上介绍了由构建系统主动向 IDE 提供模型的方式。
  2. 由 IDE 构造一遍构建系统。如 IDEA 对于 Node.js 的处理方式。

简单来说,就是复杂的系统应该由构建系统提供机制,而简单的构建系统则就不会有这样的问题。

依赖管理的基础设施

不同语言对于依赖的管理机制都有所不同,但是它们的原理都是相似的:

  1. 源码包。即将源码打包,并以特定的格式发布,适用于脚本语言
  2. 仓库源。方式类似于源码包,唯一不同的地方是借助于版本管理工具,如 Golang。
  3. 类二进制包。典型的是 Java
  4. 其它包。如 Maven 可以支持其它自制的包

最有意思的是Maven 的机制,我可以自制依赖,并上传上去。而整个仓库并不关心这个包的内容,我们只需要依赖于它定义的格式即可。如果我们考虑围绕语言来设计依赖管理体系,那么可以考虑的是类似的方式,并借助于 Git 这样的版本工具。这样一来,我们就可以去中心化。

(编辑:宜春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读