ps:一下技术都在本地有实现,不信可以立即演示
功能总结
上传
下载
导出 excel,html pdf
导入
xml解析
properits解析
跨域
前后台发送请求
Echart图表
文本解析性能提高
多数据源解决方案
简单的登录系统
时间戳:
主系统访问子系统页面因为浏览器缓存而导致有几率不进子系统Controller层
实现:a标签+时间戳的方式访问子系统(防止子系统走缓存页面而不走Controller层)。
防盗链:子系统防盗链来确保跳转源是平台页面
。。。
Java第三方
org.apache.commons.fileupload
实现文件上传,当然,现在都是用MVC提供的MultipartFile 去实现
org.dom4j
实现对xml文件解析
org.apache.poi.xssf
实现excel解析
org.springframework.web.client.RestTemplate
后端发送请求模板
javax.mail:
发送邮件
javax.servlet.Filter
过滤器
com.itextpdf.text.pdf
pdf文件解析
java类库
javax.servlet.http.Session
session会话存放用户信息,权限
java.lang.Thread & java.lang.Runable
多线程
java.lang.ThreadLocal
作用:不同的线程访问同一个ThreadLocal对象,不会互相干扰
场景:数据源动态切换
java.lang.Comparable
作用:类排序需要实现此接口
java.lang.Process
调用进程执行命令(shell)
java.lang.String & StringBuilder & StringBuffer
字符串拼接实现类区别
java.util.stream
stream流用于对集合进行操作
java.util.regex
作用:正则匹配
场景:业务需要对大文本文件循环解析,先正则匹配出需要的信息,提高效率
一:需数据为文本的第 xx行至 xx行 ,以命令a开头,命令b结尾(a,b唯一)
用正则先截取出有效文本放入内存,再用内存去解析
二:所需数据零散分布整个文本:
用list返回所有匹配成功的字符串即可。
java.util.zip.ZipFile
实现zip文件解压缩
java.util.Iterator
所有实现了Collection容器的类都有,用于遍历容器
java.util.Properties
从 .Properties解析获取数据
java.io
java IO 流 用于读写文件
java.io.File
代表系统文件名 (路径+文件名),定位文件
[]
java数组
java技术
redis
项目名称:
测试管理平台项目(2019):简称B
项目业务:
1.每天每隔两小时同步 前后半个月的 app A 的数据库到自己的服务器上,主从分离,只用来查询 缓解 app A的压力
2.B项目 同步过来的数据根据数据的版本 分库多数据源存放(放在一起数据流过大)
3.B项目 采用分布式异步同步,即同一个应用服务器部署多个B项目同时走缓存任务
4.同步的过程需要频繁的动态切换数据源
如果将数据源-ip 存入关系型数据库,多个B应用每天不间断读取性能不高
如果用静态常量表示,又得考虑线程,且不好维护
而redis就很适合
使用:
1.主应用(web)定时器每隔1小时将所有缓存任务的 key 存入 redis,如果当前key的size>设定 size 不执行存入
2.其他同步应用 不停的循环 缓存数据到中间表,利用 redis 获取每个缓存任务的key 的 value,根据 value 来动态设置当前业务的数据源 ,并执行.
mybatis
很多项目都用到了
优化 + 增删改查
java 解决方案
springboot 多数据源 动态切换(Mybatis)
项目名称:
测试管理平台项目(2019):简称B
项目业务:
1.每天每隔两小时同步 前后半个月的 app A 的数据库到自己的服务器上,主从分离,只用来查询
项目业务:
1.每天每隔两小时同步 前后半个月的 app A 的数据库到自己的服务器上,主从分离,只用来查询 缓解 app A的压力
2.B项目 同步过来的数据根据数据的版本 分库多数据源存放(放在一起数据流过大)
3.B项目 采用分布式异步同步,即同一个应用服务器部署多个B项目同时走缓存任务
4.缓存时需要根据 redis取到的key值进行 动态切换数据源
使用:
1.yml配置多数据源
2.新建一个继承 AbstractRoutingDataSource 类的动态数据实现类DynamicDataSourceImpl,
这个类是通过key获取数据源的,我们重写获取key的determineCurrentLookupKey()方法
3.新建一个DynamicDatasourceContext动态数据源上下文,里面有ThreadLocal
4.新建MybatisConfig配置类
实例化yml里的数据源(bean),
实例化 DynamicDataSourceImpl类设置默认数据源和 多数据源map集合(一并设置到DynamicDatasourceContext)
实例化 SqlSessionFactoryBean,设置实体类和mapper扫描路径,并设置数据源为DynamicDataSourceImpl
切换:
通过上下文切换
1.DynamicDatasourceContext将 数据源key值 放进 ThreadLocal 对象
2.执行查询语句,dao层调用 sqlSessionFactoryBean创建 Connection连接。
3.sqlSessionFactoryBean里的数据源是 DynamicDataSourceImpl,调用determineCurrentLookupKey方法根据key获取数据源
4.determineCurrentLookupKey方法被我重写了调用:DynamicDatasourceContext.getDataSourceKey()获取
5.上面方法一对象为 ThreadLocal为 key 从当前线程的map获取到数据源key,DynamicDataSourceImpl就会加载该数据源
通过切面获取:
切面逻辑里通过上下文获取
前台页面显示解析进度:
思路是前台发送解析请求的同时,每隔1s发送另一个请求去请求解析进度值并返回给前端插件,
问题在于如何确保这个解析进度值是我要的,因为springMVC的controller默认是单例,
一开始想用单例模式或者加个静态常量来解决,不过这肯定是不行的,多用户同时解析进度就乱了,后来决定将解析进度值存在session里。(聊聊单例,session)