- 博客(60)
- 资源 (9)
- 收藏
- 关注
原创 如何学习一种技能(总结)
学习任何一种技能的最好方式都是实际去做,这是被广泛认同的观点。但是当我们想学习一种新的技能,或者想要提高一种技能时,往往并没有实际的迫切需求,那么该怎么办呢?一种方式是被动的等待,等着有这种需求的时候自然会有学习的机会了。有没有更主动的方式呢?想要去探寻主动的方式,我们必须从研究如何学习是最高效的开始。首先是需求,迫切的需求造成学习的动力与专注力。如果不是迫在眉睫的需要大多数人往往不能专注去做
2017-10-09 22:06:54 1598
原创 JVM 堆内存调优
最近我的服务器的因为在tomcat7放了比较多的项目所以JVM内存不够用了,报OutOfMem java heap size 的异常。很显然需要对tomcat的JVM堆内存重新进行设置。我的服务器是买的阿里云的服务,单核2G内存,因为不需要跑太复杂的应用,所以这足够了。从GC日志看到当前的新生代大小为87M, 老年代大小为126M。重新设置JVM堆内存大小,需要设置以下参数:1
2017-02-25 22:21:32 583
原创 性能优化(四)高CPU利用率
还是上一篇中提到过的API,通过调查我们发现这个API在需要返回的数据量比较大的有些单次调用中CPU可能达到90%到100%。所以即便是调用量不大的情况下,这个API一样是造成整个系统性能低下的最大贡献者。其中有一次调用返回时间更是长达10s。其实CPU的使用率高的话,响应时间自然就长,需要很长时间的计算才可以返回。优化的思路还是把单个查询分成多次,降低每次返回的数据集的大小。数据量比较大的表
2016-12-28 20:33:58 1807
原创 性能优化总结(三)一对多join的级联查询
最近在对一个已经运行了4年的老项目进行性能优化,这是一个app,我主要还是从后台优化。这个项目后台提供的API并不多,只有十几个,但是性能非常差。有些API连每分钟2000的request都扛不住,虽然后台的并发node已经增加到8个。一看代码就知道为什么了,原来这些API都需要返回很多的数据,而且是级联的数据,就像你要获得一个“军”的数据,“军”下面又有“师”,然后是旅团营连排,这样的树状结构,
2016-12-23 21:20:00 3005
原创 性能优化总结(二)
今天优化一个存储过程,这是一个关于查询的存储过程,因为需要查询的数据比较多,所以写了存储过程,比较耗时的是1. 需要join很多表,2.需要进行多次排序计算排名,3.需要进行计算得到一些平均值,4.有个复杂的查询需要循环处理。由于做其他接口的时候意见将排名信息预先计算并保存所以第二步算是省下来了。这个存储过程很慢,开始的时候想到可能是循环的原因,用游标做了循环。想了很久终于想到了如何用join
2016-12-15 21:25:13 466
原创 性能优化总结
最近都在进行性能优化,做个总结。首先要说的是一个新的项目,这是一个原有网站,现在加app的项目,原来的网站是收购其他公司的,老项目了。这个项目坑的地方就在于表结构非常复杂,或者说设计的不好,表结构成了一大障碍。由于大多数接口都是查询所以用了MyBatis,Sql 几乎都是自己写的,每个查询都需要join很多表。说到join,我的原则一般是不去做一对多的join,尽量确保join后面是uniqu
2016-12-14 20:57:13 475
原创 /dev/xvda1 占满
最近tomcat总是奔溃,通过df查看后发现,/dev/xvda1占满了通过du --max-depth=1 -h / 查找大文件,发现/var/lib很大,逐级查看,发现最近安装的jenkins下面有个日志文件很大,果断删除,释放了30%的磁盘空间。另外通过du命令还发现mongodb也很占磁盘。
2016-10-16 16:05:49 4920
原创 ubuntu 安装jenkins
使用以下命令:wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list's
2016-09-05 22:50:16 526
原创 Spring AOP 实践(五)基础篇下
Spring支持的AspectJ切入点指示词:execution:匹配一个方法的执行,最常用的一个;within:匹配在一个包或者类型中;this:匹配一个这个类型的proxy;target:匹配一个这个类型的目标对象--被代理的对象;args:匹配一个方法,参数是这个类型;组合切入点:@Pointcut("execution(public * *(..))
2016-08-25 21:48:39 332
原创 Spring AOP 实践(四)利用annotation实现声明式服务
上一篇中说到Spring AOP的一个重要作用是提供声明式企业服务,比如著名的声明式事务处理。声明式企业服务真的很诱人,可以少写很多代码啊!就好像一句魔法就可以搞定一切。AOP中可以用annotation来作为切入点的判断条件,比如@Transactional作为切入点,凡是声明了这个注解的方法都会被应用到事务处理的advice。今天我要用annotation和AOP来实现缓存的读取和存储
2016-08-23 21:44:05 476
原创 Spring AOP实践(三)基础篇上
在Spring AOP实践(一)中已经总结了一些基础知识。AOP作为OOP的补充,完整了编程实践的方式。虽然java以面向对象语言著称,但是也不能总是言必设计模式。面向对象设计的基本模块化单元是类,而AOP的基本模块化单元是切面(aspect)。在Spring AOP实践(一)中讲到,AOP要解决的问题是“遇到某某情况,就做某某事”,放到AOP中就是预定好在某种情况下拦截某个方法,并且做什么事
2016-08-23 20:41:13 398
原创 Spring AOP实践(二)编程篇
上一篇泛泛的讲了很多关于AOP和代理的理解,实现原理,动态和静态代理的比较,如何选择等。这篇讲到如何实践。Spring的AOP很容易使用,查看Spring文档即可。http://docs.spring.io/spring/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#aop我这里要用Spring A
2016-08-22 21:08:45 526
原创 Spring AOP实践(一)动态代理和静态代理,为什么使用AOP
作为Spring仅次于IOC的第二大代表功能,AOP的应用就不是很广泛了。众所周知AOP是面向方面编程,是对面向对象编程做出补充的一种编程方式。AOP使得编程人员可以把分散在代码各个地方的相同功能抽象到一处进行处理。任何方法的出现都是因为有着广泛的需求,比如在编程的过程中你总会想:凡是遇到某某情况,就做某某事。这就是AOP所要解决的问题,凡是遇到某某情况,这里的某某情况就是切入点,而“就做某某事”
2016-08-22 20:39:41 5112
原创 Error Code: 1235. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
最近遇到一个需要在in里面写limit子查询的情况,然后执行SQL的时候就遇到这个错误:Error Code: 1235. This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery',比如查询是:select * from owner_ship where owner_id in (selec
2016-08-17 07:40:37 1110
原创 mysql 查询缓存
mysql参考文档中关于query cache的配置的说明:http://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html与查询缓存相关的参数一共有3个,第一个就是have_query_cache,如果只是看到这个值设置为YES就觉得查询缓存开启了就大错特错了。默认情况下这个值一直都是YES。另外两
2016-08-08 21:00:56 389
原创 mysql explain join types
explain 命令可以很清晰的展现sql 语句的执行计划,对于优化SQL语句很有帮助。在我看来执行计划中最有用的两列莫过于type和rows。rows很好理解就是这个查询遍历的行数,当然是越少越好了。type列就是指join type,也就是本文要尝试阐述的。mysql的使用文档中有对join type的解释:http://dev.mysql.com/doc/refman/5.7/en/
2016-08-08 15:29:52 571
原创 java GC 日志查看 gcviewer
要查看GC日志首先要知道GC的log放在哪里,使用jps命令查看当前有哪些java进程在运行,找到我们要查看的java程序的进程pid使用命令jinfo pid 来查看这个进程对应的java 信息,可以看到大概在最下面的地方有个参数-Xloggc:,他对应的就是gc log的位置。
2016-08-04 22:48:15 12412
原创 一个因为SQL join引发的内存泄露
最近公司的一个系统频繁的发生内存泄露,把server上的dump文件下载下来打开却是损坏的。用Jconsle监控server发现,线程的数量和内存的使用率都在不断上升。服务器重启后还好,运行一天之后就会发现线程数量很多,内存使用率很高,监控GC的日志发现full GC一直被调用,然后空间不能得到释放,主要是metaspace。然后这个版本和上个版本之间唯一的区别就是几个native sql。在
2016-08-03 15:32:23 1186
原创 一次简单的SQL语句优化
最近写了一个查询语句,为了做这个查询创建了一些view,最终的view中包含了另外两个view。这个SQL的查询要传入一个条件语句,最后发现这个SQL语句会随着数据量的增加而越来越耗时。即使为所有可以创建索引的地方都已经创建了索引也没有用。用explain解释之后发现这个语句在执行其中的子查询时是查询了全表的。也就是说条件语句的传入不会影响到子查询,子查询并不会去使用索引。直接使用普通的SQL
2016-07-31 18:18:32 393
原创 SQL 行转列的一些思考
如果项目本身就是分析性大于事务性的,那一开始的设计就会把数据库设计成分析性的。但是如果一开始是设计成事务性的,我们必然也有需求做一些分析性的工作-单纯事务性的项目比较少。那这种时候我们就需要把这种事务性的表向分析性做一些转化。view可以很好的起到这个作用,既不用重新建表,又可以建立新的表结构。view都是建来做查询的,所以view的创建一定要考虑很好的满足分析性。 语文数学尼玛10020铁锤10099一般我们设计关系型数据库的表会把这种关系设计成三张表,学生表,课
2016-07-30 23:23:15 435
原创 关系型数据库设计
对于一般的依赖于关系型数据库的项目来说,数据库的设计决定了软件项目的复杂度,以及性能等方面。最近很多项目的经验都是感觉被数据库的设计给坑了,这里面有自己设计的,也有别人设计的。总之数据库的设计非常重要,所以不得不对它有所思考。说起数据库设计,首先不免想到三大范式,然而三大范式并不完全涵盖数据库设计的各个方面。三大范式只说了一件事,就是表的列要有充分的原子性,要够单纯。第一范式说列必须是原子的;
2016-07-22 23:21:53 503
原创 数据访问层的性能优化
本文只是自己项目的经验总结。目前自己独立做的一些项目都是采用传统的MVC模式,采用Spring MVC+Hibernate+Mysql 开发,Request的调用层次是Controller 调用Service 调用DAO。项目的成品部署在自己的阿里云上面,配置是单核+2G内存。因为服务器的配置较低,所以就对程序的性能也做了一些优化,算是有一些思考。做过几个项目之后发现,首先数据库结构的设计
2016-07-22 15:23:37 589
原创 Spring-boot 配置log4j
在使用Spring-boot的项目中使用log4j只需要在src/main/resources目录下加入log4j.properties,当然前提是有log4j的jar包进入pom.xmllike this: org.springframework.boot spring-boot-starter-log4j不过spring-boot-starter-web中已经
2016-05-28 20:47:43 567
原创 maven创建项目命令
创建web项目mvn archetype:create "-DgroupId=com.viking" "-DartifactId=passport" "-DarchetypeArtifactId=maven-archetype-webapp" "-DinteractiveMode=false"创建普通java项目mvn archetype:create "-DgroupId=c
2016-05-26 21:20:26 1180
原创 Hibernate Session cache
Hibernate 的缓存有三种,Session级别的缓存,也可以说是事务级别。对当前事务中的对象进行缓存,不同的事务有不同的缓存。查询缓存,查询缓存是所有事务共享的,是为了减少查询的数据库操作,以查询语句和参数值为key。Second level cache, 二级缓存,为了在事务直接共享对象。比如事务1已经从数据库获得对象A,事务2用这个ID再去查找直接从二级缓存返回。Sess
2016-05-26 16:33:00 424
原创 JSONP -- one way of cross-domain data sharing
要说清楚JSONP首先得说Same-origin policy,同源策略。为了安全起见,两个不同得网站之间是不能访问对方的数据的,比如A站的cookies不能被B站访问。但是如果这两个网站是相同domain的,比如是同一个公司的网站,那彼此访问是没有问题的,因为是可信任的。就像同domain的OOS(单点登录)的实现可以用cookie来实现一样。这样的domain,或者说Same-origin
2016-05-09 21:13:59 2389
原创 servlet Filter
最近要在一个老的项目上实现一个功能,在登录前检查用户是否已经同意了最新的免责协议(免责协作在用户注册后可能有变化),如果没有的话会跳出一个免责协议的页面要求用户同意。因为这个是个老的项目,基本都是用servlet加jsp实现的,所以我第一个想到的是用Filter拦截登录的url,然后检查用户是否已经同意了最新的免责协议,没有的话,forward到免责协议的页面,用户同意后再把之前的登录请求和当枪请
2016-05-05 22:39:08 494
原创 Hibernate lazy load
项目中使用了很多many-to-one的映射,刚开始的时候不加lazy=false会报这个错误 could not initialize proxy - no Session加上lazy=false确实没有报错了,但是后来做性能测试的时候确确实实为此感到羞耻,因为每次都会有很多无用的sql执行。下定决心去掉lazy=false,Spring提供了OpenSessionInViewI
2016-05-04 23:04:59 907
转载 Top 20+ MySQL Best Practices
转载自:原文出处Database operations often tend to be the main bottleneck for most web applications today. It's not only the DBA's (database administrators) that have to worry about these performance issue
2016-05-03 16:54:11 587
原创 Spring IoC
本文的部分是直接翻译自Spring referenceInversion of Control (IoC)是一个对象借以定义它的依赖的过程,也就是与该对象协作的其他对象只通过以下方式实例化:1. 1. 作为该对象的构造方法的参数传入;2. 2. 作为工厂方法的对象传入;3. 3. 该对象被构造成功之后,设置到该对象的实例上。
2016-05-02 21:16:57 310
原创 Spring 事务管理笔记
本文大部分是对Spring reference的翻译,属于读书笔记/摘要:为什么要有Spring 事务管理,它的好处:为所有不同的事务API提供一致的访问方式。支持声明式事务管理。简化编程式事务管理。与Spring的数据访问抽象集成。 Spring事务抽象的关键式是事务策略。一个事务策略是由这个接口定义的:org.springframework.transact
2016-04-28 22:45:19 316
原创 Spring java-based configuration 配置transaction manager
项目中使用到了Spring-boot,我想用编程的方式来配置Spring 的transaction manager,开始的时候我配置了Hibernate的session Factory,和HibernateTransactionManager,在类名上加了@Configuration和@EnableTransactionManagement,程序运行的过程中提示有两个transaction man
2016-04-28 22:08:13 1117
原创 注解方式配置SessionFactory的注入
之前程序中的SessionFactory都是通过hibernate的方式获取的:Configuration().configure("hibernate.cfg.xml").buildSessionFactory();因为一些问题想要改成Spring注入的方式,但是我的程序都是使用的注解的方式注入bean,为了保持一致性还是用@Bean来配置SessionFactory首先
2016-04-26 23:05:41 3819
原创 hibernate c3p0 连接无法释放 阻塞数据库操作
最近写的一个项目,发现每次启动tomcat进行几个数据库操作后就会卡住,重启tomcat又可以继续用,几个数据库操作后继续不可用。在mysql中查询show processlist,发现这个项目的数据库有很多process在Sleep状态。关闭tomcat,重启mysql,让数据库中的进程恢复0。启动tomcat,这时候看到这个项目的数据库有5个连接,这是因为hibernate.cfg
2016-04-23 19:22:03 4608
原创 分布式处理 幂等设计
最近做的项目的性能调优中关于幂等设计的一些总结场景:假设有这样一个方法,保护了一些DB操作,check if existing then update else save. 如果两个线程同时去执行这个方法,并且他们处理的是同一条数据,期望应该是其中一个线程是save,另外一个是update。但是有可能线程的处理时间相当重合,线程A在check的时候,线程B也在check,这时A和B都认为数据不
2016-04-19 16:28:20 3414
原创 mysql 笔记
用的不多,用到的时候总是要去搜索,所以在这里记录一下,免得每次去找在Mac OS X启动和停止MySQL服务的命令启动MySQL服务sudo /Library/StartupItems/MySQLCOM/MySQLCOM start停止MySQL服务 sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
2015-03-02 11:17:04 380
原创 有一天人人都会变成程序员
算法+数据结构=程序设计,我上大学的时候流行的说法,后来有一位从企业转行做老师的愤青老师很激动的告诉我们,算法+数据结构+设计模式=程序设计,他大声喊道,设计模式才是王道,就好像一个智者在告诉我们这些土逼什么是真理。也是在那个年代,我见到了一部iphone 3S,一部区别于其他手机的高级货,那时候我甚至以为那不是个手机,可能是个PSP,但是有打电话的功能。后来我听说了一个叫Android的东西,据
2014-08-01 16:07:56 967
原创 设计模式及其学习方法的个人理解
设计模式往往被赋予神秘和神圣的光环,也经常作为面试的问题,区别你是初级开发人员还是中高级开发人员的一个方法就是问设计模式。设计模式也并不好学习,个人认为GoF的经典著作非常的难懂,这或许是因为他们站在非常高的位置上,他们的经验极为丰富,以致于如果你没有相关的经验,基本上跟他们不在一个频率上。市面上也有很多试图把设计模式叫的通俗易懂的书籍,不乏成功之作。而无论如何,如果你没有实际的经验,看再多的书也
2014-07-15 15:29:14 976
安卓signapk签名工具
2018-11-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人