2013年11月8日

28. 代码实例-spring组件配置化-使用注解

摘要: spring的核心思想就是程序整体松耦合的组件化,每个组件可以通过修改配置来改变参数,适合做配置参数的是指在程序运行中不随意改变的参数,改变后一般需要重启程序(如线程数)。一般通过xml,在使用注解时,想要通过修改配置来改变参数,就需要利用配置文件。(1)spring配置 1 2 12 13 14 15 16 classpath:important.properties17 classpath:important2.properties18 19 ... 阅读全文

posted @ 2013-11-08 16:46 关攀攀 阅读(425) 评论(0) 推荐(0)

25. 代码实例-单元测试

摘要: (一)数据库层使用集成测试 1 29 /** 30 * 测试订单任务数据库访问 31 * @author guanpanpan 32 * 33 */ 34 @RunWith(SpringJUnit4ClassRunner.class) 35 @ContextConfiguration(l... 阅读全文

posted @ 2013-11-08 16:43 关攀攀 阅读(376) 评论(0) 推荐(0)

24. 常用的多线程使用方式总结

摘要: (1)总论1.可以不用多线程最好不要用2.如果可以不共享数据最好不要共享3.服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量因为数据库访问等待造成线程等待时间长比较长见,下面的例子就是以数据库数据迁徙程序说明。常用模式(2)分几个线程处理不同数据适用场景:数据可以容易的分开处理 1 package me.jdk.thread; 2 3 import java.util.concurrent.CountDownLatch; 4 import java.util.concurrent.ExecutorService; 5 import java.util. 阅读全文

posted @ 2013-11-08 16:42 关攀攀 阅读(282) 评论(0) 推荐(0)

38. linux

摘要: 文件相关下载文件:sz 上传文件 rz 删除文件:rm rm -rf *拷贝:cp –r d1 d2移动:mv file.exe /toolsll, ls -l 文件信息查看文件大小:du 文件名vi /etc/hostspwdtouch catalina.outchown -R tomcat.tomcat *chown -R admin.admin *查看大小:df -hdu --max-depth=1 -htomcat相关vi /etc/hostsln -s /export/home/tomcat/domains/server22/bin/start.sh start.shsh /expo 阅读全文

posted @ 2013-11-08 16:41 关攀攀 阅读(226) 评论(0) 推荐(0)

29. 代码实例-设计模式-模板方法

摘要: (1)接口 1 12 public interface DataLock {13 14 /**15 * 从数据库中查询一定数量的OrderTask,并进行lock,lock到指定条数就返回,如果lock不到就返回空集合16 * @param modeSize 总模数17 ... 阅读全文

posted @ 2013-11-08 16:40 关攀攀 阅读(178) 评论(0) 推荐(0)

30. 代码实例-设计模式-回调方式使用模板方法

摘要: 1)模板类package com.jd.consume.dao.mysql;import java.sql.SQLException;import java.util.Collection;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.ibatis.sqlmap.client.SqlMapClient;/** * 批量更新数据 * @author guanpanpan * * @param */public abstract class BatchUpdate { public final stati... 阅读全文

posted @ 2013-11-08 16:39 关攀攀 阅读(255) 评论(0) 推荐(0)

27. 代码实例-spring声明式事务

摘要: (1)spring配置文件: 1 2 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 30000033 34 35 1036 37 38... 阅读全文

posted @ 2013-11-08 16:38 关攀攀 阅读(241) 评论(0) 推荐(0)

26. linix脚本启动java程序

摘要: (1)linux脚本文件: 1 #!/bin/bash 2 3 export JAVA_HOME=/opt/jdk1.6.0_21 4 export PATH=$JAVA_HOME/bin:$PATH 5 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 6 baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd) 7 LIB_CP=:""$baseDirForScriptSelf""/WEB 阅读全文

posted @ 2013-11-08 16:33 关攀攀 阅读(266) 评论(0) 推荐(0)

37.1. 数据库设计

摘要: 数据库设计从业务数据冗余程序三个角度考虑,业务来确定相关的实体,实体和表之间是有映射关系的,可以是一个表一个实体,也可以是几个表一个实体。所有的表或者对应实体或者是纯粹的关系表。考虑关系表是不是应该升级成一个实体表,要从业务上来判断,几个实体要不要合成一个实体要考虑实体的生命周期和业务含义。数据冗余是发现数据库设计问题的一个突破口,但怎么消除冗余还是要从实体之间的关系来考虑。具体来就是该不该合成一个表,还是从两个中抽离一个表,两个表再指向抽离的表等变更方式,如果从业务实体的角度可以决定,那就用业务实体来决定。有的时候业务实体会表现出两种设计都说的过去的情况,这时就要从程序开发的角度怎么简单方便 阅读全文

posted @ 2013-11-08 15:54 关攀攀 阅读(202) 评论(0) 推荐(0)

26. 23种经典模式

摘要: 对变化的封装,分离变化。创建型Abstract Factory一系列相关对象的创建。不同产品,有相同的系列。Builder同样的构建过程可以创建不同的表示Factory Method(类)子类进行实例化Prototype通过原型实例拷贝创建新对象Singleton一个类只有一个实例结构型Adapter转换接口Bridge抽象的实现分离Composite树形,整体和部分一致对待Decorator动态添加职责,有本体和装饰器实例:商品拆单,按商家,按库房,又加入按商品,metric监控等。(注意和责任链的关系)Facade子系统提供统一接口。1.了解少。2.子系统易变化Flyweight共享细粒度 阅读全文

posted @ 2013-11-08 15:51 关攀攀 阅读(349) 评论(0) 推荐(0)

27. 编程中常见的其它模式

摘要: (一)事件处理模型发布事件,轮询线程来取得事件进行处理,如Swing(二)生产消费模型线程的协作方式,用来避免无效轮询(三)回调模板模型模板方法的一种简单写法 阅读全文

posted @ 2013-11-08 15:49 关攀攀 阅读(173) 评论(0) 推荐(0)

24. 设计原则

摘要: 总的来说是高内聚低耦合,内聚是把变化点进行封装,耦合还是要有的,只是要尽量少,不同内聚点的联系方式有两种,一种就是继承,一种就是组合。组合又分为基于接口组合还是基于类组合,基于接口就可以灵活的改到聚合点的实现,只要符合接口的规范就可以。(一)抽象现实世界和程序对象之间的映射关系。不是像(相似)建模,是要对解决的问题进行抽象建模,要解决的问题是可能发生改变的,所以组织对象的时候要考虑把可能的变化封装起来。这件事很重要,怎么把现实问题一步步映射成对象,再到代码的经验,就是领域驱动建模了。(二)封装变化业务在不断变化,,想要程序可以持续使用,就要在需求变化时容易改变程序。可以把变化的东西抽成一个方法 阅读全文

posted @ 2013-11-08 15:47 关攀攀 阅读(228) 评论(0) 推荐(0)

数据迁徙经验总结

摘要: 在京东这一段时间做了很多数据的迁徙,做一些总结。(以sqlserver迁徙至mysql为例)迁徙的需求:业务数据从sqlserver迁徙至mysql,尽量减少系统停用的时间。迁徙流程:中间件接写,开启changelog原来sqlserver的读取写入统一由中间件接管,保证读写统一。中间件写入时把变更信息记录到changelog表。changelog(主键,变更主键,变更表,变更类型,状态,创建时间,修改时间),状态为0全量迁徙准备sqlserver离线库,上线全量迁徙程序,把离线库数据全量迁徙至mysql。sql插入全使用insert or update可重复执行。全量迁徙检验检验sqlser 阅读全文

posted @ 2013-11-08 15:45 关攀攀 阅读(417) 评论(0) 推荐(0)

合众天恒期间软件过程小结

摘要: (一)需求-开发-测试关系现公司很多需求在产品提出后,是否完善是个问题,在实际工作中,发现测试测试功能要从开发处问得需求,开发在开发的过程当中要承担很大的需求任务,当然开发确实要思考需求,但这不妨碍产品提出更完善的需求。建议如下:软件工程中对需求的是否合格的标准是是否可测试***需求完成后,测试使用需求文档生成测试用例用于测试,需求文档告诉测试测什么,开发告诉测试怎么测。***测试不仅仅是测试程序是否正确,同时也对对需求的完备性进行测试。注:敏捷开发中开发兼职需求,但需求依然是完备的。(二)需求调研经验1. 大领导,弄清系统的价值。以及协调相关调研工作。成果:系统目标,用例图。2. 系统用户的 阅读全文

posted @ 2013-11-08 15:43 关攀攀 阅读(193) 评论(0) 推荐(0)

多线程

摘要: CountDownLatch latch latch = new CountDownLatch(dbMax)ExecutorService executorService = Executors.newFixedThreadPool(size);executorService.execute(new UserinfoRunable(dbNo, tableNo));executorService.shutdown();try { latch.await();} catch (InterruptedException e1) { log.error("threadLatch.await( 阅读全文

posted @ 2013-11-08 15:38 关攀攀 阅读(352) 评论(0) 推荐(0)

异常处理

摘要: 通过编程无法避免的,用已检查异常异常处理。比如网络断开。如DataFormatException。RuntimeException通过编程可以避免,要在编程时对出现的RuntimeException的情况判断。比如除数是0,数组越界等。但现在还有比较流程用RuntimeException来替换掉所有有Exception。这种情况主要是为了代码更美观。在调用链上谁可以处理谁就可以捕。用RuntimeException封装Exception的两种方法,直接封装和用RuntimeException子类。详见:《java编程思想P280》异常和方法返回值的选择,个人倾向于方法返回值。如果发生程序不可继 阅读全文

posted @ 2013-11-08 15:34 关攀攀 阅读(112) 评论(0) 推荐(0)

常见架构方案

摘要: 注:大部分来源于网络,领域部分来自jdon大型网站架构和知识体系演进京东架构淘宝Detail内存领域对象+事件驱动Domain EventsCQRS命令查询分离DomainModel+Event分布式架构DCI架构数据+上下文+交互1.直接通过领域对象来发出事件。2.创建上下文,将Role注入到领域模型中。 阅读全文

posted @ 2013-11-08 15:28 关攀攀 阅读(454) 评论(0) 推荐(1)

调试程序

摘要: 1.有异常信息的技术性调试如果有异常信息,一定要从异常信息出现的原因入手。例如:java.lang.NoSuchMethodError: org.springframework.util.ObjectUtils.isArray(Ljava/lang/Object;)解读:肯定找到类了,类里面没有方法。分析:自己本地没错,服务器上有错,就是在本地能找到方法,在服务器上找不到。也就是说肯定有一个类有此方法,并且还有一个同包的类无此方法,应该是jar包冲突。然后找到包含此类的jar包确认下就可以。2.结果不对的逻辑性调试先要想,找出怀疑的点,然后通过断点或日志加以证明或反证明,如果不是再找怀疑点,如 阅读全文

posted @ 2013-11-08 15:19 关攀攀 阅读(248) 评论(0) 推荐(0)

编码反模式

摘要: 1) 通用方法一个方法处理多个业务,比如修改用户传入一个用户对象,方法根据邮箱,手机..是否为空来处理修改手机,邮箱等业务处理方法:每个业务要分开,单一职责2) 对象内的平行方法A(a1,a2,a3),a1,a2,a3方法中有相似功能。IA(a)ßA(a,abstract b)ßA1(b),A2(b),A3(b)3) 业务链方法一个业务的链式判断用方法调用来实现,比如用户登录,先判断是否是用户名-》别名-》密码。方案二:用责任链或装饰器模式来处理。两个没有特别明显的优略,但如果是一个业务的重要逻辑,方案二有明显优势。4) 混乱代码很多类,对像协调来做一件事,每个类只是一个框 阅读全文

posted @ 2013-11-08 15:17 关攀攀 阅读(233) 评论(0) 推荐(0)

一些编码经验

摘要: 1)根据要解决的问题来设计线程或者类体系,保证带来的复杂性都是因为问题的复杂性而带来(用多线程可带来好处的地才使用),并且要试图从技术上尽量缩减方案的复杂性(比如用JDK5新线程代替原来wait,notify)。(数据迁徙重构有感)针对代码:要思考多这几个类解决了什么问题,多几个线程又解决了什么问题,深层次的调用又解决了什么问题,如果没有解决什么问题,只是复杂,还是删除掉吧。2)重构代码要有自动测试护航,哪怕是只有验收测试。3)写足够少的代码,保证每小步都可执行,可观测,在每次小正确时考虑是否要重构。顺序,先写接口,再写接口测试,测试失败,接口实现,测试通过,考虑重构。就像是想做一个东西,组装 阅读全文

posted @ 2013-11-08 15:16 关攀攀 阅读(189) 评论(0) 推荐(0)

java语言的一些小语法

摘要: 原始类型空指针Integer a=null;if(a==0)会抛出空指针Map隐含添加冲突Iterator是工作在一个独立的线程中,它会建立一个索引表,当原来数据发生改变时,索引表不会发生改就,就会抛出java.util. ConcurrentModificationException异常。容易发生问题:Map的put方法,意愿是想修改,但如果key不存在就有问题了。集合大小隐含冲突for(int i=0;i和List,如果作为参数一个可传入子类型,一个不可以传入子类型。String"".compareTo(null)会有异常java正则str = str.replaceA 阅读全文

posted @ 2013-11-08 15:11 关攀攀 阅读(125) 评论(0) 推荐(0)

长方法重构过程

摘要: (一)整体过程1) 原代码重构成逻辑块清晰的过程化代码2) 对不同逻辑块进行抽取成服务类3) 从领域对象的角度分析服务类,通过单一职责来梳理服务类(二)原代码重构成逻辑块清晰的过程化代码每个逻辑块要有明确的输入输出,不同逻辑块最好能做到无序,如果一定有有序,要对有序有地方有所注释。每下个逻辑块都很分明,想抽成方法就可以随时抽取,不想抽取也可以保持现状,当重复代码出现时要进行抽取。如下是个合格的过程化代码示例。返回值 方法1(参数1,参数2){返回值变量1; //声明方法返回值 //逻辑块A 跨块变量AB1;//被多个逻辑块使用 块变量声明A1; 块变量声明A1=块代码A0(参数1); 跨块变量 阅读全文

posted @ 2013-11-08 15:01 关攀攀 阅读(257) 评论(0) 推荐(0)

从单元测试开始说起

摘要: 编程从一个角度来说,象是在推土,或者设定个小目标,完成,再设定一个小目标再完成,每一小步都有成功的喜悦。是在做一个类似一小步,一小步创作的东西,每一步有小成果,有它的趣味性和创造性,有每次一个小胜利的喜悦。编程的过程从一个角度来说更象是扫雷,每次一小步,还要保证扫过的地方一定没有雷,有它的谨慎性。总的来说程序可以分为衔接部分和功能部分。功能程序要要有单元测试来保证。集成测试来保证衔接部分和单元协作的正确性。面向过程和面向对象和分合的关系:分合角度,面向过程主合A->B->C,面向对象主分分为ABC三对象;组件角度,面向过程和衔接程序相呼应,面向对象和功能程序相对应。面向过程和面向对 阅读全文

posted @ 2013-11-08 14:58 关攀攀 阅读(251) 评论(0) 推荐(0)

2012-3用户数据迁移

摘要: (一)用户数据迁徙1.每次处理的数据要有一定的批量,保证内存和CPU占用稳定,不会内存溢出。2.在一定情况下,用可重复执行和报错机制来代替事务。比如change_log和数据操作不强调事务。数据迁徙经验汇总:迁移数据相关(这些问题看起来小,但带来的问题还是很麻烦的):一.如果前后空格无意义,数据库入库时要截断前后空格。二.同一字段在不同数据库或者同一数据库不同表中存储大小写要一致。不能数据库不区分,就存不一致的。三.数据库或者保持全角半角一致(同上),或者只存半角。一定不能有的地存全角,有的地存半角。四.如果业务要求字段唯一,数据库要做唯一限定。五.不可太相信业务系统,可以开发个非法数据检测程 阅读全文

posted @ 2013-11-08 14:52 关攀攀 阅读(199) 评论(0) 推荐(0)

2013-商品迁徙

摘要: 需求简述sqlserver商品库全量迁徙至mysqlsqlserver商品库增量迁徙至mysqlmysql商品库增量迁徙至sqlserver两边数据是异构的:几条sqlserver数据要合成一个mysql数据,几个sqlserver表数据对应mysql一张表的数据。商品迁徙一开始设计用过头了mysql中的一个表的记录来源于sqlserver中几个表,设计了个buiid接口,每个sqlserver中的对象实现此接口再统一进入一个build集合进行构建,在编码后发现,哪个表哪些字段怎么build的很难维护,不同build分的太散乱了,改进成不同build的逻辑放到了一起。总结:不要过早设计,设计的 阅读全文

posted @ 2013-11-08 14:42 关攀攀 阅读(180) 评论(0) 推荐(0)

导航