Java 精华文章
文章平均质量分 94
猴哥_IT小菜鸟
三分天注定七分靠打拼 爱拼才会赢
展开
-
分布式事务之说说TCC事务
在当前如火如荼的互联网浪潮下,如何应对海量数据、高并发成为大家面临的普遍难题。广大IT公司从以往的集中式网站架构,纷纷转向分布式的网站架构,随之而来的就是进行数据库拆分和应用拆分,如何在跨数据库、跨应用保证数据操作和业务操作的一致性、原子性,又成为需要解决的新的问题。从分布式事务的需求来源来看:1、跨数据库数据库拆分(水平、垂直)带来的分布式事务->保证跨库操作的原子性基于单个JVM2、跨应用应用转载 2017-02-22 10:27:21 · 515 阅读 · 0 评论 -
Netty3 VS Netty4 之线程模型
下面小节我们就详细得对Netty3和Netty4版本的I/O线程模型进行对比,以方便大家掌握两者的差异,在升级和使用中尽量少踩雷。1 Netty 3.X 版本线程模型Netty 3.X的I/O操作线程模型比较复杂,它的处理模型包括两部分:Inbound:主要包括链路建立事件、链路激活事件、读事件、I/O异常事件、链路关闭事件等;Outbound:主要包括写事件、连接事件、监听绑定事件、刷新事件等转载 2017-02-22 10:56:25 · 214 阅读 · 0 评论 -
全面分析 Spring 的编程式事务管理及声明式事务管理
开始之前关于本教程本教程将深入讲解 spring 简单而强大的事务管理功能,包括编程式事务和声明式事务。通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之。先决条件本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解。您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等。本文将直接使用这些概念而不做详细解释。另外,您最好掌握转载 2017-02-22 10:55:53 · 369 阅读 · 0 评论 -
Tomcat 7服务器线程模型
Tomcat 7服务器网络处理主要由NioEndpoint,其处理客户端连接的主要流程如图所示图中Acceptor及Worker分别是以线程池形式存在,Poller是一个单线程。注意,与BIO的实现一样,缺省状态下,在server.xml中没有配置<Executor>,则以Worker线程池运行,如果配置了<Executor>,则以基于java concurrent 系列的java.util.con转载 2017-02-22 10:57:23 · 227 阅读 · 0 评论 -
SO_REUSEPORT学习笔记
前言本篇用于记录学习SO_REUSEPORT的笔记和心得,末尾还会提供一个bindp小工具也能为已有的程序享受这个新的特性。当前Linux网络应用程序问题运行在Linux系统上网络应用程序,为了利用多核的优势,一般使用以下比较典型的多进程/多线程服务器模型:单线程listen/accept,多个工作线程接收任务分发,虽CPU的工作负载不再是问题,但会存在:单线程listener,在处理高速率海转载 2017-02-22 10:57:56 · 352 阅读 · 0 评论 -
Netty4之Future/Promise异步模型
在并发编程中,我们通常会用到一组非阻塞的模型:Promise,Future 和 Callback。其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这个结果可以添加 Callback 以便在任务执行成功或失败后做出对应的操作,而 Promise 交由任务执行者,任务执行者通过 Promise 可以标记任务完成或者失败。 可以说这一套模型是很多异步非阻塞架构的基础。Netty 4中转载 2017-02-22 10:58:43 · 1235 阅读 · 0 评论 -
SQLServer JTDS 连接串格式
jTDS连接字符串格式(jTDS URL Format)jTDS连接字符串格式(URL Format):jdbc:jtds:<server_type>://<server>[:<port>] [/<database>] [;<property>=<value>[;…] ]其中,<server_type>取值可以是’sqlserver’或’sybase’(各自的意义相当明显),<port>为数据库服转载 2017-02-22 10:59:05 · 753 阅读 · 0 评论 -
DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较
DBCP、C3P0、Proxool 、 BoneCP等开源数据库连接池基本简介 简介 使用评价 项目主页 DBCPDBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用可以设置最大和最小连接,连接等待时间等,基本功能都有,此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性有所下降,此外不提供连接池监控h转载 2017-02-22 11:00:41 · 391 阅读 · 0 评论 -
深入理解JDBC的超时设置
恰当的JDBC超时设置能够有效地减少服务失效的时间。本文将对数据库的各种超时设置及其设置方法做介绍。 真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到DDos攻击后,整个服务都垮掉了。由于第四层交换机不堪重负,网络变得无法连接,从而导致业务系统也无法正常运转。安全组很快屏蔽了所有的DDos攻击,并恢复了网络,但业务系统却还是无法工作。通过分析系统的thread dump发现,业务系统停转载 2017-02-22 11:01:12 · 420 阅读 · 0 评论 -
BlockingQueue及其各个实现的分析整理
ThreadPoolExecutor类中提交任务到线程池分配线程执行任务使用到一个队列,而这个队列采用的就是BlockingQueue。BlockingQueue实际上定义了一个接口,在Java.util.concurrent包中给出了这个接口的一些常用实现,这篇我们整理一下。0. BlockingQueue简介BlockingQueue是java.util.concurrent包中的接口,扩展转载 2017-02-22 11:01:46 · 310 阅读 · 0 评论 -
DelayQueue原理分析
DelayQueue基本简介DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。DelayQueue是一个用来延时处理的队列,所谓延时处理就是说可以为队列中元素设定一个过期时间,相关的操作受到这个设定时间的控制。DelayQueue使用场景a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之转载 2017-02-22 11:03:00 · 249 阅读 · 0 评论 -
PriorityQueue深入解析
PriorityQueue介绍 在平时的编程工作中似乎很少碰到PriorityQueue(优先队列) ,故很多人一开始看到优先队列的时候还会有点迷惑。优先队列本质上就是一个最小堆。前面一篇文章介绍了堆排序和堆的性质。而堆又是什么呢?它是一个数组,不过满足一个特殊的性质。我们以一种完全二叉树的视角去看这个数组,并用二叉树的上下级关系来映射到数组上面。如果是最大堆,则二叉树的顶点是保存的最大值,转载 2017-02-22 11:03:29 · 244 阅读 · 0 评论 -
Jackson 工具类使用及配置指南
目录前言Jackson使用工具类Jackson配置属性Jackson解析JSON数据Jackson序列化Java对象前言Json数据格式这两年发展的很快,其声称相对XML格式有很对好处:容易阅读;解析速度快;占用空间更少。不过,JSON 和 XML两者纠结谁优谁劣,这里不做讨论,可以参见知乎上为什么XML这么笨重的数据结构仍在广泛应用?。最近在项目中,会有各种解析JSON文本的需求,使用第三转载 2017-02-22 11:06:01 · 994 阅读 · 0 评论 -
Java协程框架-Kilim字节码剖析
前面几篇文章从代码层面介绍了Kilim的基本原理,但是对于其中的一些细节,比如Task的执行状态如何管理等问题从代码上依然得不到答案,本文即再深入到字节码层面来解答。1. Kilim字节码改写前后的代码有什么区别?这里还是先上Kilim官方文档中的一张图,这张图清晰的展现出原始的代码与经Kilim改写后的协程代码。可以看出左边的原始代码,与我们常见的函数相比有所不同,这里显示声明抛出Paus转载 2017-02-22 11:06:44 · 347 阅读 · 0 评论 -
Java协程框架--Kilim框架Fiber浅析
1. Kilim中Fiber的作用Fiber主要作用用来管理和保存Task执行过程中调用层次中的函数栈帧的状态,这里的函数栈帧与JVM运行时中的函数栈帧是相同含义,但是Fiber不会将函数栈帧中的全部信息原封不动的镜像拷贝一份,比如局部变量表中的所有变量,而是经过代码分析之后有选择的暂存有必要保留的变量,一般只需要保存后续执行流程中需要用到的变量,例如静态常量等就无需保存到Fiber中,因为静态变转载 2017-02-22 11:07:36 · 1270 阅读 · 0 评论 -
Java协程框架--Kilim常见问题解答
1.Kilim中的Task,即用户线程如何调度和切换?在多任务的调度上操作系统存在抢占式和协作式两种方式,相比传统的Thread多线程间抢占式调度,Kilim中的Task采用的是协作式调度,即由Task本身负责释放和恢复占用CPU。2.Kilim如何识别代码中哪些方法是Pauseable,可暂停的?通过Kilim提供的Weaver工具在代码编译后,对编译生成的字节码进行分析,识别哪些方法抛出P转载 2017-02-22 11:08:38 · 402 阅读 · 0 评论 -
Maven部署构件到Nexus时出现的Failed to transfer file错误
我们在项目pom.xml文件中对maven服务器的设置信息如下: <distributionManagement> <repository> <id>nexus-releases</id> <name>Local Nexus Repository</name> <url>http://192.168.1.99:8081/cont转载 2017-02-22 11:13:33 · 1072 阅读 · 0 评论 -
Java文件映射共享内存
前言我们在平时的工作中大多都会需要处理像下面这样基于Key-Value的数据:-其中UID是数据唯一标识,FIELD[1]是属性值。以QQ用户的Session为例,UID自然是QQ号,FIELD可能是性别、年龄、Session最后更新时间,上一个访问的URL等等。通常这些是要被频繁读写的,所以用C/C++的话通常的做法是使用共享内存划分出一大块内存,然后把它又分成同样大小的小块,用其中的一块或几块转载 2017-02-22 11:15:01 · 1316 阅读 · 0 评论 -
Java获取照片EXIF信息
EXIF是一种图象文件格式,它的数据存储与JPEG格式是完全相同的。实际上EXIF格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。 EXIF是Exchangeable Image File的缩写,这是一种专门为数码相机照片设定的格转载 2017-02-22 11:15:29 · 1995 阅读 · 0 评论 -
Maven核心配置文件
快速预览maven的配置文件为settings.xml,在下面路径中可以找到这个文件,分别为: —— M2HOME/conf/settings.xml:全局设置,在maven的安装目录下;——M2_HOME/conf/settings.xml:全局设置,在maven的安装目录下; —— {user.home}/.m2/settings.xml:用户设置,需要用户手动添加,可以将安转载 2017-02-22 11:16:33 · 1265 阅读 · 0 评论 -
HttpClient忽略证书访问HTTPS接口
HttpClient 如何忽略证书验证访问HTTPS接口,解决步骤如下:1. 设置可以访问HTTPSJava代码 /** * @Title: getNewHttpClient * @Description: Methods Description * @param @return * @return HttpClient * @转载 2017-02-22 11:16:58 · 2535 阅读 · 0 评论 -
HttpClient 4.3详细教程
前言Http协议应该是互联网中最重要的协议。持续增长的web服务、可联网的家用电器等都在继承并拓展着Http协议,向着浏览器之外的方向发展。虽然jdk中的Java.NET包中提供了一些基本的方法,通过http协议来访问网络资源,但是大多数场景下,它都不够灵活和强大。HttpClient致力于填补这个空白,它可以提供有效的、最新的、功能丰富的包来实现http客户端。为了拓展,HttpClient即支持转载 2017-02-22 15:30:25 · 464 阅读 · 0 评论 -
Maven deploy部署失败原因及解决
If an artifact fails to deploy from Maven (or other build tools) make note of the HTTP status code returned. Then check below to see what the code means, and how to diagnose and fix the issue.Code 40转载 2017-02-22 16:22:23 · 10504 阅读 · 0 评论 -
Protobuf与JSON互相转换
Javahttp://code.google.com/p/protobuf-java-format/maven配置[html] view plain copy print?<dependency> <groupId>com.googlecode.protobuf-java-format</groupId> <artifactId>protobuf-java-format</artifactId转载 2017-02-22 16:22:53 · 12215 阅读 · 0 评论 -
MySQL中emoji表情过滤
问题描述最近在对线上排错过程中发现很多入库时产生的错误日志,表现形态如下[java] view plain copy print?Incorrectstringvalue:‘\xF0\x9F\x91\x8D\xE6\x94…’forcolumn‘column_x’atrow1 Incorrectstringvalue:'\xF0\x9F\x91\x8D\xE6\x94...'forcolumn转载 2017-02-22 16:23:34 · 2246 阅读 · 0 评论 -
Maven+Nexus私服搭建
一、下载 直接通过官方下载最新的开源版,里面也有详细的安装教程。官方下载地址:http://www.sonatype.org/nexus/go二、安装 安装过程很简单,只需要把文件拷贝到某路径下即可。$ sudo mkdir -p /opt/nexus // 创建/opt/nexus/目录$ sudo chmod 777 /opt/nexus转载 2017-02-22 16:24:12 · 197 阅读 · 0 评论 -
Java协程框架--Kilim工作原理
Kilim要解决的问题Kilim协程框架中最核心需要解决的问题:如何暂停处理当前任务,转而处理其他任务?如何恢复任务继续执行?也即如何实现协程本身的 yield / resume的语义特性。Kilim的解决方案概括的讲,Kilim框架在实现这个语义特性时,干了以下几个事情:利用字节码技术(基于ASM字节码框架),将普通代码转化为支持协程的代码;调用Pauseable方法的时候,如果暂停了就转载 2017-02-22 16:24:59 · 446 阅读 · 0 评论 -
Java协程框架--Kilim源码分析
Kilim 是一个用于在Java 协程框架,Kilim协程框架的结构图如下:1. Task可以认为Task 就是Actor,使用方式和Java Thread 基本相同,只是继承的为Task,覆盖的为execute 方法,启动也是调用task 的start 方法。[java] view plain copy print?public Task start() { if (schedul转载 2017-02-22 16:25:36 · 445 阅读 · 0 评论 -
协程简介
关于协程的概念,其实由来已久,在介绍协程的概念之前先简单回顾下我们通常使用到的例程、线程等概念。例程(Subroutine)例程的概念类似于函数,但含义更为丰富一些。例程是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是例程;C语言运行时提供的标准库函数等也是例程。Pthreads库提供的一套线程相关的API也属于例程。通俗的理解,一个子例程就是一次子函数调用,只不过相对转载 2017-02-22 16:26:06 · 207 阅读 · 0 评论 -
剖析Disruptor为什么会这么快?神奇的缓存行填充
计算机入门我喜欢在LMAX工作的原因之一是,在这里工作让我明白从大学和A Level Computing所学的东西实际上还是有意义的。做为一个开发者你可以逃避不去了解CPU,数据结构或者大O符号 —— 而我用了10年的职业生涯来忘记这些东西。但是现在看来,如果你知道这些知识并应用它,你能写出一些非常巧妙和非常快速的代码。因此,对在学校学过的人是种复习,对未学过的人是个简单介绍。但是请注意,这篇文章转载 2017-02-22 16:26:45 · 287 阅读 · 0 评论 -
从Java视角理解伪共享
从前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问题更容易犯, 连j.u.c包作者Doug Lea大师的JDK代码里也存在这些问题.MESI协议及RFO请求从前一篇我们知道, 典型的CPU微架构有3级缓存, 每个核都有自己私有的L1, L2缓存. 那么转载 2017-02-22 16:27:30 · 394 阅读 · 0 评论 -
Java NIO 内存映射文件实现进程间通信
一看到 Java NIO 的内存映射文件(MappedByteBuffer),让我立即就联想到 Windows 系统的内存映射文件和Linux系统上的共享内存技术。Windows 系统的内存映射文件能用来在多个进程间共享数据,即进程间的共享内存,是通过把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存。Java NIO 的内存映射文件和 Windows 系统下的一样,都能把物理文件的内容映转载 2017-02-22 16:28:05 · 440 阅读 · 0 评论 -
HotSpot和OpenJDK入门
在本文中,我们将会介绍如何开始使用HotSpot Java虚拟机以及它在OpenJDK开源项目中的实现——我们将会从两个方面进行介绍,分别是虚拟机和虚拟机与Java类库的交互。HotSpot源码介绍首先让我们看看JDK源码和它所包含的相关Java概念的实现。检查源码的方式主要有两种:现代IDE能够附加src.zip(在$JAVA_HOME目录),能够从IDE中访问使用OpenJDK的源码并导航到转载 2017-02-22 16:28:39 · 2660 阅读 · 0 评论 -
JVM底层如何实现synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一转载 2017-02-22 16:29:12 · 300 阅读 · 0 评论 -
短小精悍的虚拟机:JVM基本结构和功能介绍
什么是JVM?为什么要有它?JVM(Java虚拟机)是一个运行已编译Java程序的抽象计算机。之所以说是”虚拟“的,是因为它基于“真正”的硬件平台和操作系统,一般以软件的形式实现。所有的Java程序都为JVM而编译。因此,在特定平台上运行已编译Java程序之前,该平台的JVM必须先要被实现。JVM在Java的跨平台特性中,起着中间人的角色。它在已编译Java程序与底层硬件平台和操作系统之间,提供一转载 2017-02-22 16:29:39 · 269 阅读 · 0 评论 -
漫谈Java理念的转变与JVM的五大优势
Sun在今年曾经表示自己的重点关注对象是Java平台而非Java语言,而Java平台整个的寄托就是JVM。计划明年推出的JVM 7将会投入很大精力在对其他语言(尤其是动态语言)的天然支持上,而EngineYard也表示JRuby将在自己的战略中占据重要地位。当Java最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还转载 2017-02-22 16:30:06 · 402 阅读 · 0 评论 -
JVM处理Java数组方法的思考
在Java中,获取数组的长度和String的长度是两种不同的方法,这引起了本文作者的一番思考。本文从JVM的角度,探讨了Java数组在JVM中是什么对象,有哪些成员,以及声明方法。记得vamcily 曾问我:“为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(成员方法的形式)?”我当时一听,觉得问得很有道理。做同样一件事情,为什么采用两种风格迥异转载 2017-02-22 16:30:31 · 238 阅读 · 0 评论 -
Java 7中的TransferQueue
Java7中加入了JSR 166y规范对集合类和并发类库的改进。其中的一项是增加了接口TransferQueue和其实现类LinkedTransferQueue。TransferQueue继承了BlockingQueue(BlockingQueue又继承了Queue)并扩展了一些新方法。BlockingQueue(和Queue)是Java 5中加入的接口,它是指这样的一个队列:当生产者向队列添加元素转载 2017-02-22 16:30:56 · 290 阅读 · 0 评论 -
Java 8 新特性全搜罗
经过2年半的努力、屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本。 Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码;其次,新加入的Nashorn引擎也使得Java程序可以和JavaScript代码互操作;再者,新的日期时间API、GC改进、并发改进也相当令人期待。 另外,原本要加入Java 8的Jigsaw项目(转载 2017-02-22 16:31:25 · 270 阅读 · 0 评论 -
Java 7 的新特性一览表
JSR292:支持动态类型语言(InvokeDynamic)图 1. 项目图标--达芬奇设计的直升机近年来越来越多的基于 JVM 的动态语言的出现,对于 JVM 提出了新的需求和挑战。其实在 JDK6 中就已经支持 JSR223:Java 平台上的脚本语言,通过一个脚本语言引擎在 JVM 上执行 JavaScript 等脚本语言。但由于 JVM 本身的设计原来是针对 Java 这种静态类型语言的,转载 2017-02-22 16:31:54 · 310 阅读 · 0 评论