坚信科学,分享技术

>>>尝试更加利于阅读的2014版科学院,以后都在新版上写。

Category Archives: java

这里有原创java教程,都是来自工作中的积累,有时候有些些弱。

disruptor thrift server连接参数与rps数值影响记录

基础环境 rmbp 8G MEM Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz 四核 八线程 oracle jdk 1.7.0_45 原理 如上图,是类似tomcat的nio实现过程,不过将queue换成了高性能的disruptor,可能会得到更好的性能。可调整参数为numAcceptors,numSelectors,numWorkersPerSelector三个值。 测试的代码位置在 https://github.com/54chen/disruptor_thrift_server 项目中的BenchmarkTest同时启动一个server,同时对其进行压测。 AbstractDisruptorTest.Service类中实现了server的逻辑,里面实际上是一个加减乘除的简单方法,故意加了300ms的sleep以尽可能模拟真实的消费时间。 BenchmarkTest类中实现了client的压力逻辑,固定了200个线程同时死循环地进行访问,同时进行计数统计rps。 调整记录 1.A(cceptors):4 S(electors):2 W(orkersPerSelector):2 处理接入的线程数:4 处理调用逻辑的线程数:2 推荐是cpu的核数以上 每个处理逻辑上的worker数量:2 结果: Rate: 16 req/s Rate: 12 req/s Rate: 12 req/s …

Continue reading

Posted in java | Tagged , | 2 Comments

Cassandra的thrift用法学习手记

__English Version__The notes about the usage of Thrift in Cassandra Cassandra在client访问server cluster的时候使用了thrift,在cluster node间的通讯,依旧是自己实现的二进制协议。 先决条件 thrift 0.9.1 mac libthrift-0.9.1 Cassandra 2.0.3 本文所涉及的代码:https://github.com/54chen/cassandra-thrift 看代码 thrift的定义:server的逻辑实现代码叫做Processor,创建的等待socket代码里叫做Transport,最后启动的进程叫做Server,大致就会有要启动一个thrift server,需要有一个socket(Transport)和一堆逻辑(Processor)。 这里有一篇2011年写的thrift入门手记:http://www.54chen.com/java-ee/thrift-quick-start.html 示例代码中以TNonBlockingServer来举例。TNonBlockingServer是采用libevent lib实现的一种thrift内置的server类型,理论上是最快的一种。 CustomTNonBlockingServer Cassandra并没有默认使用这种类型的server,默认的是基于TServerTransport连接完成的CustomTThreadPoolServer(自行实现了连接池)。 以示例代码为例: Cassa

Continue reading

Posted in java | Tagged , | 1 Comment

java 1.6.0_38-b05 vm 20.13-b02优化手记

基础: 业务代码 rose框架(底层是spring) resin4 java 1.6.0_38-b05 centos 初始配置: 只修改了以下三个值 -Xmx5000M // max的heap的大小。 -Xms5000M // min的heap的大小,就是一初始给的大小,不够先GC,还不够再加,直到max。 -Xmn2000M //young区的大小,一般来讲:heap=Y+O,P是额外的值。Sun推荐Y=heap*(3/8)。 gc情况解读: # jstat -gcutil 20538 1000 100 S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 51.96 62.53 73.42 99.93 35830 …

Continue reading

Posted in java | Tagged | Leave a comment

线上jvm进程CPU load高排查脚本-jkiller

jkiller 如果遇到线上java进程占用过多的cpu,可以用这个脚本来帮助你快速找到代码的问题。 https://github.com/54chen/jkiller 使用过程 先用top或者是jps定位占用cpu过多的java进程的pid是多少。 然后执行如下过程即可得到结论: #wget https://raw.github.com/54chen/jkiller/master/jkiller.sh && chmod +x jkiller.sh #sh jkiller.sh [pid] *centos系统下测试通过。

Continue reading

Posted in java | Leave a comment

Testing and Mocking in spring2.5: Static class、maven site、cobertura

spring 2.5 与 junit 4.4 Spring 2.5.x不能用JUnit 4.5+.如果把使用了spring-test 2.5 的testcase升级到 junit 4.5会得到NoClassDefFoundError: org.apache.maven.surefire.booter.SurefireExecutionException: org/junit/Assume$AssumptionViolatedException; nested exception is java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException java.lang.NoClassDefFoundError: org/junit/Assume$AssumptionViolatedException 这是spring-test 2.5.x的一个bug. 其与JUnit 4.5不一致. 只能使用4.0-4.4. 或者就是自己打patch. http://jira.springframework.org/browse/SPR-5145 EasyMock 与 static Class EasyMock未提到是否支持static methods.功能类经常是static的,是因为没有上下文环境依赖,但如果一定要mock他们,可以选择powerMock. PowerMock、static Class、junit、spring PowerMock 需要你添加 '@RunWith(PowerMock

Continue reading

Posted in java | Tagged , | Leave a comment

利用h2database和easymock轻松不依赖环境单元测试(rose等spring环境万能)

前言 写java时间久了,慢慢就变得自信了,也可能是变得懒了,或者是项目进度的原因,test case越写越少,越来越不写了。 还有一个很大的原因是,DB环境不好搞,老是有垃圾数据,依赖的东西太多,有memcache、有别人的服务,等等等等,都是没有test case良好的理由。 下面将以rose环境下,使用easy mock搞写第三方依赖和h2database搞写DB环境为例子,简单讲述如何轻松测试。 完整代码可以在 https://github.com/XiaoMi/rose 下载到。 依赖的包介绍 spring-test:提供一些基础的spring环境的支持,如果你不是spring环境,可能不需要。 h2:一个内存数据库,使用它的原因是,我们的业务大多数时候使用的都是mysql,而h2有一个mysql模式,可以支持绝大多数的mysql的SQL语句。 easymock:以前在五四陈科学院提到过的利器,用来模拟各种调用的工具。 pom定义为:       <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-test</artifactId>       &l

Continue reading

Posted in java | Tagged , | 5 Comments

zookeeper客户端curator使用手记

一、简介 curator是Netflix公司开源的一个Zookeeper client library,用于简化zookeeper客户端编程,包含一下几个模块: curator-client - zookeeper client封装,用于取代原生的zookeeper客户端,提供一些非常有用的客户端特性 curator-framework - zookeeper api的高层封装,大大简化zookeeper客户端编程,添加了例如zookeeper连接管理、重试机制等 curator-recipes - zookeeper recipes 基于curator-framework的实现(除2PC以外) 从github和maven上的消息来看,1.0.1的版本已经十分稳定,相对应的zk版本是3.3.x,还在开发中的版本是1.1.x,对应的版本是zk3.4.x。 二、依赖 <dependency>               <groupId>com.netflix.curator</groupId>               <artifactId>curator-framework</artifactId

Continue reading

Posted in java | Tagged , | 3 Comments

rose手册第三章C节:DAO层:分表设置

欢迎顺利进入本章,如果您的企业需要这一节的内容,那么说明用户量很有前途,如果使用了本节的内容,不防向czhttp@gmail.com发信一封以表谢意,我们会很高兴收到各种反馈。 3.C.1 mysql分表的常规做法 以下是个人从业经验中的分表规则: 按照 id % 100 分为一百份 按照 id % 16 分为十六份 按照 id/10 % 10 分为十份 按照 id%10 分为十份 以上分表规则特别在mysql中使用机会比较多,各有优势,没有对错,只有最好与最不好用。 3.C.2 使用分表第一步:添加新的依赖 要使用分表,需要添加新的依赖,由bmw提供的bmwutils。 <dependency>       <groupId>com.54chen</groupId>       <artifactId>bmwutils</artifactId>       <version>0.0.2</version>   </dependency>   3.C.3 使用分表第二步:设置applicationContext.xml分表规则 在开写代码之前,需要告诉DAO是哪个表需要分表,按照什么规则分,分多少份。 <!

Continue reading

Posted in java | Tagged | 12 Comments

rose手册第三章B节:DAO层:DAO进阶:SQLParm支持和表达式SQL

3.B.1 SQLParam介绍:DAO方法传递参数 SQLParam作为DAO支持中的参数传递使者,可以传递一个常见的变量,也可以是一个自定义的对象。 比如: @SQL("insert into test (id,msg) values (:t.id,:t.msg)")    public void insertTest(@SQLParam("t") Test test);   上列中Test对象通过t传递到sql执行中去,并且可以分别使用其中的属性。这感觉是不是很自然? 当然,如果是一个int、long、String等自在不言中。 当是list时,会有自动的batch操作,将sql拆为多条sql执行。这个小技巧会在后面的章节里讲。平时很少用到。 3.B.2 ReturnGeneratedKeys介绍:返回刚刚插入的ID号 特别是使用mysql开发的广大劳苦大众,常常会使用到auto_increament的字段。 当一条insert语句在执行的时候,我们常常会去需要拿它的当前的自增id是多少。 @ReturnGeneratedKeys   @SQL("insert into test (id,msg) values (:t.id,:t.msg)")   public&nbs

Continue reading

Posted in java | Tagged | 30 Comments

rose手册第三章A节:DAO层:DAO的基本配置与使用

本章开始进入对DB层的支持,同进也是日常开发用得最多的章节。 3.A.1 什么是jade? jade大概是java access data layer的意思吧,具体的来由,在章节写到末尾的时候,我再找qieqie和liaohan大侠们写一写编年史。 用jade的好处在于,尽可能减少重复的从db把数据对bean进行装配的过程,统一入口,隔离业务逻辑,方便review。 jade是在spring完成的数据层的良好实践总结,无缝接入rose中,可以算得上是rose亲密无间的好模块。 3.A.2 引入基础配置 要开始使用jade,一定要先引用jade的基础包: pom.xml <dependency>       <groupId>com.54chen</groupId>       <artifactId>paoding-rose-jade</artifactId>       <version>1.1</version>   </dependency>   除了需要jade的包外,还需要引入数据源连接池的jar,这里使用了dbcp,还是在pom.xml中: <dependency>   &

Continue reading

Posted in java | Tagged | 23 Comments
Page 1 of 812345...Last »