综合设计
xieyu_zy
互联网攻城狮,DB方面的Java开发工作,多面手,做过传统行业开发,做过DBA,开发,技术管理,项目管理,产品管理,经过几年磨练,自认为算是高级泥水匠。技术上个人自认为擅长java相关核心技术,如JVM,JUC,JDBC,连接池,Java ByteCode,Java OOD设计,代码调优。擅长数据库应用技术Oracle及MySQL,擅长分布式存储架构分布式计算,善于常见问题诊断和系统调优。
展开
-
Spring事务对所有方法全局开启的潜在问题
Spring 事务管理器基于AOP切入方法来实现的,开发人员可以使用XML配置,也可以使用Annotation来标记具体的方法,可能有的开发人员为了简单省事,就讲AOP切入的方法定义成所有方法,那么写代码就简单了,这样做到底有没有问题呢?肯定有,有兴趣的开发者可以一起探讨下:应用于DB之间的通信次数增加了几次,1次?2次?3次?....增加事务操作后,通信次数自然会变多,通信次数变多...原创 2020-03-26 09:55:44 · 1619 阅读 · 0 评论 -
多地区部署唯一自增ID的实现方法探讨
这是一个偏于技术和业务之间的解决方法,解决问题的手法有很多,也就是在同一个应用在全球部署的时候,当一个系统在全球多个地区部署的时候,由于服务的业务和当地监管机构的要求,通常在数据层面有几种可能性:1、数据彼此隔离,不存在相互迁移的问题。2、以其中个别节点为写中心(通常1~3个),然后同步至全球其他站点,这类通常为配置数据或部分需要共享的基础数据,在不违背监管需求的前提下,放在一个法...原创 2019-12-09 15:01:17 · 1003 阅读 · 0 评论 -
J.U.C系列-线程安全的理论讲解
引文:在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首先要确保可见性,也就是要在这个基础上才能做到,而CAS也是基于这种原理来完成,我们在文章:Java JUC之Atomic系列12大类实例讲解和原理分解 中关于Atomic的介绍中有提到通过unsafe调用底层的compareAndSwapXXX的三个方法,都是基于可见性变量才会有效。 谈到可见性,原创 2013-03-05 10:35:56 · 7232 阅读 · 14 评论 -
Java线程池架构原理和源码解析(ThreadPoolExecutor)
在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:《java之JUC系列-外部Tools》中第一部分有详细的说明,请参阅;文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,原创 2013-03-25 20:18:24 · 30161 阅读 · 36 评论 -
Timer与TimerTask的真正原理&使用介绍
其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:Timer timer = new Timer();timer.schedule(new TimerTask() { public void run() { System.out.println("abc"); }}, 200原创 2013-02-24 18:23:02 · 59957 阅读 · 10 评论 -
java之JUC系列-外部Tools-Executors|Semaphor|Exchanger|CyclicBarrier|CountDownLatch
前面写了两篇JDBC源码的文章,自己都觉得有点枯燥,先插一段JUC系列的文章来换换胃口,前面有文章大概介绍过J U C包含的东西,JUC体系包含的内容也是非常的多,不是一两句可以说清楚的,我这首先列出将会列举的JUC相关的内容,然后介绍本文的版本:Tools部分J.U.C体系的主要大板块包含内容,如下图所示:注意这个里面每个部分都包含很多的类和处理器,而且是相互包含,相互引原创 2013-02-05 19:38:12 · 17713 阅读 · 6 评论 -
JAVA核心层--反射--动态代理
本文发表于2010年,时间较早,部分问题解释不是十分准确,所以需要进一步了解,请参看2012年版本:java之架构基础-动态代理&cglib要在JAVA技术上突破普通的层面,并拥有一翻设计理念的高度,除了要有很好的设计思维之外,反射在适当的使用下,将会把框架做得非常清晰,并且代码编写也非常简便。在面向对象的编程中,我们为什么要忌讳去大量使用if else switch语句,因为原创 2010-07-06 21:49:00 · 4480 阅读 · 5 评论 -
spring里头各种获取ApplicationContext的方法
为啥写这个文章呢?spring各个版本不同,以及和系统框架套在一起不同,导致获取的方式不同,网络上各种版本,太乱了,写获取方式的人都不写这个获取方式是在本地还是在WEB,在那种应用服务器下,在spring那个版本下,太过分了!我这写一些,常见的,可能经常要用的版本;首先了解,为什么要获取这个东西:当你想通过spring获取一个你指定的类的实例的时候,而又没有通过spring加载到当原创 2013-01-06 16:53:27 · 71099 阅读 · 9 评论 -
Java线程池架构2-多线程调度器(ScheduledThreadPoolExecutor)
在前面介绍了java的多线程的基本原理信息:《Java线程池架构原理和源码解析(ThreadPoolExecutor)》,本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分。 我们如果要用java默认的线程池来做调度器,一种选择就是Timer和TimerTask的结合,在以前的文章:《Timer与TimerTask的真正原理&使用原创 2013-04-29 03:58:44 · 11872 阅读 · 4 评论 -
MySQL JDBC PrepareStatement基本的两种模式&客户端空间占用的源码分析
关于预编译(PrepareStatement),对于所有的JDBC驱动程序来讲,有一个共同的功能,就是“防止SQL注入”,类似Oracle还有一种“软解析”的概念,它非常适合应用于OLTP类型的系统中。在JDBC常见的操作框架中,例如ibatis、jdbcTemplate这些框架对JDBC操作时,默认会走预编译(jdbcTemplate如果没有传递参数,则会走createStatement),这貌原创 2013-08-31 14:29:23 · 7522 阅读 · 6 评论 -
spring事务管理器的源码和理解
以前说了大多的原理,今天来说下spring的事务管理器的实现过程,顺带源码干货带上。其实这个文章唯一的就是带着看看代码,但是前提你要懂得动态代理以及字节码增强方面的知识(http://blog.csdn.net/xieyuooo/article/details/7624146),关于annotation在文章:http://blog.csdn.net/xieyuooo/article/deta原创 2012-12-10 16:53:51 · 8953 阅读 · 0 评论 -
简单的并发编程中犯2的一个小例子--CAS使用时一定要考虑下是否有必要做轮询
并发编程我自己写过不少文章,不过我由于其相对需要理解更多的东西,我自己写代码也有时长犯2的时候,对于这些犯2的问题,我们只能将它作为自己宝贵的经历和财富,本文是很简单Java并发方面的小文章,为啥?因为是一个犯2的例子,这里给大家做个简单分享。先简单描述下场景:在一个app中,我需要为访问者提供某种信息的存储,由于架构上已经确定的方式,所以可以确保每一个app上存储的用户不会太多,于是就放在了内存原创 2014-01-23 14:08:49 · 4720 阅读 · 1 评论 -
spring启动component-scan类扫描加载过程---源码分析
最近因为写书的事情,一段时间没有写博客了,有朋友最近问到了spring加载类的过程,尤其是基于annotation注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里原创 2013-06-13 23:03:30 · 28080 阅读 · 24 评论 -
MySQL JDBC 5.1.25的一个坑(应该算是BUG)
这是公司的一个重要项目中的真实案例(目前还未证实其它版本是否存在,不过刚看了最新版5.1 .26版本还是没有修复这个操作方式,不过用的小伙伴们要注意了哦):什么样的情况呢,当在代码中使用connection.close()方法的时候,神奇般的StackOverflow了!没错,这就是JDBC自己导致的死递归,堆栈输出的内容如下所示:这个堆栈信息可以: ConnectionImpl.realC原创 2013-10-30 14:16:33 · 8491 阅读 · 4 评论 -
关于Java特种兵下册
《Java特种兵 下册》这本书一直没出,至上册出版近1年以来,每周会有很多小伙伴发私信或邮件问起我下册出版的事情,纵使目前有很多无奈,小胖还是初步决定准备写下册。下册内容(下册的内容小胖):下册内容在其它博客里面有所标注,但由于事隔一年多,所以小胖有很多知识的认知也有所变化,所以内容上也会有做一些调整。1、设计方面内容依然会写,小胖依然用自己的方式告诉大家怎么样去设计,当然小胖会改很多内容,设计也...原创 2015-08-20 11:01:15 · 21205 阅读 · 36 评论 -
java之annotation与框架的那些秘密
在大家使用spring MVC或Hibernate 3.0以上的版本时,可能会注意到annotation带来的方便性,不过这往往让人觉得annotation真的很强大,而这算是一种接近错误的理解吧,annotation其实本身是属于一种文档注解的方式,帮助我们在编译时、运行时、文档生成时使用,部分annotation其实基本和注释差不多,这里其实是要说下annotation的原理,以及各种功能在它原创 2012-09-20 23:39:33 · 7560 阅读 · 0 评论 -
Java对象排序、中文排序、SortedSet排序使用和源码讲解
在C、C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,就通过:Collections.sort(list)那么这个list就被排序了,排序最终调用的是Arrays.sort方法来完成的,所以数组自然是用Arrays.sort了,而SortedSet里面内部也有排序原创 2013-02-25 20:53:21 · 13062 阅读 · 9 评论 -
java之J.U.C系列文章--概括与基础
J.U.C是java系列一块看似简单,水很深的区域,但是不论是深入java还是分布式的一些东西,这都算是基础,虽然以前乱七八糟写过一些多线程的文章,不过都比较乱了一点,最近有打算逐步深入来写多篇文章来说说我对这些东西的小理解。1、首先线程分为内核线程、用户线程;在Linux下java的线程其实是在java私有栈上有一个用户线程,和OS级别有一个轻量级的进程来实现。2、在操作java原创 2012-08-13 16:29:14 · 5168 阅读 · 1 评论 -
jdbc实现篇-源码(Oracle、MySQL)-第一部分-Dirver注册和获取及Connection获取原理
简单说下,本文是说源码的,但是不会一篇文章就说得很深入,本文是【jdbc源码入口篇】,分别会说明一些源码和使用细节,所提及的源码可能相对于jdbc的源码还是初级看源码,看个大概,细节上还有很多东西,后续有时间会跟进;文章会以oracle、mysql jdbc的实现的源码作为说明的依据来参考;首先,我们要创建一个链接(连接池是在内部做的),会操作:Class.forName("x原创 2013-01-14 23:10:14 · 12761 阅读 · 23 评论 -
jdbc实现篇-源码(Oracle、MySQL)之Connection创建过程
前一篇文章说了一些基本的注册:http://blog.csdn.net/xieyuooo/article/details/8502585,本文注重讲究一些核心类的一些方法,后面有时间再写一个jdbc级别错误的问题,注意事项:本文介绍Connection的一些创建,篇幅所限,不能一一将所有代码贴出,可以跟着这种思路去阅读更为细节的源码为好;上一篇文章,说到了Driver注册的过程原创 2013-01-27 20:11:16 · 8041 阅读 · 5 评论 -
java在处理大数据的时候一些小技巧
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且原创 2012-07-06 13:33:28 · 21009 阅读 · 19 评论 -
系统架构-性能篇章2(系统拆分2-问题)
在文章《系统架构-性能篇章2(系统拆分1)》有提及到过关于系统在什么情况下会拆分,拆分的目之类的问题,本文会阐述一些关于拆分过程中遇到的各种各样的常见问题进行分析,和上一个文章中提及到的一样,讲解的目录如下:1、负载均衡设备的问题。2、不同系统之间的通信问题。3、数据写入和查找的问题。4、跨数据库事务问题。5、跨数据库序列问题。6、不同应用的本地缓存问题。7、系统之间的原创 2011-11-15 22:59:00 · 4198 阅读 · 0 评论 -
系统架构-性能篇章2(系统拆分1)
系统为什么拆分?系统做大了,并发量无法扛得住,如何做?业务做复杂了,单个应用中不能个性化,如何做?模块和逻辑对各类资源开销非常特殊,如何做?。。。。。。拆分、拆分、再拆分。由 全世界用一个系统表达全世界所有的企业和公司的业务开始,注定系统做大后必然拆分的走原创 2011-09-30 21:25:16 · 8185 阅读 · 10 评论 -
系统架构-性能篇章1(应用系统性能1)
在前面的文章中,说了很多JVM和数据库方面的东西,我所描述的内容大多偏重于技术本身,和实际的业务系统结合的比较少,本文开始进入实际的系统设计中应当注意的方方面面(文章偏重于访问量高,但是每次访问量并不是很大的系统),而偏重点在于性能和效率本身,由于这个知识涉及的基础和面很广,所以原创 2011-08-19 20:09:04 · 3697 阅读 · 0 评论 -
从JAVA多线程理解到集群分布式和网络设计的浅析
由于最近工作原因,很久没有在CSDN上留下些啥,今天在这些篇文章,是关于java多线程的。对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容:1、在应用开发中什么时候选择多线程?2、多线程应该注意些什么?3、状态转换控制,如何解决死锁?4、如何设计一个具有可扩展性的多线程处理器?原创 2011-04-29 09:51:00 · 5439 阅读 · 0 评论 -
java之httpclient的一些破事
本文偏重使用,简单讲述httpclient,其实在网络编程中,基于java的实现几乎都是包装了socket的通信,然后来模拟各种各样的协议;httpclient其实就是模拟浏览器发起想服务器端的请求,而这种更加类似于JS的请求或页面的POST、GET,不过这种数据的返回一般需要得到有意义的数据,才方便做其他的交互,否则得到一个页面结果,全是标签了,毕竟不是浏览器,所以我们用httpclient更多原创 2012-01-06 21:29:23 · 25621 阅读 · 16 评论 -
java也能写出点点算法-像C++一样去优化核心并发的代码例子1
java其实更多用来写业务代码,代码写得好不好,关键看抽象能力如何,不过如果你要用java写很核心的插件和高并发的片段,那么可能还是需要注意一些写法,那种写法可能会更好,才能使得并发量提高,而且更少的使用CPU和内存;我最近在一段采集系统访问的java代码,通过过滤器切入到应用中,遇到的一些小细节的调整,感觉还有点意思,以下为收集信息中碰到的两个需要判定的地方(对java优化没有任何要求的,本文纯原创 2012-03-23 17:54:02 · 4556 阅读 · 0 评论 -
系统架构-性能篇章1(应用系统性能2-OOM&参数配置)
对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么多大多数在解决OOM的情况,于此,本文就只阐述这个内容,携带一些分析和理解和部分扩展内容,也就是JVM宕机中的一些问题,OK,下面说下OOM的常见情况(本文基于jdk 1.6系列版本来编写,其余的版本未必完全适用): 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出:那什么样的情况就是堆栈溢出呢?当原创 2011-09-14 21:35:22 · 8167 阅读 · 0 评论 -
java小技巧-关于乱码的那些个破事
这篇文章说难不难,说简单不简单,其实更多的在乎与经验,不过就本文来说,我更多的想阐述为什么会产生乱码,什么情况下会产生乱码,然后如何去解决乱码,对于有哪些乱码情况非常多,并不一定是那一种情况导致的,清楚了过程和原理,那么乱码都不在乎是什么大问题: 本文纲要:1、乱码的来源与本质。2、什么时候会产生乱码?3、如何分析乱码和解决乱码?4、我所遇到过的乱码情况。 第一部分原创 2011-10-30 19:54:30 · 6037 阅读 · 2 评论 -
如何精确地测量java对象的大小-底层instrument API
关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识原创 2011-12-13 22:18:49 · 10812 阅读 · 19 评论 -
如何修改request的parameter的几种方式
这篇文章仅仅用来参考,本身不想写,request之所以不想让你修改parameter的值,就是因为这个东西一般不然改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员毕竟是自己写程序,尤其是在公共程序里原创 2012-12-28 17:03:11 · 78109 阅读 · 64 评论 -
java之HeapByteBuffer&DirectByteBuffer以及回收DirectByteBuffer
byte buffer一般在网络交互过程中java使用得比较多,尤其是以NIO的框架中;看名字就知道是以字节码作为缓冲的,先buffer一段,然后flush到终端。而本文要说的一个重点就是HeapByteBuffer与DirectByteBuffer,以及如何合理使用DirectByteBuffer。1、HeapByteBuffer与DirectByteBuffer,在原理上,原创 2012-05-08 20:12:40 · 29557 阅读 · 19 评论 -
java在CPU中的一些个破事
其实写java的人貌似和CPU没啥关系,最多最多和我们在前面提及到的如何将CPU跑满、如何设置线程数有点关系,但是那个算法只是一个参考,很多场景不同需要采取实际的手段来解决才可以;而且将CPU跑满后我们还会考虑如何让CPU不是那么满,呵呵,人类,就是这么XX,呵呵,好了,本文要说的是其他的一些东西,也许你在java的写代码时几乎不用关注CPU,因为满足业务才是第一重要的事情,如果你要做到框架级别,原创 2012-07-30 15:29:26 · 6073 阅读 · 19 评论 -
java处理字符集-第二部分-文件字符集
前面有一篇文章提及到乱码的产生:http://blog.csdn.net/xieyuooo/article/details/6919007那么知道主要原因是编码和解码方式不一样,那么有些时候如果我们知道编码方式,那么解码自然很好搞,例如输出的contentType会告诉浏览器我输出的内容是什么编码格式的,否则浏览器会才用一个当前默认的字符集编码来处理;本文要将一些java如何处理没有带正常协议原创 2012-12-26 17:45:33 · 4097 阅读 · 0 评论 -
JVM第三篇(简单demo)
本来写完前面两篇JVM,已经不再想写这类似的东西,因为很多知识点很难吃透,即使写出来也很难让人理解,即使理解还不如看官方资料,不过还是鼓起勇气写下这篇文章,本文主要是demo去理解一些JVM的内存知识,版本为hotspot的1.6.24版本,不过本文不讲指令,只是模拟一些东西,类似于出题目,和大家一起来做下;本文几个简单实验不能说明所有问题,仅仅是分享一下理解JVM的内在和一些不可告人的秘密,以及原创 2011-08-19 16:21:20 · 5147 阅读 · 7 评论 -
系统架构-基础篇-(高性能基础建设说明与选型条件)
本文牵扯的面积可能会比较泛,或者说比较大,在这个层面很多人也有自己的见解,所以我这也仅仅是抛砖引玉,结合前面讲述的一些基础技术,从思想中阐述更为深入的架构思想基础,因为最好的架构思想是架构师结合实际情况思考出来最适合的架构,这里仅仅说明下一些常用的原理和思想,主要包含的内容有(内容很泛,所以都是简单阐述入门知识,具体后续深入探讨):1、app切分集群组扩展2、app集群组负载均衡3、Memcached原理4、db cache应用5、db存储类型以及存储cache说明6、存储条带思想7、数据库集群8、数据库分原创 2011-05-15 05:27:00 · 6877 阅读 · 2 评论