2017年7月25日---阶段性工作总结

通过本阶段工作,总结如下:

通过需求学习,熟悉了springboot基本使用,熟悉了springcloud各组件的功能。

持久层框架原本是spring data jpa 但是实在用不习惯,因此改为了mybatis,+springMVC

测试使用了postman。

创建,更新和链接第三方数据库实现起来非常简单,不多说。

查询数据库中表的功能。由于数据库类型不同,因此采用了DatabaseFactory(工厂模式)根据传入的数据库类型,switch....case....返回DatabaseServiceImpl实例。再通过这个实例得到数据库链接对象Connection。


根据用户选择的列返回数据,接收json格式的list对象,通过遍历,使用StringBuffer的append动态拼接查询参数。使用connection对象查询。


本项目还使用到了构造者设计模式,会在之后的博客中详细说明。



2017年7月26日(内蒙古移动渠道管理系统,去除hibernate二级缓存,改为redis用作二级缓存)

组长让我对一个原有项目进行改造。我在自己的电脑上部署完项目以后,开始是bean注入的问题,找不到指定的类。经过查看发现启动项目的target中没有需要的一个class文件,我将被依赖的那个模块的输入目录改为与调用者(这里也就是启动项目的target目录一直)解决了该问题。

第二个问题。耽误了我很长时间。原因是我本机用的是jdk8,因为考虑到8有很多新特性。但是我忽略了8只支持spring4以上。我又重新下载的jdk7.重新编译运行即可。

该项目web模块是maven工程,其他被依赖的模块都是普通的那种工程。在本地部署时如何添加依赖等,也让我重新回顾了一下。

今天我在完成redis替代hibernate作为二级缓存的时候,突然想到一个问题。hibernate的二级缓存是默认的,可以缓存所有查询。但是redis是自己控制的。有默认的不用干嘛非得要用自己控制的。百思不得其解,于是问了一下高手,得到回答如下:

hibernate的二级缓存默认是ehcache,本质是应用缓存,应用缓存当然也有用武之地。我个人理解,一般情况下关掉二级缓存的原因是,跨请求的cache共享很复杂,

而且会和自身的业务有关系,而持久化的二级缓存操作对程序员是黑盒的,这样可能会造成一些风险,所以我们一般禁用掉二级缓存,而结合业务的特点来自己做跨链接

的缓存操作,这些操作是程序员可控的


由于在本次工作中,我将hibernate的二级缓存关了,然后使用redis手动去控制缓存。但是肯定不如hibernate的全面,然后组长说(我理解)spring可以整合二级缓存,

只要有增删改查都去处理缓存。因此我需要跟进。因为我的方式对原有代码的侵入性太强了。

ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。

如果是单个应用或者对缓存访问要求很高的应用,用ehcache。
如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

补充下:ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;
简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。


sql优化,当父节点下子节点特别多的时候,逐个发送sql语句根据父节点逐个查询的效率就不如查询整张表效率高了。

in查询条件在mysql5.7以后支持索引了


今天无意中看到一篇事务相关的文章有一句话非常经典

 spring的事务是通过spring的动态代理实现的,
但是如果在对象内部的方法使用this调用其他的函数,
那这个this就是对象本身,而不是spring容器中的代理,所以就丧失了事务的能力 






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章