一、spring中的懒加载与事务
问题出在为了在使用jpa的时候为了避免ifPresent判断。自己把jpa的find方法改成了get方法。就会出现no session报错。
原因和办法:
1.getOne和findOne都是springdata提供的根据id查找单个实体的方法,区别是前者是懒加载,后者是立即加载。我们使用getOne来进行懒加载的实验,就不用大费周章去写懒加载属性,设置多个实体类了。
2.因为spring的session是和线程绑定的,在整个model->dao->service->controller的调用链中,这种事务和线程绑定的机制非常契合。而我们出现的问题正式由于新开启了一个线程,这个线程与调用链的线程不是同一个。
3.dao 层或者 service 层,会出现 no Session 的错误;访问 controller 时,又不会出现上面的错误。因为:spring boot web 会引入一个一个配置spring.jpa.open-in-view=true
。springboot帮我们默认开启了这个过滤器,而我设置了false。
该配置会注册一个OpenEntityManagerInViewInterceptor。在处理请求时,将 EntityManager 绑定到整个处理流程中(model->dao->service->controller),开启和关闭session。这样一来,就不会出现 no Session 的错误了(可以尝试将该配置的值置为 false, 就会出现懒加载的错误了。)或者在相应的实体类上加上@proxy(lazy= false)
spring.jpa.open-in-view=true配置说明:
spring.jpa.open-in-view
java.lang.BooleanDefault: trueRegister OpenEntityManagerInViewInterceptor.
Binds a JPA EntityManager to the thread for the entire processing
of the request.
29.3.4 Open EntityManager in ViewIf you are running a web application, Spring Boot will by default register OpenEntityManagerInViewInterceptor to apply the “Open EntityManager in View” pattern, i.e. to allow for lazy loading in web views. If you don’t want this behavior you should set spring.jpa.open-in-view to false in your application.properties.
参考:https://blog.csdn.net/u013815546/article/details/73637759
https://blog.csdn.net/johnf_nash/article/details/80658626
二、StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,性能略高,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
参考:https://www.runoob.com/java/java-stringbuffer.html
https://blog.csdn.net/csxypr/article/details/92378336
三、规则引擎drools(待补充)
使用drools。对于频繁更改的需求可以加规则就好,无需修改现有规则。如果不用drools将会频繁的去修改代码。
规则引擎有很明显的优点:包括声明式编程、逻辑和数据分离、高速度和高可扩展性、知识集中化、使用rete 算法等。
Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。
具体使用和相关概念语法参考:https://blog.csdn.net/weixin_40693633/article/details/100916490?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight
四、RPC(待补充)
RPC:远程调用。通过RPC框架,使得我们可以像调用本地方法一样地调用远程机器上的方法:
1、本地调用某个函数方法
2、本地机器的RPC框架把这个调用信息封装起来(调用的函数、入参等),序列化(json、xml等)后,通过网络传输发送给远程服务器
3、远程服务器收到调用请求后,远程机器的RPC框架反序列化获得调用信息,并根据调用信息定位到实际要执行的方法,执行完这个方法后,序列化执行结果,通过网络传输把执行结果发送回本地机器
4、本地机器的RPC框架反序列化出执行结果,函数return这个结果
gRPC 是谷歌开源的、基于 Protocol Buffers 的优秀的 RPC 调用中间件。
具体使用或参考:
https://www.zhihu.com/question/25536695/answer/285844835
https://zhuanlan.zhihu.com/p/122990512
http://doc.oschina.net/grpc?t=58009
五、etcd(待补充)
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。
如果是读多写少那就很实用。
etcd作为服务发现系统,有以下的特点:
简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单
安全:支持SSL证书验证
快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作
可靠:采用raft算法,实现分布式系统数据的可用性和一致性
基本信息和概念参考:
https://www.jianshu.com/p/f68028682192
https://www.jianshu.com/p/4be30c0716b4
https://blog.csdn.net/weixin_30312563/article/details/99381529?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.edu_weight
https://github.com/zalando-stups/spring-boot-etcd