spring boot cache踩到的坑

这周在做线上查询优化的时候,用到了spring boot cache,结果就踩到了坑里,追查了好久最终发现了问题。这次使用的是spring boot cache 和 Ehcache. 不得不说,spring boot的注解式的使用cache非常方便,只需要在方法或者类上面加一个注解,这个方法就被增加了缓存,你自己根本不需要去if get or null put的逻辑,一起都给你做好了。

继续阅读“spring boot cache踩到的坑”

Hessian的使用

hessian主要是用来做序列化和反序列化的,序列化后的对象可以存储(文件或者数据库中),需要使用的时候,再将它反序列化得到对象。常用的序列化协议有人也能看懂的json,Google的protoBuf以及hessian等等。今天要介绍的就是hessian的用法。
一、当然是他的主功能,序列化,我们新建一个对象,然后将这个对象序列化之后存储到文件,然后再从文件中读取序列化后的数据,通过hessian反序列化成对象。代码如

继续阅读“Hessian的使用”

通过文件覆盖类里面的属性–一种配置文件的另类实现方式

背景: 假设有这么一个场景,你写的jar包或者源代码服务提供给别人使用,你的默认配置是写在类里面的,如何通过一个ini文件来修改你写在类里面的配置呢? 毕竟用户不应该去修改你的代码,而是仅仅通过文件配置来实现配置的修改。

在一般的框架层面,系统已经支持的很好,例如spring boot的application.properties就是做这个事情的。另外,maven的插件也可以实现antx.properties的动态替换,下面我们用Java的反射手工的实现这么一个功能。

继续阅读“通过文件覆盖类里面的属性–一种配置文件的另类实现方式”

如何通过spring-boot-starter-redis使用aliyun的Redis

我有一个项目,使用的是spring boot构建,整个系统使用spring security构建了一个登录系统,关于spring boot security 如何使用,这里就不介绍了,这里只描述如何解决我遇到的问题。

背景 : spring boot + spring security 构建的登陆系统,只能满足单机的需求,如果程序部署在集群之上,那么就涉及到了session的共享问题,否则你的用户就会显示一会登陆,一会又没登陆(落到了另外一台机器)。核心思想是通过redis来在集群之间共享用户的session,实现这样的方案有两种方法。

 

继续阅读“如何通过spring-boot-starter-redis使用aliyun的Redis”

Mybatis获取最近插入的主键

通常情况下,我们插入一条记录的mapper如下:


    @Insert("insert into experiment_info (gmt_create, gmt_modified, user_id, name, type) values (now(),now(),#{userId},#{name},#{type})")
    int saveExperimentInfo(ExperimentInfoDO infoDO);

 

但是有时候,我们需要拿到这次插入之后生成的主键应该怎么办呢? 其实很简单,只需要一句话就可以完成, 将以上的代码改为如下:

 

    @Insert("insert into experiment_info (gmt_create, gmt_modified, user_id, name, type) values (now(),now(),#{userId},#{name},#{type})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int saveExperimentInfo(ExperimentInfoDO infoDO);

 

 

其中id是默认值,可以省略不写。

还有一种办法是,生成一个主键主动传入。

一次nginx导致的乌龙跨域事件

最近搭建了一个独立应用,使用相同的域名去访问的时候居然报出了"Invalid CORS request", 而且GET请求是好的,唯独POST请求报403 forbidden错误,response是, Invalid CORS request。 真是奇怪啊,明明同一个域名,为什么报跨域的错误呢?

 

继续阅读“一次nginx导致的乌龙跨域事件”

spring boot mybatis的动态SQL

动态sql的用途

如果你的sql语句需要一些逻辑。例如 if (a) { order by status} else {order by id}等情况。 如果没有动态sql的做法是,把if和else的逻辑写到业务逻辑层,然后在你的mapper里写两个方法,分别是getxxxOrderByStatus(); getxxxOrderById(); 这两个方法除了order不一样,其他都是相同的,这就导致了代码重复,维护起来也比较困难。

继续阅读“spring boot mybatis的动态SQL”

如何在Mybatis注解中使用枚举类型

当下我们都在使用spring boot,配合注解的使用,我们彻底抛弃了xml的配置。在使用spring boot mybatis的时候,关于使用spring boot mybatis注解使用的文档却不清不楚。官网大部分的例子和使用都是叫你如何写mapper.xml。很多时候,一些特别的需求关于注解如何实现这个功能都是一句话带过,很多地方连一句话都没有。在使用spring boot mybatis的过程中,我遇到过很多特殊的需求。例如动态sql的使用,通过插件来注入修改用户的sql语句,枚举类型的使用等。很多case当时搞明白了,过了段时间再用又忘记了,去寻找解决方法的时候又没有靠谱答案,所以这里把用过的一些case写一个序列的文章,方便自己和后来者。

继续阅读“如何在Mybatis注解中使用枚举类型”

使用Java原生HttpURLConnection快速的完成一个http请求

通常情况下,我们都使用Apache的HttpClient来发起一个http请求,我们再提供一个思路, 使用Java原生的HttpURLConnection发起一个http请求,示例代码如下:
继续阅读“使用Java原生HttpURLConnection快速的完成一个http请求”

另一种使用Log4j的方式

一般情况下,我们不需要关注log4j的使用,只需要写配置文件就可以实现定制。例如在spring boot的工程中,我们只需要在resource中通过logback.xml文件来配置就可以使用日志系统,但是很多时候,我们需要自我定制日志的配置。例如,我们的程序是一个二方包提供给别人使用的时候,我们该怎么定制我们的二方包的日志呢? 本文要解决的就是这个问题

继续阅读“另一种使用Log4j的方式”