- 博客(12)
- 问答 (2)
- 收藏
- 关注
原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 - 补充:兼顾事务回滚以及分布式事务的情况
前两篇文章已经介绍了动态数据源的具体实现过程,在经过一段时间的使用后,发现了两个比较严重的问题,在这里进行补充说明。事务执行失败时没有切回默认数据源@Transactional 注解的方法意味着使用数据库事务执行方法中的 sql 操作,默认情况下当方法抛出不受检查异常时,事务会进行回滚,我所实现的动态数据源方案通过 AOP 和注解的方式切换数据源, @Transactional 方法执行前切换...
2018-11-28 17:55:17 415
原创 MyBatis 缓存 - 上:一级缓存
在实际项目中,有些情况下相同的查询语句可能被重复执行,MyBatis 提供了一级缓存来优化这种情况,相同的查询 Sql 会命中一级缓存,直接返回,减少不必要的数据库查询提高性能。实现原理Mybatis 提供了 SqlSession 来方便使用者操作数据库,而正真执行数据库操作的是 Executor,一个 SqlSession 中有一个 Executor,每个 Executor 中有一个 Cac...
2018-11-19 11:46:28 205
原创 单体应用和服务化应用的一些思考
单体应用单体应用整个项目代码都在同一个应用工程中,这种方式在早期可以有效提高开发效率,测试、部署和运维也比较方便。少量的开发人员就可以完成所有工作。然而随着业务规模、数据量的不断扩大,单体应用就会出现问题,部署测试效率低下:每次修改了代码需要进行测试验证时必须将整个应用进行编译、打包以及部署,耗费大量时间;后期维护和迭代时开发难度大:单体应用的所有代码都在同一应用中,进行迭代时新需求涉及的...
2018-11-19 10:35:00 444
原创 Spring MVC 根据 controller 层方法入参和返回值动态生成日志 - 下 :借助 SpEL 或自定义的方式解析日志表达式
上一篇文章已经就如何获取到 controller 层方法的参数和返回值进行了详细分析,并且封装了 HandlerMethodPostProcessor 接口以便使用,接下来就实现业务需求:根据 controller 层方法的入参和返回值动态生成日志。实现日志解析实现思路是这样的:定义一个注解,注解的 value 为日志表达式,HandlerMethodPostProcessor#postPro...
2018-11-16 16:55:13 930
原创 Spring MVC 根据 controller 层方法入参和返回值动态生成日志 - 上 :寻找扩展点并进行封装
背景需求是这样的:对网关层指定接口(url)的调用情况做日志记录,日志需要根据 controller 层方法的入参和返回值动态生成。如果只是记录 url 的调用情况可以直接使用 HandlerInterceptor 实现,但需求中需要能够访问入参和返回值,虽然通过拦截器提供的接口也可以解析到请求参数以及返回值,但都需要对这些参数进行一定的处理,因此直接在 Controller 层方法上处理是最...
2018-11-16 16:02:17 1702
原创 Docker 二:IDEA + Docker 插件创建镜像并运行 spring boot 项目
IDEA 上提供了 Docker integration 插件,可以很方便的管理镜像和容器,当然这些操作通过命令行也能完成,使用 IDEA 插件方式的另一个便利在于 IDEA 提供了 Docker 配套的 Configuration,可以一次性定义好操作序列,修改代码或资源后只需 Run/Debug Configuration 即可。接下来直接通过示例项目介绍这些操作。项目结构网关项目:g...
2018-11-16 10:20:26 915
原创 Docker 一:入门
Docker 可以用来打包应用、依赖以及环境到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。docker 两个关键的部分为容器和镜像,这两者的关系可以理解为 OOP 中类和对象的关系,容器作为对象,镜像作为类。Docker 镜像是用于创建 Docker 容器的模板,容器可以独立运行一个或一组应用。参考 这里常用命令从镜像仓库(类似于代码仓库)拉取已有镜像:docker p...
2018-11-14 16:15:36 210
原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 上:原理解析,解析数据源
spring boot 自动装配会通过 spring.datasource.*为我们自动装配数据源,所以想要动态的切换数据源,第一件事是配置数据源,其次是怎么切换?最后何时切换?原理解析(使用 AbstractRoutingDataSource 实现)spring-jdbc 提供了 AbstractRoutingDataSource 在 getConnection() 时通过 lookup k...
2018-11-13 17:16:22 836 1
原创 解析配置文件自动装配 DataSource + AbstractRoutingDataSource + AOP 实现动态数据源 下:配置动态数据源,AOP 进行使用
上篇文章中已经借助 DynamicDataSourceBuilder 类从配置文件中解析得到了默认数据源和动态数据源,接下来需要配置动态数据源的“本体”,并借助 AOP 动态的切换数据源。配置动态数据源AbstractRoutingDataSource 实现了 InitializingBean 接口,在 afterPropertiesSet方法中通过处理 targetDataSources 和...
2018-11-13 17:14:39 674
原创 fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 上:从 DispatcherServlet 出发
背景项目中使用 fastjson 将 spring MVC 返回结果输出为 json 格式数据,有个需求是 null 对象不输出,即前端不会接收到 "obj": null 形式的 json 数据,然而在进行如下的配置后, null 对象始终输出,因此以阅读源码的方式解决该问题。源码分析DispatcherServletDispatcherServlet 是 spring MVC 的入口 ...
2018-11-07 13:21:54 600
原创 fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 下:来到 fasjson 内部,消除疑惑
接上篇:fastjson 始终将 null 对象以 "null " 的形式返回到前端引发的源码解析 - 上:从 DispatcherServlet 出发终于来到了 fastjson 内部。FastJsonHttpMessageConverter内部又调用了一系列的方法,最终定位到了 JavaBeanSerializer#write 的 216 行。在这里 fastjson 与 sprin...
2018-11-07 13:20:02 505
原创 从 HTTPServletRequest 中根据 User-Agent 获取访问设备信息
背景:根据 HttpServletRequest获取访问设备信息。Http 协议请求头中的 User-Agent属性会将客户端设备的信息传递给服务器,这些信息包括客户端操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。参考: 用户代理(User-Agent)然而客户端设备种类、操作系统及其版本繁多,使得 User-Agent 参数的值也有很多种可能。庆幸的...
2018-11-01 18:45:35 15751 2
空空如也
SQLException After end of result set
2017-04-24
线性表出错,找不到原因
2016-03-23
TA创建的收藏夹 TA关注的收藏夹
TA关注的人