比如分页插件:pagehelper
可以大幅度提升我们的开发效率。
需求
数据库中敏感字段的对称加密,或者诸如密码之类的非对称加密。
其实都可以不是在一次次的代码查询和更新中手动实现,可以通过自定义注解来实现。
设计思路
-
利用注解标明需要加密解密的entity类对象以及其中的数据
-
mybatis拦截Executor.class对象中的query,update方法
-
在方法执行前对parameter进行加密解密,在拦截器执行后,解密返回的结果
比如分页插件:pagehelper
可以大幅度提升我们的开发效率。
数据库中敏感字段的对称加密,或者诸如密码之类的非对称加密。
其实都可以不是在一次次的代码查询和更新中手动实现,可以通过自定义注解来实现。
利用注解标明需要加密解密的entity类对象以及其中的数据
mybatis拦截Executor.class对象中的query,update方法
在方法执行前对parameter进行加密解密,在拦截器执行后,解密返回的结果
我觉得这些问题提的非常好,其实不看本篇解答,直接根据问题的角度去学习就足够了。
带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助。
CMS出现的初衷、背景和目的?
CMS的适用场景?
CMS的trade-off是什么?优势、劣势和代价
CMS会回收哪个区域的对象?
CMS的GC Roots包括那些对象?
CMS的过程?
CMS和Full gc是不是一回事?
最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题。
总体来讲,对于G1我有几个疑惑,希望能够在这篇文章中得到解决。
G1出现的初衷是什么?
G1适合在什么场景下使用?
G1的trade-off是什么?
G1的详细过程?
如何理解G1的gc日志?
G1的调优思路?
什么是 serial gc
解决了什么问题?优缺点是什么
常见的使用场景。 最佳实践
实现的方式,gc流程
gc 日志怎么看,怎么调优
个人的启发+知识迁移
产线一个问题:业务系统调用后台超时,问是不是 FULL GC 的问题。
···
locate xxx.log
···
cat /XXX/gc.log | grep -a 'Full'| more
Netty-快速开始 演示了一个丢弃版本的 Netty 入门案例。
现在我们来看一个 Echo 版本的例子。
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
/**
* 自定义的服务端类
* 1. 注解标识可以被多个 channel 安全的共享。
* @author binbin.hou
* @date 2019/3/31
* @since v1
*/
@ChannelHandler.Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
/**
* 信息读取
* @param ctx 上下文
* @param msg 消息
* @throws Exception if any
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf byteBuf = (ByteBuf)msg;
final String string = byteBuf.toString(CharsetUtil.UTF_8);
System.out.println("Echo server received: " + string);
// 将接收到的消息,写给发送者
ctx.write(byteBuf);
}
/**
* 消息读取完成
* @param ctx 上下文
* @throws Exception if any
*/
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
//将未处理的消息冲刷到远程
// 关闭当前 channel
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
.addListener(ChannelFutureListener.CLOSE);
}
/**
* 异常处理
* 1. 处理异常消息
* 2. 关闭 channel
* @param ctx 上下文
* @param cause 原因
* @throws Exception if any
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.err.println("异常原因:" + cause.getMessage());
ctx.close();
}
}