自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 mybatis 如何获取sql并设置值

目录初始化阶段构造MixedSqlNode解析标签构造SqlNode例子阶段总结1构造SqlSource阶段总结2在JDBC用PreparedStatement编程访问数据库时,都需要先用带有占位符(如果存在参数的话)sql创建PreparedStatement,然后在根据数据库类型设置值。这块在mybatis是如何实现的呢。初始化阶段构造MixedSqlNode解析标签具体的sql解析是在解析mapper.xml的四种标签select|insert|up

2022-02-11 14:18:56 2295

原创 mybatis 连接池实现

目录配置解析阶段总结1:执行获取连接阶段总结2:其他参数driver、url、username、passwordmybatis封装了jdbc的加载驱动和建立连接,并把连接池化以保证高效率访问数据库。配置一般用mybatis时,我们只需如下配置即可<environments default="development"> <environment id="development"> <transactionManag

2022-01-25 16:55:49 1305

原创 从jdbc角度看mybatis

mybatis是半ORM框架,是对jdbc的半封装,即保证了sql的灵活性,又简化的开发步骤。以一个jdbc操作数据库为例try{ //1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.连接数据库 String url = "jdbc:mysql://localhost:3306/test"; String userName="root"; String password="

2022-01-25 10:16:30 976

原创 mysql预编译

最近在看mybatis源码,其底层都是用的PreparedStatement进行操作数据库。所以问了自己几个问题,发现不太明了,在网上搜了很多也没有具体的说明。最后跟源码把疑惑整明白了。问题1:为什么要用PreparedStatement进行操作数据库答:因为PreparedStatement预编译可以防止SQL注入。以上答案是错误的。PreparedStatement的防止SQL注入是因为对传递的参数中的特殊字符进行转义,并在参数的前后加上单引号,把整体作为一个字符串,然后和PreparedS

2022-01-14 17:11:47 532

原创 web服务和netty不能一起使用?

web服务和netty不能一起使用?当然是可以一起的,本篇文章介绍在落地这一需求时所遇到的两个问题以及原因和解决方法

2021-06-22 14:38:21 1278

原创 mybatis-plus多数据源配置

数据源1@Configuration@MapperScan(basePackages = "com.xx.mapper",sqlSessionFactoryRef = "db1SqlSessionFactory")public class DataSourceDb1Config { private static final String MAPPER_LOCAL = "classpath:com/xx/xx/mapper/xml/*.xml"; @ConfigurationPr

2020-08-04 17:00:53 2429 3

原创 spring @DependsOn 实现@Value动态刷新

@DependsOn注解可以控制bean的加载顺序当A依赖B时,因为并不知道A与B谁先优先加载,可以再A类上添加次注解去依赖B这时当先加载了B 时,会实例化B并且注入属性,但是B中的Bean并不会加载。例子:实现@Value属性注入从数据库加载的数据。1、从数据库拿配置@Configurationpublic class DbConfig { /** * 这个就是查询service */ @Autowired private DbSe.

2020-07-06 15:53:18 1787

原创 vmware centos7 设置静态IP

1.在vmware菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择NAT网络连接方式,设置子网IP,点击NAT设置页面,设置如图。2、设置本机的VMnet8,子网掩码和网关和第一步一致3、设置vmware用vmnet84、进入linux系统配置固定ipvi /etc/sysconfig/network-scripts/ifcfg-ens33网关配置和第一步一致关闭防火墙:systemctl stop firewalld.servi..

2020-06-22 16:49:36 240

转载 @Value的用法 @Value数据来源 @Value动态刷新的问题

从用法和底层梳理,比较详细。原链接地址总结下编程思想:无论何种介质的配置,加载到本地后封装好,在初始化bean时碰到@Value注解去封装好的类中去解析得到key对应的value,赋值到类的属性。动态刷新时,碰到需要动态刷新的类,直接重新实例化该类就可以了(重新走下@Value解析流程)...

2020-05-20 17:23:39 5198

原创 tomcat三大参数max-threads,accept-count,max-connections

max-threads 最大工作线程数当有请求到达tomcat是,会构建一个线程去处理这个请求,最多只允许max-threads线程数同时处理请求max-connections 最大连接数tomcat在同一时刻允许max-connections个连接数链接tomcataccept-count 接收数量当tomcat同一时刻已经有max-connections个链接了,再有新的...

2019-12-13 14:16:32 1777

原创 TX-LCN分布式事务框架源码解析(基于lcn模式下的异常流程源码分析)

前一篇文章我们讲了lcn模式下的正常流程是如何运作的。这篇讲下在发生异常时框架是怎么进行回滚的,同样调用链还是A>B>C正常流程图是这样的,前一个模块的doBusinessCode执行的是后一个模块的所有逻辑。我们从后向前看C模块的所有的代码执行都在B模块的doBusinessCode方法中。B模块的代码执行都在A模块的doBusinessCode方法中。C模块...

2019-07-02 15:27:01 3316 1

原创 TX-LCN分布式事务框架源码解析(基于lcn模式下的正常流程源码分析)

TX-LCN中的LCN模式是通过代理数据库连接进而对事物进行控制的。通过静态代理的方式包装的原本来的connection,设置为手动提交,根据事物状态控制提交与回滚。所以如果用LCN模式的分布式事务,必须有本地连接,即要操作本地数据库。(当然也可以多种模式混合使用)代理连接如下,state为事务状态,1为分布式事务成功本地链接提交,其他为失败进行本地链接回滚public class ...

2019-06-28 14:32:37 4014 3

原创 TX-LCN分布式事务框架源码解析(客户端-@EnableDistributedTransaction执行流程)

有了前面服务端的基础,客户端代码比较好理解,在一些方面代码是一样的。我们从注解@EnableDistributedTransaction开始,这个注解是开启事物客户端的唯一注解。@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(value = {TCAutoConfigura...

2019-06-18 10:57:39 4532

原创 TX-LCN分布式事务框架源码解析(服务端-5-TxLcnInitializer初始化之TMAutoCluster)

最后一个TxLcnInitializer。TMAutoCluster从名称上看是自动集群,当我们启动一个新的服务端时,不用额外的配置也不需要重新启动客户端。所有的客户端都会感知到新的服务端并且与之链接。整体的逻辑是这样的,如果启动一个服务端A,启动时这个A会把自己的信息存入redis的hash中,hash为tm.instances,hk为host:TransactionPort,hv为Ht...

2019-06-17 10:18:41 580

原创 TX-LCN分布式事务框架源码解析(服务端-4-TxLcnInitializer初始化之RpcNettyInitializer)

这个内容很少,但是前面都分开写了这里就为它写一篇public void init() throws Exception { RpcCmdContext.getInstance().setRpcConfig(rpcConfig); SocketManager.getInstance().setRpcConfig(rpcConfig); }主要就是Rp...

2019-06-14 13:49:11 387

原创 TX-LCN分布式事务框架源码解析(服务端-3-TxLcnInitializer初始化之EnsureIdGenEngine)

上篇讲了TMRpcServer的init方法,按照执行顺序接下来的TxLcnInitializer类是EnsureIdGenEngine这是一个id生成器类,用来生成机器id号下面看init方法public void init() throws Exception { managerConfig.applyMachineId(managerService.machin...

2019-06-14 13:41:20 604

原创 TX-LCN分布式事务框架源码解析(服务端-2-TxLcnInitializer初始化之TMRpcServer)

上篇文章我们通过注解@EnableTransactionManagerServer了解了服务端的启动初始化流程。最重要的TxLcnInitializer#init我们在本篇文章详细说明先看下服务端实现了TxLcnInitializer接口的类有哪些一共有五个实现类分别是EnsureIdGenEngine类,用于处理和生成全局唯一idMysqlLoggerHelper类,用于记录...

2019-06-13 15:56:24 1547 1

原创 netty 中 IdleStateHandler

IdleStateHandler 空闲状态处理器,是用来检测当前Handler的ChannelRead()的空闲时间。构造方法如下public IdleStateHandler( long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit) { ...

2019-06-05 15:46:08 799

原创 netty 中LengthFieldPrepender与LengthFieldBasedFrameDecoder

这两个类通常一起使用来解决半包与粘包的问题LengthFieldPrepender编码器作用:将当前发送消息的二进制字节长度,添加到缓冲区头部;这样消息就有了固定长度,长度存储在缓冲头中构造方法public LengthFieldPrepender(int lengthFieldLength, boolean lengthIncludesLengthFieldLength) {...

2019-06-05 10:44:26 2318 2

原创 TX-LCN分布式事务框架源码解析(服务端-1-@EnableTransactionManagerServer执行流程)

前面的代理都是为了写源码做铺垫的,因为LCN模式就是用的静态代理,采用对数据库连接的代理来完成分布式事务的。首先看我们的服务端,前面在例子中已经把服务端和客户端的代码都贴出来了,服务端很简单,只需要一个注解就能开启分布式事务服务端功能。注解@EnableTransactionManagerServer@Retention(RetentionPolicy.RUNTIME)@Ta...

2019-05-27 15:27:09 1612

原创 Spring Aop 动态代理详解(jdk与cglib)

前面通过四篇文章讲了代理包括静态代理,jdk动态代理,cglib动态代理,jdk与cglib动态代理比较,比较详细的了解了两者的用法以及源码,知道了两者的机制,接下来我们要分析的spring aop 算是一个动态代理的具体例子,实际去看看动态代理是如何使用的本文的目标1、spring aop在什么情况下使用jdk动态代理,什么时候使用cglib动态代理2、增强逻辑是如何生成的例...

2019-05-17 14:01:05 916

原创 代理详解(cglib动态代理与jdk动态代理比较)

类型 机制 回调方式 使用场景 效率 jdk动态代理 代理类和目标类都实现了同样的接口,InvocationHandler持有目标类,代理类委托InvocationHandler去调用目标类的原始方法 反射 目标类是接口类,适用于需重复创建对象(非单例) 效率瓶颈在反射调用稍慢,创建类速度快 cglib动态代理 继承机制,代理类继承了目...

2019-05-08 09:30:33 510

原创 代理详解(cglib动态代理-源码分析)

上篇文章讲完了jdk的动态代理,基本上对jdk动态代理的原理有了基本认识,比如按class结构填充class文件,通过反射调用方法等。但是jdk有一些问题,比如必须要实现接口,对类的直接代理无法完成,cglib就解决了此类问题,允许直接对类进行代理。废话不多说先上代码,对类的代理。被代理类public class HelloImplClass implements Hello{ ...

2019-05-07 16:25:04 778

原创 代理详解(jdk动态代理-源码分析)

上篇文章我们简单看了下jdk动态代理的例子代理详情(jdk动态代理),我们通过Proxy类的静态方法newProxyInstance方法去生成一个代理类,这个静态方法接收三个参数,分别是目标类的类加载器,目标类实现的接口集合,InvocationHandler实例,最后返回一个Object类型的代理类。我们先从该方法开始,看看代理类是怎样一步一步造出来的,废话不多说,直接上代码public ...

2019-05-05 11:24:35 387

原创 代理详解(jdk动态代理)

上篇讲解了静态代理代理详解(静态代理),暴露出静态代理的一些问题,比如需要自己手写代理类,对不同的接口实现类代理,需要创建多个代理类,jdk动态代理解决了上述问题。1、jdk动态代理接口Hellopublic interface Hello { void sayHello(String name);}实现类HelloImplpublic class HelloI...

2019-04-29 14:01:38 199

原创 代理详解(静态代理)

最近在看TX-LCN分布式事务源码,看到用到了静态代理就打算把java中的代理搞一下。静态代理接口Hellopublic interface Hello { void sayHello(String name);}实现类HelloImplpublic class HelloImpl implements Hello { public void sayH...

2019-04-29 13:14:50 364

原创 TX-LCN分布式事务框架应用与解析-2例子

简单的看下例子:采用spring boot ,需要redis,mysql,zookeeper(我们是用的这个做注册中心,可以换成其他的),详细见官网。manager工程用于协调分布式服务启动类加上注解@EnableTransactionManagerServer@SpringBootApplication@EnableTransactionManagerServerpubli...

2019-04-24 16:33:38 1370

原创 TX-LCN分布式事务框架应用与解析-1实际生产事故

公司最近正在做微服务拆分,有一个需求是这样的,要单独开发一个服务,所有公司用到的用户部分,都由其负责创建、修改;比如原来有A,B两个系统,每个系统都有用户注册与修改,现在要新开发一个系统C,把A,B两个系统的用户注册与修改内容都单独出来放到C中,C有用户表,C也可以登录。但是A,B两个系统的用户表还是存在的,只是创建与修改都由C系统去调用A,B的接口,以到达数据的同步。这其中涉及到分布式事务的问题...

2019-04-24 15:17:20 671

转载 多层nginx 实现获取客户端ip

参考文章使用nginx之后,在web应用端获取用户的真实ip地址

2019-03-18 14:28:27 375

原创 nginx安装 及hello world

(1)部署openrestymkdir -p /usr/servers cd /usr/servers/yum install -y readline-devel pcre-devel openssl-devel gccwget http://openresty.org/download/ngx_openresty-1.7.7.2.tar.gz tar -xzvf ngx_op...

2019-03-14 22:27:12 114

原创 nginx+lua+redis 灰度发布实现方案

背景:公司要把现有的某传统项目进行微服务化,拆分后要分批次预发布,实现某部分用户使用微服务模块,其他用户使用传统项目。待微服务稳定、无bug后全部用户迁移至微服务系统。以上为背景,实现此方案使用nginx+lua+redis 灰度发布方案。nginx+lua实现反向代理,获取客户端ip;redis存放ip信息(ip为访问微服务允许的地址)。有两种方案可以实现第一种:nginx+lua获...

2019-03-14 22:20:26 4164

原创 领扣刷题之两数之和!

描述给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。假设只有一个答案!原来做过类似的题,但是和上题有些许差别,给定的数组是递增序列,采用双指针的方法就可以解决。在看到此题时还是按照原来的思路做的:数组先去排序,当然原来的数组也要保留,然...

2019-02-01 10:34:47 483

原创 spring4.2.9 java项目环境下ioc源码分析 (十五)——refresh之registerListeners方法

注册监听器,与广播器是同时存在的。在广播器章节,spring只是初始化的广播器,但是并没有为广播器绑定Listener。Spring在此方法中进行了绑定。下面看代码protected void registerListeners() { // 和手动注册BeanPostProcess一样,可以自己通过set手动注册监听器 for (ApplicationListener&lt;?&gt; ...

2018-05-08 09:49:39 1400 1

原创 spring4.2.9 java项目环境下ioc源码分析 (十四)——refresh之onRefresh方法

这个方法是空的。解释是在特定的上下文中初始化特别的beans。可以看到其也是用于初始化的。看了StaticWebApplicationContext、AbstractRefreshableWebApplicationContext、GenericWebApplicationContext的实现都是一样的代码用于初始化主题。略过。。。。。...

2018-05-07 16:27:25 1095

原创 spring4.2.9 java项目环境下ioc源码分析 (十三)——refresh之initApplicationEventMulticaster方法

初始化应用事件广播器。这事观察者模式得典型应用。我们知道观察者模式由主题Subject和Observer组成。广播器相当于主题Subject,其包含多个监听器。当主题发生变化时会通知所有得监听器。代码很简单protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory ...

2018-05-07 16:17:44 1462

原创 spring4.2.9 java项目环境下ioc源码分析 (十二)——refresh之initMessageSource方法

国际化。。。。,我估计写的应用也不会出国了,不讲了。。。。

2018-05-02 15:02:27 424

原创 spring4.2.9 java项目环境下ioc源码分析 (十一)——refresh之registerBeanPostProcessors方法

接上篇文章,registerBeanPostProcessors从名称可以看出是用来注册BeanPostProcessor的。在讲解这个方法之前先看下什么是BeanPostProcessor,下面是BeanPostProcessor的代码,可以看出只有两个方法。public interface BeanPostProcessor { Object postProcessBeforeInitia...

2018-05-02 13:54:21 1724 2

原创 spring4.2.9 java项目环境下ioc源码分析 (十)——refresh之invokeBeanFactoryPostProcessors方法

invokeBeanFactoryPostProcessors执行BeanFactory后置处理器,当然前提是你已经在容器中注册过此处理器了。protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate...

2018-04-28 16:14:22 1739 2

原创 spring4.2.9 java项目环境下ioc源码分析 (九)——refresh之postProcessBeanFactory方法

postProcessBeanFactory后处理beanFactory。时机是在所有的beanDenifition加载完成之后,bean实例化之前执行。比如,在beanfactory加载完成所有的bean后,想修改其中某个bean的定义,或者对beanFactory做一些其他的配置,就可以用此方法。在系列文章中,可以实现ClassPathXmlApplicationContext类并重写post...

2018-04-28 13:49:46 3352

原创 spring4.2.9 java项目环境下ioc源码分析(八)——refresh之prepareBeanFactory方法

在完成解析,把所有的BeanDenifition注册到bean工厂完成后,开始执行prepareBeanFactory方法。这个方法是配置工厂的标准上下文特征。具体看代码 protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //设置beanFactory的classLoader为当前c...

2018-04-28 10:45:37 1013

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除