- 博客(231)
- 资源 (5)
- 收藏
- 关注
原创 重撸Disconf-client
重撸Disconf-client包背景当前很多配置都在disconf上,迁移到别的配置中心工作量较大原生的disconf-client加载配置的姿势不对:时机过于靠后(BeanFactoryPostProcessor),使用过程中会有很多问题原生的disconf-client不支持多项目公共配置原生的disconf-client代码写得太乱,不便于维护细细去看源代码还会发现更多的问题...
2019-03-04 21:10:41 1172
原创 Tomcat-JDBC源码解析及优化
数据库连接池连接池是常见的一种资源复用的技术。利用连接池,可以将那些创建开销较大的资源汇聚到一个池子里缓存起来,需要使用的时候只需要从连接池里取出来就可以了。中间省去了频繁的创建和销毁的过程。数据库连接池就是其中的典型应用。我们可以简单的思考一下,假设让我们来实现一个数据库连接池,会有哪些问题需要解决?如何保障缓存连接的有效性如何维护连接池中连接的数量我们可以带着上面的两个问题来看看Tomca
2017-11-01 13:41:46 4291
原创 由Cobar引起的Mysql锁问题
使用Cobar将近一年了,但对其原理仍旧不是很了解,更没阅读过源码,说起来也是惭愧。趁着最近线上的一次故障,总算说服自己花时间来看看Cobar的真面目。我们公司对它的印象很差,因为经常出现各种不稳定。比如Cobar在执行一条复杂查询的过程中,同时执行一条普通的selectById都有可能爆出Unsupport Command。线上故障最近的这次线上故障更为严重:因为在底层Mysql层面捕捉到了
2016-12-11 22:23:34 2047
原创 从Consumer分析Dubbo调用链
继上一篇不成熟的源码分析经历之后,为了搞清楚Consumer是如何与Provider通信的,于是又一言不合翻看起了源码。好,进入正题,依旧从RegistryDirectory这个核心类入手:
2016-07-12 13:54:42 15205 4
原创 初识Postman
在开发APP接口的过程中,一般接口写完之后,后端开发都会模拟调用一下请求。在用Postman之前,对于一般的get请求我基本都会用浏览器来简单模拟。而对于post请求,我一般习惯写代码来调用。可以用Java来模拟,当然用Python会更简洁。我们来看看这种方法存在哪些弊端?
2016-06-30 23:34:55 31108 4
原创 由Dubbo路由引发的一言不合就看源码
由于业务上的需要,很早之前就想自己扩展Dubbo的路由功能。But,之前试了一下,发现好像并没有找到正确的打开方式,而且由于时间不是很充足,加上自己心浮气躁浅尝辄止,于是乎就放弃了这块的研究。
2016-06-30 14:37:15 20033 5
原创 Dubbo的正确打开方式之基本接口定义及异常处理
为什么要写这篇文章呢?因为公司在使用Dubbo时并没有对Dubbo的用法做深入的了解,而是属于拿来就用,随着自己的想法来使用。这样很不好,就像天龙八部的鸠摩智练习错误的六脉神剑一样,方式不对,就容易走火入魔。下面是我近来在空闲时间对Dubbo的一些学习,也纠正了之前的一些错误用法,在此做一下记录:接口定义及异常处理Provider和Consumer实际上就是一个服务端和一个客户端的关系。在
2015-11-30 13:26:50 9002 8
原创 C3P0连接池初始化过程分析之二
上一篇我们讲到了C3P0PooledConnectionPool,并且最后说到C3P0PooledConnectionPool中的很多关于连接的操作都委托给了BasicResourcePool来处理,那么下面就隆重请出今天的主角——BasicResourcePool及其帮手——BasicResourcePoolManager。不过写了半天觉得BasicResourcePoolManager的结构和
2015-11-27 15:25:16 4140
原创 记一次使用Cobar踩到的坑
起因起因是因为日志里经常报出锁等待超时的错误,并且这个是环环相扣的,一个锁等待会直接引发另外的锁等待,所以危害非常严重,影响非常深远。寻找原因发现是C3P0报出了DEADLOCK,如下图所示: 分析可以看出来ScatteredAcquireTask,也就是获取连接的任务,全部卡在那不动了。那显然是无法获取新的数据库连接了。正好前一天刚刚进行过架构上的调整——从应用直连Mysql变化到中间添加了一层
2015-11-16 07:40:20 4348 2
原创 C3P0连接池初始化过程分析之一
先把上一节的时序图拿来,强化一下印象,然后顺着图往下捋:Created with Raphaël 2.1.0C3P0连接池初始化过程UserUserComboPooledDataSourceComboPooledDataSourceC3P0PooledConnectionPoolManagerC3P0PooledConnectionPoolManagerC3P0PooledConnecti
2015-10-25 01:45:29 6850
原创 C3P0整体类结构简单分析2
上一篇结构分析我们看了C3P0大概的类图结构,下面我们来看看C3P0连接池初始化的时序图:Created with Raphaël 2.1.0C3P0连接池初始化过程UserUserComboPooledDataSourceComboPooledDataSourceC3P0PooledConnectionPoolManagerC3P0PooledConnectionPoolManagerC3P0Po
2015-10-24 23:28:06 3467
原创 C3P0整体类结构简单分析
直接进入主题吧: 这张图只是C3P0的部分结构类图,不急,先对总体上有一个了解。首先我们需要了解,C3P0是“懒初始化”的。也就是说它并不会自己初始化,而是会等到第一个连接请求进来之后它才会初始化。而那个触发点就是:ComboPooledDataSource.getConnection();了解上面说的“懒初始化”之后,我们来介绍C3P0中几个主要的类:ComboPooledDataSource:
2015-10-18 22:47:09 6355
原创 Spring中实现多数据源事务管理
Spring中实现多数据源事务管理前言由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避免的问题,这也让我对@Transactional注解有了进一步的理解(但实际上也并不是非常深入)然而这是一个演进的过程,刚开始项目中并没有使用@Transactional指定具体的TransactionManager,所以新增一个数据源后,对原有的事务产生了影响了,这
2015-07-25 20:26:43 31621 16
原创 如何在Spring中取得Request对象
这里首先需要说明一点的是,下面讲的获取Request对象都是在非Controller层中进行的操作。因为对于Controller来说,若要用到Request对象的话,直接在方法签名中声明一个HttpServletRequest对象就可以了。另外作为一个良好的Controller-Service-Dao架构,HttpServletRequest对象也不应该出现在Service层或Dao层中,那么其实也
2015-06-05 16:08:37 4825 1
原创 MyBatis Generator常用配置说明
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd
2015-05-20 23:00:52 7469
原创 用一个切面来统一返回前端的JSON格式
新项目使用Spring MVC + MyBatis架构来做,这套框架自己应该比较得心应手,这里来写一下这两天做的一些设计。首先是静态资源的处理,关于这个之前有写文章单独讲过,这里不再重复写,不太清楚的童鞋可以移步查看接着需要统一JSON的返回格式,和前端工程师约定,对于字符串类型和日期类型都返回字符串,而对于普通数字类型的话都返回数字,金额类数字都返回格式化好的保留一位小数的字符串(比如”10.0”
2015-05-19 22:52:49 7073
翻译 Spring官方文档——日志
2.3.2 Logging日志对于Spring来说非常重要(废话,日志对哪个系统不重要?),因为 a)它是唯一强制的外部依赖,b)每个人都希望在使用某个工具时可以看到一些提示性的输出,c)Spring继承了很多别的工具,它们也都有自己的日志依赖。应用开发者的一个目标通常是:对于整个应用来说(包括所有的外部组件),集中创建一个统一的日志配置。由于现在有如此多的日志框架,这个选择看起来会变得更难。
2015-05-11 01:44:18 3543 2
原创 How Tomcat Works读书笔记2
我们回顾一下,第一章实现的Web服务器类图大致如下: 其中HttpServer中的await()方法会使用一个ServerSocket来监听8080端口,用来接收客户端的请求。当接收到用户请求后会创建一个Socket对象,通过与Socket关联的InputStream来创建并填充一个Request对象(这里只是简单的填充了Uri)。然后用Socket关联的OutputStream创建一个Respo
2015-04-17 00:29:21 1507
原创 探讨在项目中如何处理错误信息
一个项目中肯定需要处理各种各样的错误。而对于这些错误,一方面需要程序反应出这些错误并可以让程序员快速地 定位到,另一方面,在发生某些错误时需要给用户适当的错误提示。比如某个请求的方法是public User getUserInfo(String userId)此时请求参数userId为null,我在项目中会这么做public User getUserInfo(String userId){
2015-04-16 22:48:47 1614
原创 How Tomcat Works读书笔记1
一个Servlet容器要为一个Servlet请求提供服务,基本上有三件事要做:创建一个request对象并填充那些有可能被关联的Servlet使用的信息,如参数、头部、cookies、查询字符串、URI等等。一个request对象是 javax.servlet.ServletRequest或 javax.servlet.http.ServletRequest接口的一个实例。创建一个response
2015-03-30 23:44:43 1166
原创 easyui中layout、accordion加tabs实现简单菜单布局实例
一般对于后台界面都是采用BorderLayout进行布局的。BorderLayout也就是将界面分成五块,如下图所示,分别有:North、East、South、West、Center其中比较特殊的是Center这块区域,它是不固定的,会随着四块区域的变化而做出相应的调整。比如将West向左缩小10px,那么Center则会向West方向扩张10px。其实这个easyUI已经帮我们实现好了,我们只需要
2015-03-15 23:38:12 8734 2
原创 ShiroFilterFactoryBean源码及拦截原理深入分析
Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端控制器,其是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作。而要在Spring中使用Shiro的话,可在web.xml中配置一个DelegatingFil
2015-03-12 11:01:56 31932 17
原创 Spring中集成Shiro授权实例
授权流程回顾首先说一句,使用授权的前提当然是先要实现身份验证,也就是要保证用户登录之后才可能考虑授权的问题。关于身份验证之前已经写过了,还不清楚的童鞋可以点这里上一篇文章介绍了Shiro中授权的一些基础知识和原理。学了就要用,本篇文章就介绍如何在项目中应用Shiro的授权。这里为了方便大家阅读,先贴出上一篇文章中分析出的授权流程:当我们调用Subject.hasRole(...)后首先会委托给s
2015-03-08 16:20:38 3057 1
原创 HashMap源码分析(基于JDK1.6)
源码分析要分析HashMap,先来回顾一下数据结构中的哈希表。什么是哈希表?是根据关键码值(Key)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫哈希表。 比如关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为哈希函数,按这个思想建立的表为散列表(哈希表
2015-03-06 17:23:16 1517
原创 ArrayList源码分析(基于JDK1.6)
最近可能要跳槽,想把Java基础再巩固一下。就先看集合框架吧。 先从构造方法开始: public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity:
2015-03-05 14:21:53 1150
原创 Shiro处理SSL连接
Shiro内置了SslFilter用来处理需要使用SSL连接的请求。对需要使用SSL连接的URL配置SslFilter,那么该请求就会变为”https”协议。生成公钥和私钥首先,在命令行中输入“keytool –genkey”将自动使用默认的算法生成公钥和私钥,并以交互方式获得公钥持有者的信息。其交互过程如下 : D:>keytool -genkey -keystore “D:\mykey.k
2015-03-04 14:05:10 5172
原创 Shiro简单授权原理分析
Shiro授权简介Shiro授权简单来说分为两种类型:粗粒度的:也就是代码中直接写入和角色的绑定。细粒度的:代码中写入的是和权限的绑定,而角色到权限和可配置的。对于粗粒度来说,若角色对应权限有改变的话,那么则需要更改代码,很不方便。而细粒度的好处显而易见,所以一般项目中应该都采用细粒度的权限配置。源码及流程分析那么Shiro中是如何来完成权限检验的呢? 通过调用Subject.hasRole
2015-03-03 13:00:30 4009
原创 easyUI重绘combobox中下拉箭头
下午群里一个朋友问了我一个问题,她行要重绘combobox的下拉箭头。我当时第一想法就是让她把原生的图标替换不就好了嘛。可人家又说,要单选和多选的下拉箭头图标是不一样的。一段时间没用也不知道easyUI有没有给combobox开这个口子的,于是看了看文档,发现没有。那么看样子只能看源码咯,不过combo没有源码,只有变态的“_1,_2”命名的版本:if(_4.hasDownArrow){ _
2015-03-02 17:26:48 5937
原创 Shiro处理简单的身份验证的分析及实例
在两天在看Shiro,开涛兄的教程还是写的比较易读,差不多看了一天吧,就准备拿来用了。 可能是想的太简单了,在用的时候确实碰到一些问题,就拿最简单的身份验证来说吧: 需要说明的是,这里是集成在Spring中使用,身份验证我直接使用了Shiro提供的 org.apache.shiro.web.filter.authc.FormAuthenticationFilter如果url应用了该拦截器,
2015-03-02 10:12:09 9600 1
原创 Spring MVC初始化部分源码分析
首先定位到org.springframework.context.support.AbstractApplicationContext中的refresh()方法:public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor)
2015-02-27 14:50:09 1660
原创 <mvc:resources />标签新老版本解析不同,是bug还是?
先来说说这个坑爹的问题,其实本来我是没注意到的,因为程序跑起来一切都正常。但是在tomcat启动时飞速打印log时,在中间“隐藏”了一个错误:2015-02-15 16:03:22 [ catalina-exec-4:2202 ] - [ DEBUG ] [org.springframework.beans.TypeConverterDelegate] Original ConversionServ
2015-02-15 17:24:58 9616 10
原创 使用tomcat maven插件过程中的一些问题
使用tomcat maven插件过程中的一些问题tomcat7-maven-plugin中部分日志会丢失? 使用的版本是2.2,打印不出MyBatis Mapper中的log,也就是无法跟踪SQL,切换到tomcat6-maven-plugin就可以了。不知道为何,猜想可能是无法输出动态代理类中的log?或者是哪里可以配置?有知道的朋友希望可以留言告之~tomcat maven插件远程部署注意
2015-02-12 10:45:19 2517
原创 MyBatis Generator如何Generate
MyBatis Generator如何Generate[MyBatis Generator][6]是一个自动生成代码的工具,可以生成基本的数据表对应的实体对象以及对对象基本操作的dao层,今天介绍如何利用Maven来使用[MyBatis Generator][6],猴急的童鞋可以拖到最后看完整的示例代码。Maven Goal and Execution如下是在pom.xml中最简配置: <proje
2015-02-06 16:30:45 8548
cobar-server-1.2.7-seprate-commit
2016-12-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人