JAVA应用开发
文章平均质量分 90
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 · 1664 阅读 · 0 评论 -
Java基础小技巧回顾--浅析String
其实本文非常简单,不过有很多朋友经常问,网上很多例子也写个大概,很多人也只是知道和大概,就本文而来读起来非常的轻松,不过算是一些小技巧;但是我们的程序中相信用得最多的就是char数组和byte[]数组,而String就是由char[]数组组成的,一般情况下我们就可以认为String用得是最多的对象之一。有关Sring的空间利用率方面,这里不想多说,只能说很低很低,尤其是你定义的Stri原创 2011-10-10 19:35:06 · 5862 阅读 · 18 评论 -
Java JUC之Atomic系列12大类实例讲解和原理分解
在java6以后我们不但接触到了Lock相关的锁,也接触到了很多更加乐观的原子修改操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,以及并发中的ABA问题,本文讲述Atomic系列的类的实现以及使用方法,其中包含:基本类:AtomicInteger、AtomicLong、AtomicBoolean;引用类型:AtomicReference原创 2013-02-20 15:27:56 · 15565 阅读 · 19 评论 -
mysql jdbc处理0日期格式蛋疼问题-也算是BUG
最近在写一个数据库访问的中间平台时,使用MySQL JDBC处理一些日期数据,遇到点变态的问题,给大家乐一乐!首先来看看什么样的日期数据这么蛋疼呢?DATE 0000-00-00DATETIME 0000-00-00 00:00:00TIMESTAMP 0000-00-00 00:00:00TIME 25:21:22对于前3种情况,直接用JDB原创 2014-06-06 19:41:49 · 4996 阅读 · 8 评论 -
spring事务管理器的源码和理解
以前说了大多的原理,今天来说下spring的事务管理器的实现过程,顺带源码干货带上。其实这个文章唯一的就是带着看看代码,但是前提你要懂得动态代理以及字节码增强方面的知识(http://blog.csdn.net/xieyuooo/article/details/7624146),关于annotation在文章:http://blog.csdn.net/xieyuooo/article/deta原创 2012-12-10 16:53:51 · 8997 阅读 · 0 评论 -
MySQL JDBC PrepareStatement基本的两种模式&客户端空间占用的源码分析
关于预编译(PrepareStatement),对于所有的JDBC驱动程序来讲,有一个共同的功能,就是“防止SQL注入”,类似Oracle还有一种“软解析”的概念,它非常适合应用于OLTP类型的系统中。在JDBC常见的操作框架中,例如ibatis、jdbcTemplate这些框架对JDBC操作时,默认会走预编译(jdbcTemplate如果没有传递参数,则会走createStatement),这貌原创 2013-08-31 14:29:23 · 7777 阅读 · 6 评论 -
ThreadLocal实现方式&使用介绍---无锁化线程封闭
虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以然,因此,使用ThreadLocal的程序员很多时候会被它导入到陷进中去,其实java很多高级机制系列的很多东西都是一把双刃剑,也就是有利必有其弊,那么我们的方法是找到利和弊的中间平衡点,最佳的方式去解决问题。 本文首先说明Thr原创 2013-02-21 16:51:44 · 9399 阅读 · 17 评论 -
Java线程池架构原理和源码解析(ThreadPoolExecutor)
在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:《java之JUC系列-外部Tools》中第一部分有详细的说明,请参阅;文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,原创 2013-03-25 20:18:24 · 30277 阅读 · 36 评论 -
J.U.C系列-线程安全的理论讲解
引文:在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首先要确保可见性,也就是要在这个基础上才能做到,而CAS也是基于这种原理来完成,我们在文章:Java JUC之Atomic系列12大类实例讲解和原理分解 中关于Atomic的介绍中有提到通过unsafe调用底层的compareAndSwapXXX的三个方法,都是基于可见性变量才会有效。 谈到可见性,原创 2013-03-05 10:35:56 · 7272 阅读 · 14 评论 -
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 · 60196 阅读 · 10 评论 -
MySQL JDBC为什么都不开启PreparedStatement Cache
同样技术的文章我发现几年前写过一次,^_^:https://blog.csdn.net/xieyuooo/article/details/10732375当时写这篇文章更多偏重于内部的代码实现逻辑来写,可能很多朋友看得更多是云里雾里,不知道对自己有什么帮助,最近也有人在问我为什么我们写代码不开启PS Cache,其实从源码确实可以找到答案,不过我觉得用博客写源码分析可能更多是对我自己有帮助,对...原创 2019-08-20 22:47:56 · 8934 阅读 · 10 评论 -
常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)
今天是1024程序员节日,没错2的10次方,二进制的节日,那么我就突发奇想,写一篇关于网络传递二进制数据时的序列化和反序列化数据中各种常见的方案,其中不乏一些底层方案和一些开源界很流行的方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度、对系统的影响、传输数据的大小、可维护性及可阅读性等方面有着较大的区别。 文章分成3个部分:1...原创 2018-10-24 21:42:04 · 3229 阅读 · 4 评论 -
MySQL JDBC StreamResult通信原理浅析
好几年没写技术博客了,今天写一个小的技术点给大家分享,关于MySQL JDBC StreamResult的原理分享,难度不大,就当程序员的闲聊。如果使用MySQL JDBC读取过比较大的数据(例如超过1GB),应该清楚在读取的时候,很可能会Java堆内存溢出,我们的解决方案通常是使用useCursorFetch读取或Stream读取来处理。使用Stream读取的方式通常的操作方式是在执行SQL...原创 2018-10-17 17:02:56 · 15246 阅读 · 54 评论 -
JAVA核心层--反射--动态代理
本文发表于2010年,时间较早,部分问题解释不是十分准确,所以需要进一步了解,请参看2012年版本:java之架构基础-动态代理&cglib要在JAVA技术上突破普通的层面,并拥有一翻设计理念的高度,除了要有很好的设计思维之外,反射在适当的使用下,将会把框架做得非常清晰,并且代码编写也非常简便。在面向对象的编程中,我们为什么要忌讳去大量使用if else switch语句,因为原创 2010-07-06 21:49:00 · 4511 阅读 · 5 评论 -
认识JVM--第一篇-对象分配&回收算法
本来标题党想写成《深入JVM》,不过不太敢写,我想一小篇博客我想还不足以说明JVM,在本文中,会就我所知给大家介绍JVM的很多内部知识,概念会相对较粗,因为太细的内容要写,这里肯定写不出来;本文主要偏重理论,没有什么实践,中间除一些官方资料外,还有部分自身的理解,所以请大家不要完全信任本文内容;另外本文会有一小部分纠正以前一篇文章对于intern()使用方法的错误,本文会在其中说明使用错误的原因,原创 2011-06-18 16:26:00 · 8875 阅读 · 20 评论 -
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 · 17768 阅读 · 6 评论 -
Java网络编程(一)
关于JAVA网络编程的技术非常繁多,如:SOCKET、RMI、EJB、WEBSERVICE、MQ、中间数据等等方法,但是万变都是源于基础中通信原理,有些是轻量级的、有重量级的;有实时调用、有异步调用;这么多的技术可以说什么都可以用,关键在什么场合用什么最适合你,这些技术主要用于多个子系统之间相互通信的方法,如一个大型的软件应用分多个子系统,它们可能由不同的厂商来完成,这些子系统最终需要整合为一个系原创 2010-08-31 19:51:00 · 4729 阅读 · 0 评论 -
java之httpclient点点补充-登录问题
本来有点不太想写这篇文章,原因是写了这个,就感觉WEB应用怎么都可以自己写代码访问内部的资源信息!不过出于技术本身的我还是考虑些点点东西,而且即使我不写,这玩意也有,呵呵,前面一篇文章我提及到双方要约定token来进行认证交互等等,如果你想访问某个网站内部的资源,而且是需要登录的,但是又想通过本地程序直接蹦进去,怎么蹦呢?办法不是没有,其实httpclient就是模拟一个浏览器的功能,原创 2012-01-19 15:10:04 · 5270 阅读 · 3 评论 -
java在CPU中的一些个破事
其实写java的人貌似和CPU没啥关系,最多最多和我们在前面提及到的如何将CPU跑满、如何设置线程数有点关系,但是那个算法只是一个参考,很多场景不同需要采取实际的手段来解决才可以;而且将CPU跑满后我们还会考虑如何让CPU不是那么满,呵呵,人类,就是这么XX,呵呵,好了,本文要说的是其他的一些东西,也许你在java的写代码时几乎不用关注CPU,因为满足业务才是第一重要的事情,如果你要做到框架级别,原创 2012-07-30 15:29:26 · 6092 阅读 · 19 评论 -
java之J.U.C系列文章--概括与基础
J.U.C是java系列一块看似简单,水很深的区域,但是不论是深入java还是分布式的一些东西,这都算是基础,虽然以前乱七八糟写过一些多线程的文章,不过都比较乱了一点,最近有打算逐步深入来写多篇文章来说说我对这些东西的小理解。1、首先线程分为内核线程、用户线程;在Linux下java的线程其实是在java私有栈上有一个用户线程,和OS级别有一个轻量级的进程来实现。2、在操作java原创 2012-08-13 16:29:14 · 5195 阅读 · 1 评论 -
java之httpclient的一些破事
本文偏重使用,简单讲述httpclient,其实在网络编程中,基于java的实现几乎都是包装了socket的通信,然后来模拟各种各样的协议;httpclient其实就是模拟浏览器发起想服务器端的请求,而这种更加类似于JS的请求或页面的POST、GET,不过这种数据的返回一般需要得到有意义的数据,才方便做其他的交互,否则得到一个页面结果,全是标签了,毕竟不是浏览器,所以我们用httpclient更多原创 2012-01-06 21:29:23 · 25693 阅读 · 16 评论 -
java也能写出点点算法-像C++一样去优化核心并发的代码例子1
java其实更多用来写业务代码,代码写得好不好,关键看抽象能力如何,不过如果你要用java写很核心的插件和高并发的片段,那么可能还是需要注意一些写法,那种写法可能会更好,才能使得并发量提高,而且更少的使用CPU和内存;我最近在一段采集系统访问的java代码,通过过滤器切入到应用中,遇到的一些小细节的调整,感觉还有点意思,以下为收集信息中碰到的两个需要判定的地方(对java优化没有任何要求的,本文纯原创 2012-03-23 17:54:02 · 4568 阅读 · 0 评论 -
java之架构基础-动态代理&cglib
本文核心主要参数动态代理和cglib;在以前的文章中,有提及到动态代理,它要解决的就是,当我们的某些代码前面或后面都需要一些处理的时候,如写日志、事务控制、做agent、自动化代码跟踪等,此时会给你带来无限的方便,这是JVM级别的提供的一种代理机制,不过在这种机制下调用方法在JVM7出来前还没有invokeDynamic的时候,调用的效率是很低的,此时方法调用都是通过method的invoke原创 2012-06-01 17:30:29 · 6073 阅读 · 2 评论 -
java在处理大数据的时候一些小技巧
众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且原创 2012-07-06 13:33:28 · 21024 阅读 · 19 评论 -
系统架构-性能篇章2(系统拆分2-问题)
在文章《系统架构-性能篇章2(系统拆分1)》有提及到过关于系统在什么情况下会拆分,拆分的目之类的问题,本文会阐述一些关于拆分过程中遇到的各种各样的常见问题进行分析,和上一个文章中提及到的一样,讲解的目录如下:1、负载均衡设备的问题。2、不同系统之间的通信问题。3、数据写入和查找的问题。4、跨数据库事务问题。5、跨数据库序列问题。6、不同应用的本地缓存问题。7、系统之间的原创 2011-11-15 22:59:00 · 4233 阅读 · 0 评论 -
系统架构-性能篇章2(系统拆分1)
系统为什么拆分?系统做大了,并发量无法扛得住,如何做?业务做复杂了,单个应用中不能个性化,如何做?模块和逻辑对各类资源开销非常特殊,如何做?。。。。。。拆分、拆分、再拆分。由 全世界用一个系统表达全世界所有的企业和公司的业务开始,注定系统做大后必然拆分的走原创 2011-09-30 21:25:16 · 8294 阅读 · 10 评论 -
系统架构-性能篇章1(应用系统性能1)
在前面的文章中,说了很多JVM和数据库方面的东西,我所描述的内容大多偏重于技术本身,和实际的业务系统结合的比较少,本文开始进入实际的系统设计中应当注意的方方面面(文章偏重于访问量高,但是每次访问量并不是很大的系统),而偏重点在于性能和效率本身,由于这个知识涉及的基础和面很广,所以原创 2011-08-19 20:09:04 · 3707 阅读 · 0 评论 -
从JAVA多线程理解到集群分布式和网络设计的浅析
由于最近工作原因,很久没有在CSDN上留下些啥,今天在这些篇文章,是关于java多线程的。对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容:1、在应用开发中什么时候选择多线程?2、多线程应该注意些什么?3、状态转换控制,如何解决死锁?4、如何设计一个具有可扩展性的多线程处理器?原创 2011-04-29 09:51:00 · 5470 阅读 · 0 评论 -
系统架构-基础篇-(高性能基础建设说明与选型条件)
本文牵扯的面积可能会比较泛,或者说比较大,在这个层面很多人也有自己的见解,所以我这也仅仅是抛砖引玉,结合前面讲述的一些基础技术,从思想中阐述更为深入的架构思想基础,因为最好的架构思想是架构师结合实际情况思考出来最适合的架构,这里仅仅说明下一些常用的原理和思想,主要包含的内容有(内容很泛,所以都是简单阐述入门知识,具体后续深入探讨):1、app切分集群组扩展2、app集群组负载均衡3、Memcached原理4、db cache应用5、db存储类型以及存储cache说明6、存储条带思想7、数据库集群8、数据库分原创 2011-05-15 05:27:00 · 6898 阅读 · 2 评论 -
JVM第三篇(简单demo)
本来写完前面两篇JVM,已经不再想写这类似的东西,因为很多知识点很难吃透,即使写出来也很难让人理解,即使理解还不如看官方资料,不过还是鼓起勇气写下这篇文章,本文主要是demo去理解一些JVM的内存知识,版本为hotspot的1.6.24版本,不过本文不讲指令,只是模拟一些东西,类似于出题目,和大家一起来做下;本文几个简单实验不能说明所有问题,仅仅是分享一下理解JVM的内在和一些不可告人的秘密,以及原创 2011-08-19 16:21:20 · 5163 阅读 · 7 评论 -
SUN核心解析--常规程序编写--集合类
上次关于JAVA的文章《SUN核心解析--常规程序--基本类》从简单基本类简单说名了JAVA的部分原理以及JAVA的底层对于编写优秀代码的重要性,但是就知识面是较窄的,包括今天说的集合类,也只是皮毛而已,只是从我个人的角度,由一点点实践希望可以在这方面起到一点抛砖引玉的作用,下面进入正题: 首先我从自己的角度来说,对于JAVA的内存管理思想(因为从我的角度来说不知道内存大致怎么样的,学习集原创 2010-04-17 22:00:00 · 4625 阅读 · 6 评论 -
析JAVA之垃圾回收机制
本文为2010年编写,所以有很多看法不是很准确,有一定的参考价值,如需要更加深入细节,请参看,2012年编写的关于JVM的文章:认识JVM--第一篇-对象生成&回收算法认识JVM--第二篇-java对象内存模型JVM第三篇(简单demo)系统架构-性能篇章1(应用系统性能2-OOM&参数配置)相继的还会有更多的java深入的知识和机制。对于J原创 2010-05-22 22:03:00 · 4999 阅读 · 2 评论 -
spring里头各种获取ApplicationContext的方法
为啥写这个文章呢?spring各个版本不同,以及和系统框架套在一起不同,导致获取的方式不同,网络上各种版本,太乱了,写获取方式的人都不写这个获取方式是在本地还是在WEB,在那种应用服务器下,在spring那个版本下,太过分了!我这写一些,常见的,可能经常要用的版本;首先了解,为什么要获取这个东西:当你想通过spring获取一个你指定的类的实例的时候,而又没有通过spring加载到当原创 2013-01-06 16:53:27 · 71143 阅读 · 9 评论 -
java enum的使用以及字符串其字符串之间的转换
文章简单,相信在很多网站都能搜索到java enum枚举的使用方式;可能有些东西我当时在刚开始用的时候没找到,所以我写了这篇文章,例如:大多数地方写的枚举都是给一个枚举然后例子就开始switch,可是我想说,我代码里头来源的数据不太可能就是枚举,通常是字符串或数字,比如一个SQL我解析后首先判定SQL类型,通过截取SQL的token,截取出来可能是SELECT、DELETE、UPDATE、IN原创 2013-01-08 23:35:18 · 39986 阅读 · 2 评论 -
如何精确地测量java对象的大小-底层instrument API
关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程中包含对象本身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在本地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java一些比较偏底层的知识原创 2011-12-13 22:18:49 · 10931 阅读 · 19 评论 -
java小技巧-关于乱码的那些个破事
这篇文章说难不难,说简单不简单,其实更多的在乎与经验,不过就本文来说,我更多的想阐述为什么会产生乱码,什么情况下会产生乱码,然后如何去解决乱码,对于有哪些乱码情况非常多,并不一定是那一种情况导致的,清楚了过程和原理,那么乱码都不在乎是什么大问题: 本文纲要:1、乱码的来源与本质。2、什么时候会产生乱码?3、如何分析乱码和解决乱码?4、我所遇到过的乱码情况。 第一部分原创 2011-10-30 19:54:30 · 6072 阅读 · 2 评论 -
认识JVM--第二篇-java对象内存模型
前一段写了一篇《认识JVM》,不过在一些方面可以继续阐述的,在这里继续探讨一下,本文重点在于在heap区域内部对象之间的组织关系,以及各种粒度之间的关系,以及JVM常见优化方法,文章目录如下所示:1、回顾--java基础的对象大概有哪些特征2、上一节中提到的Class加载是如何加载的3、一个对象放在内存中的是如何存放的4、调用的指令分析5、对象宽度对其问题及空间浪费6、指令原创 2011-07-03 23:57:14 · 7457 阅读 · 9 评论 -
系统架构-性能篇章1(应用系统性能2-OOM&参数配置)
对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么多大多数在解决OOM的情况,于此,本文就只阐述这个内容,携带一些分析和理解和部分扩展内容,也就是JVM宕机中的一些问题,OK,下面说下OOM的常见情况(本文基于jdk 1.6系列版本来编写,其余的版本未必完全适用): 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出:那什么样的情况就是堆栈溢出呢?当原创 2011-09-14 21:35:22 · 8205 阅读 · 0 评论 -
Java对象排序、中文排序、SortedSet排序使用和源码讲解
在C、C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,就通过:Collections.sort(list)那么这个list就被排序了,排序最终调用的是Arrays.sort方法来完成的,所以数组自然是用Arrays.sort了,而SortedSet里面内部也有排序原创 2013-02-25 20:53:21 · 13113 阅读 · 9 评论 -
如何修改request的parameter的几种方式
这篇文章仅仅用来参考,本身不想写,request之所以不想让你修改parameter的值,就是因为这个东西一般不然改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员毕竟是自己写程序,尤其是在公共程序里原创 2012-12-28 17:03:11 · 78637 阅读 · 64 评论