- 浏览: 5696 次
最新评论
文章列表
题外话
使用Cobar将近一年了,但对其原理仍旧不是很了解,更没阅读过源码,说起来也是惭愧。趁着最近线上的一次故障,总算说服自己花时间来看看Cobar的真面目。
我们公司对它的印象很差,因为经常出现各种不稳定。比如Cobar在执行一条复杂查询的过程中,同时执行一条普通的selectById都有可能爆出Unsupport Command。
线上故障
最近的这次线上故障更为严重:因为在底层Mysql层面捕捉到了锁,并且多个session长时间的在等待该锁直到超时(锁超时时间是50s)。此时的Cobar完全就处于一个近似于僵死的状态。当时的场景是一个接口的并发调用,这个并发调用会更新同一个人 ...
- 2016-12-11 22:23
- 浏览 327
- 评论(0)
假设我们想对某一条sql做超时限制,我们可能会采用如下的方式:
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(SpringBootDemoApplication.class, args);
JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate.class);
jdbcTemplate.setQueryTimeout(1);
jdbcTe ...
- 2016-09-19 16:00
- 浏览 286
- 评论(0)
入手
继上一篇不成熟的源码分析经历之后,为了搞清楚Consumer是如何与Provider通信的,于是又一言不合翻看起了源码。好,进入正题,依旧从RegistryDirectory这个核心类入手:
// 这里的入参urls是所有可用的provider的url
private Map<String, Invoker<T>> toInvokers(List<URL> urls) {
Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<Str ...
- 2016-07-12 13:54
- 浏览 322
- 评论(0)
老旧的模拟请求方式
在开发APP接口的过程中,一般接口写完之后,后端开发都会模拟调用一下请求。在用Postman之前,对于一般的get请求我基本都会用浏览器来简单模拟。而对于post请求,我一般习惯写代码来调用。可以用Java来 ...
- 2016-06-30 23:34
- 浏览 365
- 评论(0)
由Router引入
由于业务上的需要,很早之前就想自己扩展Dubbo的路由功能。But,之前试了一下,发现好像并没有找到正确的打开方式,而且由于时间不是很充足,加上自己心浮气躁浅尝辄止,于是乎就放弃了这块的研究。
不过今日,在手头上一块比较忙的事情告一段落了之后,又开始漫漫的research之路。。
好了,下面先来说说之前被困在了什么地方。
首先吐槽一下,官方文档对于这一块的用法写得非常的不全面,只介绍了条件路由的语法,而没有告诉我们怎么样使其生效。当然最简单的一种做法,官方文档上也说了,装个dubbo-admin在其中设置就好了。但是如果是想自定义扩展的话呢?这个时候我们来看看Dev ...
- 2016-06-30 14:37
- 浏览 551
- 评论(0)
为什么要写这篇文章呢?因为公司在使用Dubbo时并没有对Dubbo的用法做深入的了解,而是属于拿来就用,随着自己的想法来使用。这样很不好,就像天龙八部的鸠摩智练习错误的六脉神剑一样,方式不对,就容易走火入魔。下面是我近来在空闲时间对Dubbo的一些学习,也纠正了之前的一些错误用法,在此做一下记录:
接口定义及异常处理
原来错误的做法
先说说最初使用时的做法:
由于Provider和Consumer实际上就是一个服务端和一个客户端的关系。在实际应用当中,和APP直接交互的tomcat服务器就是客户端。那么在我们最初对Dubbo不了解的情况下,就照着APP接口的设计依样画葫芦,定义 ...
- 2015-11-30 13:26
- 浏览 445
- 评论(0)
上一篇我们讲到了C3P0PooledConnectionPool,并且最后说到C3P0PooledConnectionPool中的很多关于连接的操作都委托给了BasicResourcePool来处理,那么下面就隆重请出今天的主角——BasicResourcePool及其帮手——BasicResourcePoolManager。不过写了半天觉得BasicResourcePoolManager的结构和源码太过于复杂,写起博客来压力太大,所以这一篇先来介绍BasicResourcePool中的核心任务。注意,这里只会对这些任务的功能做一个介绍,并介绍会影响任务的各种参数:
核心成员变量
下面 ...
- 2015-11-27 15:25
- 浏览 411
- 评论(0)
起因
起因是因为日志里经常报出锁等待超时的错误,并且这个是环环相扣的,一个锁等待会直接引发另外的锁等待,所以危害非常严重,影响非常深远。寻找原因发现是C3P0报出了DEADLOCK,如下图所示:
分析
可以看出来Scatte ...
- 2015-11-16 07:40
- 浏览 411
- 评论(0)
先把上一节的时序图拿来,强化一下印象,然后顺着图往下捋:
Created with Raphaël 2.1.0C3P0连接池初始化过程UserUser
- 2015-10-25 01:45
- 浏览 344
- 评论(0)
上一篇结构分析我们看了C3P0大概的类图结构,下面我们来看看C3P0连接池初始化的时序图:
Created with Raphaël 2.1.0C3P0连接池初始化过程UserUser
- 2015-10-24 23:28
- 浏览 279
- 评论(0)
直接进入主题吧:
这张图只是C3P0的部分结构类图,不急,先对总体上有一个了解。
首先我们需要了解,C3P0是“懒初始化”的。也就是说它并不会自己初始化,而是会等到第一个连接请求进来之后它才会初始化。而那个触发点就是:
ComboPooledDataSource.getConnection();
了解上面说的“懒初始化”之后,我们来介绍C3P0中几个主要的类:
ComboPooledDataSource
ComboPooledDataSource: 和外界交互的类,主要负责
1. 设置连接池的配置
2. 获取连接
C3P0PooledConnectionPool ...
- 2015-10-18 22:47
- 浏览 295
- 评论(0)
MyEclipse10破解replaceJar一步报错解决方案
前段时间MyEclipse10到期了,于是去找破解。网上倒是有一个给力的破解器——MyEclipse 9.x Crack。不过在按照步骤破解时却意外的报了一个错误:在进行到replaceJar这一步时,按照步骤的说明应该会弹出一个文件选择框,然后选中MyEclipse目录->Common->plugins目录。但是这里却无法弹出文件选择器,此时查看控制台会发现错误信息:
似乎和操作系统有关?
看看按下replaceJar按钮后的处理代码:
JFileChooser jf = new JFi ...
- 2015-10-06 10:26
- 浏览 594
- 评论(0)
Spring中实现多数据源事务管理
前言
由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避免的问题,这也让我对@Transactional注解有了进一步的理解(但实际上也并不是非 ...
- 2015-07-25 20:26
- 浏览 1066
- 评论(0)