自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

我的新浪

转眼间,博客的访问量也快100000了,来推广下自己的新浪微博 [url]http://weibo.com/yizhenn[/url]有问题可也私信我。

2017-02-18 18:02:25 147

Spring代码中动态切换数据源

最近项目中遇到一个场景,需要能够在一个方法中操作多个具有相同表结构数据库(你可以理解为一个表中的数据被水平拆分到多个库中,查询时需要遍历这多个库)。经过笔者几天的研究,最终解决了问题,并且写了一个demo共享到我的github。关注笔者博客的小伙伴一定知道之前的这篇文章点击打开链接,这篇博客中的解决方案仅仅适用读写分离的场景。就是说,当你在开发的时候已经确定了使用写库一读库的形式。笔者今天要写...

2017-01-02 14:55:37 148

Java中的可变参数

Java在1.5之后允许方法使用可变参数,可变参数的好处在于:它允许传递0个或者多个参数。比如原来有一段代码如下:[code="java"]public class Test { public static void main(String[] args) { test(); test(new String[]{"a"}); ...

2016-12-31 10:43:32 155

Spring的声明式事务管理

笔者之前从原理的层面讲解过spring的事务处理,包括编程式事务处理和声明式事务处理,详见博客 Spring事务处理-编程式事务和声明式事务。这篇文章从原理的层面讲解了Spring的事务管理机制,读完了这篇博客,笔者可以一针见血的使用spring的处理机制。今天这篇博客仅仅是Spring声明式处理的正常使用,偏向工程的使用说明。还是以最近的几篇博客中常用的test工程为例,具体如下:首先,...

2016-12-27 19:17:21 85

这样搞——保证你的代码没有try-catch

常常听到有技术圈的朋友抱怨,尤其是从其他语言转到Java语言的同行,说Java的try-catch语言让代码显得很凌乱。的确,作为一个Java Follower,笔者也觉得Java中的try-catch会导致代码很不整齐,易读性变差。那么有什么好办法让Java工程中尽量不出现try-catch语法块呢?办法还真有,请听我娓娓道来!首先,笔者带领大家回顾一下Java的异常处理机制。如下图,Jav...

2016-12-21 07:56:38 119

回调模式——让你的controller不再繁琐

在Java后台编程中,大家一般会使用MVC设计模式,即便使用的具体框架不尽相同。今天,我们来说说MVC中的这个C,也就是Controller。Controller是web程序中最先接触到用户request的地方,当然,前提是该request经过了身份认证和权限检查等重重考验,这一部分建议在框架的Interceptor中进行。详细内容请看笔者之前的博客玩转Spring!从拒绝Filter开始。好了,...

2016-12-19 10:12:25 212

玩转Spring!从拒绝Filter开始

一直以来,博客都是在写一些读书笔记或者学习心得。俗话说,举一反三,是时候沉淀一下了。索性这把这篇文章作为开端吧!笔者知道,这篇文章的题目一定让某些developer不爽,尤其是学习过J2EE基础的人。学习过J2EE基础的童鞋,一定有自己写listener,filter和servlet的经验。经验多一些是好事,但不要陶醉于自己的经验,作为developer,我们还是要进步滴,尤其是在使用spri...

2016-12-14 19:09:16 98

推荐JAVA学习路线

一直以来,都想写一篇介绍Java学习路线的博客。为什么有这个想法?原因有两个,其一:笔者从大三开始学习JAVA,至今也3年了。由于身边缺乏老司机带路,只能自己一步步探索,深知没人指路的痛苦。所以看过很多垃圾的书籍(没办法,国内书籍市场门槛太低),但功夫不负有心人,一些经典的书籍也都撸过了(关于书籍,下文中会介绍)。其二:由于JAVA进入门槛低,所以存在一些学个SSH框架就觉得JAVA不过如此之流,...

2016-12-13 11:06:24 85

博客搬家

各位朋友,大家好! 感谢大家两年对我博客的关心和认可。 现将博客搬至CSDN 欢迎大家继续关注![url]http://blog.csdn.net/yizhenn[/url]

2016-12-12 15:55:45 63

mybatis是如何防止SQL注入的

SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:[color=red][size=large][b]No patch for stupid[/b][/size][/color]。为什么这么说,下面就以JAVA为例进行说明:假设数据库中存在这样的表:[code="java"]table user(id varchar(20) PRIMARY KEY , ...

2016-08-17 20:49:56 100

sed简明用法

本文旨在帮助sed新手快速熟悉sed的常见用法。首先,用如下文件作为源文件pets.txt:[code="java"]This is my cat my cat's name is bettyThis is my dog my dog's name is frankThis is my fish my fish's name is georgeThis i...

2016-08-11 16:03:07 104

awk简明用法

这几天在写数据库脚本,需要频繁的处理字符文件,笔者之前都是用java程序处理字符文件,结果看到同事用awk几秒钟就搞定了一个处理,觉得太牛逼了,于是花时间学习了下。[color=red]本文旨在帮助awk新手快速熟悉awk的常见用法,笔者会尽量把文章写得像清纯的女神一样撩起你的兴趣,不过最终还得你[size=large]花力气自己撸[/size]。[/color]首先,我们使用ne...

2016-08-11 11:21:23 91

tomct处理请求的流程

在讲项目之前,先讲解一些基础知识。[color=red]1. HTTP请求格式,一个HTTP请求包括以下三个部分:[/color]请求方法(POST,GET等) URI 协议版本请求头部请求实体举例如下:POST /examples/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Lan...

2016-08-09 12:00:22 245

JUC之AQS

[color=red]AQS是同步框架,它进行两个方面的工作:资源的管理和资源申请者的管理。[/color]对应由两部分组成:一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。state的访问方式有三种:[code="java"] getState() setState() compareAndSetState...

2016-07-27 15:49:23 305

JUC之CAS

JUC是java.util.concurrent包的简称,该包提供了并发编程的解决方案(当然,JAVA并发编程的解决方案还有synchronized)。从概括的层面来说,JUC包有两大核心:CAS和AQS。其中CAS是java.util.concurrent.atomic包的基础,AQS是java.util.concurrent.locks包以及一些常用类比如Semophore等类的基础。我们先来...

2016-07-27 10:56:00 1371

理解OAuth2.0

[color=red]1. 为了理解OAuth的适用场合,让我举一个假设的例子。[/color]有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"能够读取用户自己储存在Google上的照片。如何让云冲印能够访问位于Google上的照片呢?传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。...

2016-07-18 17:01:59 104

JAVA并发-线程状态和线程组

[color=red]在Java中,线程有6种基本状态[/color],理解这6种基本状态之间的关系可以让我们对多线程有更好的理解.如下图所示:[img]http://dl2.iteye.com/upload/attachment/0118/7655/fe777fae-e76f-3618-8993-1ee02ea29927.jpg[/img][color=red]在Java中,所有的线...

2016-07-18 14:14:38 113

一名3年工作经验的程序员应该具备的技能

[url]http://www.cnblogs.com/xrq730/p/5260294.html[/url]

2016-07-16 14:29:48 77

JAVA并发-中断处理和任务取消

[color=red]中断处理[/color]在java程序中,当使用Thread.sleep()或者BlockingQueue.take()等阻塞方法时,需要处理InterruptedException。对于这种异常,通常有2种方案进行处理。1. 传递异常:将异常传递给方法的调用者。示例如下:[code="java"]BlockingQueue queue;public Stri...

2016-06-27 22:42:34 202

原创 计算机中的随机数

随机数的性质从弱到强分为3类:[color=red]1. 随机性2. 不可预测性3. 不可重现性[/color]在上面的三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性;具备不可预测性,不代表一定具备不可重现性;但如果具备不可重现性,一定具备随机性和不可预测性。[color=red]满足上面的3性依次对应着:弱伪随机数,强伪随机数,真随机数。[/color]...

2016-06-27 22:39:48 617

原创 基于SSL的HTTPS协议

Http协议是常用的传输层协议,但有些时候我们需要更加安全的http协议,即Https协议。Https协议与Http协议的区别在于:Https协议在Http与传输层之间添加了一个用于加密的SSL(安全套接层)。首先来分析下,一个信息想在网络中安全的传输,需要能够做到一下几点:1. 防偷听(你在购物网站上填写你的银行卡密码,肯定不希望这个密码北其他人知道)2. 防篡改(你在付款时,想...

2016-06-20 19:49:55 276

JAVA并发-减少锁的竞争

降低锁的竞争可以提高并发程序的性能和可伸缩性,有3种方式可以降低锁的竞争:[color=red]1. 减少锁的持有时间(缩小锁的范围)2. 降低锁的请求频率(降低锁的粒度)3. 放弃使用独占锁,使用并发容器,原子变量,读写锁等等来代替它。[/color][color=blue]减少锁的持有时间(减小锁的范围):[/color]减少锁的持有时间实际上就是减小锁的控制范围,...

2016-06-04 16:01:35 90

大型网站架构之JAVA中间件

[color=red]中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品[/color]。常见的有:远程服务框架中间件:主要解决各子模块之间互相访问的问题。消息队列中间件:主要解决各子模之间消息共享的问题。数据访问中间件:用于简化应用层对数据层的访问。关于远程服务框架中间件,国内目前较多应用的是阿里巴巴的[color=red]开源分布式服务框...

2016-05-26 10:23:38 108

原创 大型网站架构之分布式缓存

缓存是优化网站性能的第一手段。在大型网站中,缓存通常用来保存热点数据,或者保存应用上下文相关信息。比如之前提到的session服务器集群就可以用分布式缓存来搭建。当然,分布式缓存还可用于缓存数据库中的热点数据以减轻数据库的压力。分布式缓存的架构方式通常有两种:一种是以JBoss为代表的需要同步的分布式缓存,一种是一MemCached为代表的不互相通信的分布式缓存。JBoss在所有服...

2016-05-25 21:05:50 96

原创 大型网站架构之应用服务器集群化

随着网站的发展,一台应用服务器无法处理太多用户请求,考虑部署多台应用服务器组成集群来提供服务。此时问题来了?[color=red]问题1:[/color]扩展到多台应用服务器时,可能同一个用户的先后两次请求由不同的应用服务器处理,这个时候不同的应用服务器如何进行session的管理。(应用服务器集群的session管理)[color=red]问题2:[/color]如何将请求均匀的分发...

2016-05-25 13:41:49 96

大型网站架构之WEB前端优化

回顾下之前博客中提到的大型网站架构:[img]http://dl2.iteye.com/upload/attachment/0117/6333/165c00f1-8461-389c-bb0c-0c80b3763eb6.png[/img]这张图中,有很多经典的模块。比如CDN服务器,反向代理服务器,负载均衡系统,应用服务器,分布式缓存系统等等。之后的几篇博客中我会逐个来介绍。今天先来看看...

2016-05-24 19:47:10 81

大型网站架构要素及常用手段

“一般来说,设计网站的架构。除了关注[color=red]功能需求[/color]以外,还需要关注[color=red]性能,可用性,伸缩性,扩展性,安全性。[/color]”性能:网站对并发请求的处理能力,有很多衡量指标,比如QPS,响应时间等。可用性:1-网站不能对外提供服务的概率,通常用几个9来衡量。伸缩性:网站能否通过添加硬件资源来提高处理能力。扩展性:网站能否在不改变...

2016-05-23 14:58:48 51

大型网站架构演变

第二遍阅读《大型网站技术架构》,真心觉得书中的内容很好,推荐大家去阅读。下面是书中对大型网站架构演变过程的介绍。对于一个小型企业级网站,通常的架构如下图:[img]http://dl2.iteye.com/upload/attachment/0117/5915/ab7fbf72-99d4-329d-809a-e1f7242fe7ba.png[/img]随着用户数量的增多,可以将应用...

2016-05-22 20:16:27 75

业务对象的贫血模型与充血模型

[color=red]业务对象[/color]是指那些从实际业务场景中抽象出来的对象,这些对象在代码中对应的就是一些业务对象类。在常见的SSH框架的开发中,一般的做法是将每一个业务对象对应一个POLO,当然这是为了方便使用ORM框架。当我们把业务对象实现为POJO的时候,我们实际上是在使用业务对象贫血模式。下面是[color=red]业务对象贫血模型图:(业务对象类既领域层的model)[...

2016-05-21 16:41:16 152

原创 常见RAID

笔者在做桌面云的过程中,就使用过raid。最近阅读《大型网站技术架构》,觉得作者总结的很到位,在此转发。[url]http://book.51cto.com/art/201310/412862.htm[/url]RAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。目前服务器级别的计算机都支持插入多块磁盘(8块或者更多),通过使用RAID技术,实现数据在...

2016-05-20 09:12:57 108

Time33算法与位运算

最近不是很忙,阅读了下《大型网站技术架构》一书。在4.3.4代码优化小节有这样的一句话:“目前比较好的字符串hash算法有Time33算法”。Time33算法,就是hash(i)=33*hash(i-1)+str[i]。在jdk源码中String类的hashCode()方法使用的是Time31算法。源码如下:[code="java"] public int hashCode() {...

2016-05-19 19:55:37 257

JVM-ClassLoader装载class的流程

在JVM中,有三种默认的类加载器,分别为Bootstrap ClassLoader,Extension CLassLoader以及App ClassLoader。其中,Bootstrap Classloader用于加载JAVA的核心类库,Extension Classloader用于加载JAVA的扩展类库,而App ClassLoader则用于装载类路径中的用户自定义的类。具体的流程如下:...

2016-05-18 14:28:28 103

模板方法模式和回调模式

[code="java"]//模板模式----实现编程式事务管理abstract class TransactionTemplate{ public void transaction(){ beforeTransaction(); doInTransaction(); afterTransaction(); } private void beforeTra...

2016-05-03 15:35:13 224

JAVA并发-DCL与JMM

首先必须声明,[color=red]在volatile出现之前,错误的DCL代码如下。在volatile出现之后,正确的DCL代码如下[/color]。代码如下:[code="java"]//错误的代码public class Singleton { private static Singleton instance=null; private Singleton(){} pu...

2016-04-26 19:21:28 88

JAVA并发- 典型连接池的实现

[code="java"]package com.xyz.connpool;public interface IConnection { /** * 关闭当前连接 */ public void close(); /** * 销毁当前连接 */ public void destroy(); //应该具备的其他方法}[/code][c...

2016-04-22 10:44:35 116

数据库事务

[color=red]1 数据库事务的ACID属性[/color]原子性(atomic)  对于中包含的操作,要么全部执行,要么全部不执行。一致性(consistent)  事务在完成时,必须使所有的数据都保持一致状态。隔离性(insulation) 当多个事务并发执行的时候,不同事务之间数据的可见程度。持久性(durability)  事务完成之后,更改的数...

2016-04-17 21:25:24 66

JVM-常量池

学习JVM之后,发现对常量池的理解又深入了一些。下面就从JVM的层面去理解JAVA程序中那些常见的语句。读过笔者博客“JVM-类的生命周期“[url]http://yizhenn.iteye.com/blog/2290619[/url]的读者都应该已经知道,JVM在加载class文件时经历了装载,连接,初始化的过程,其中连接又包括验证,准备和解析。我们就来说说这个解析。[b]所谓解析,...

2016-04-15 20:17:12 72

原创 JVM-典型的垃圾收集器

从前面的博客知道,类实例化产生的对象在堆区中存储,而堆区不可能无限大,因此需要有垃圾收集器。[color=red]JVM的垃圾收集器干两件事:1 碎片整理:整理内存碎片2 垃圾回收:以某种算法发现垃圾,并使用某种算法清除垃圾。[/color][color=red]JVM常见的垃圾发现算法包括引用计数和追踪[/color]。其中,[b]引用计数[/b]就是为每个对象维护一个数字,这个...

2016-04-14 19:10:37 100

JVM-线程同步

在语言级别支持多线程是java语言的一大优势。之前的java并发系列博客中介绍了一些相关的基础知识。这里我们来看看java虚拟机对java多线程的支持。[color=red]JVM对多线程的支持有两种:1 互斥:通过对象锁来实现2 协同:通过Object类的wait,notify,notifyAll方法来实现[/color][color=red][b]关于互斥:[/b][/...

2016-04-14 08:58:06 57

JVM-对象的生命周期

当一个类型经历了装载,连接,初始化之后,就可以为这个类变量实例化一个对象了。在java中,一个类可以被显式或者隐式的实例化。显式实例化有四种方法:1 使用new操作符2 调用java.lang.reflect.Constructor的newInstance方法3 调用现有对象的clone方法4 通过java.io.ObjectInputStream的readObject方法反序...

2016-04-13 14:58:18 72

空空如也

空空如也

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

TA关注的人

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