paulwong

#

软件开发流程

  1. 记录业务流程,使用活动图,有时业务流程可能太长,因此会每个流程加一个总结的图,需要的元素有:输入,输出,目标,参与者,输入可以是对象,资讯和事件。
  2. 以业务流程为基础,找出系统工程功能需求,使用系统用例图
  3. 找出领域对象,又称实体模型,概念模型,领域在设计阶段,就是数据表,这里有个模式可以用:交易模式,例如网上商城,下订单的事件,通常会被分解为这几个概念:订单,订单明细,商品,订购者,仓库,下一个动作的概念,如出货,出货明细,大致有这几类:事件,人和地点。
  4. 为了验证领域模型是否正确,引入分析类,这里又有一个模式:BCE模式,就是不管哪个系统,都可以分成:边界(B),控制(C)和实体(E),以上这些就是分析模型。
  5. 分析模型是和语言无关的模型:PIM(Platform Independen Model),下面一步就是与语言有关的设计模型,PSM(Platform Specific Model),这里我们采用MDA(Model Driven Architec)模式,即设计类并不由我们人手去加,而是由工具根据上面的分析类生成,如果使用EA就会有这个功能了,上面的控制类在这里也会转成控制类,但方法中的参数类型会转为象String这种与开发语言更加密切的东西,也就是一个分析控制类转成一个设计控制类,还会根据需要增加象DAO这些分析中没有的设计类。
  6. 数据模型:根据领域模型生成具体的设计类,一个分析实体转成一个设计实体类。
  7. 为了更加具体表达设计,可以增加状态图,例如请假流程,前面的请假流程已经用活动图表达了,但请假的核心是请假单,我们会就请假单画出所有的状态,并加上触发的事件。
  8. 根据设计类生成JAVA代码。
  9. 根据前面的用例,设计出测试用例。
最后完成。。

posted @ 2012-01-06 14:46 paulwong 阅读(330) | 评论 (0)编辑 收藏

讨论火车票订购网站架构

提交订票订单的处理流程如下:
1)用户通过浏览器访问系统URL
2)界面集群F5将请求转发至某一节点,通过比较用户数据库的内容进行身份鉴权。
3)鉴权成功后进入订票,提交订票订单(查询流程暂不讨论)界面显示请等待
4)订票消息被发送至总线部件(接口可用web Service、RMI、甚至自定义协议都可以)
5)总线收到订票消息、去Cache集群查询相关车次
6)Cache根据自身维护的车次余票表,返回查询结果,如果有余票,转7)。如果无票了,则总线返回界面集群“没票了”,界面提示用户明天再试。
7)若有余票,则总线返回界面集群“正在出票,请等待”,并将订票请求压入队列。且发消息至Cache,告诉CACHE将订票请求加入队列。
8)Cache收到总线队列增加1个的消息,将自身维护的对应车次余票数减1个。
9)总线另一线程负责从队列中取消息,并发送至出票部件。
10)出票部件产生订票结果,并修改数据库,发送“订票成功”消息回总线。
11)总线将订票成功消息直接回传至界面集群。
12)用户看到订票结果。

 

posted @ 2012-01-06 11:10 paulwong 阅读(339) | 评论 (0)编辑 收藏

Using an Example of Sharding with Hibernate

AMAZON的关于HIBERNATE SHARD的例子:
http://aws.amazon.com/articles/0040302286264415

posted @ 2012-01-04 23:21 paulwong 阅读(284) | 评论 (0)编辑 收藏

HIBERNATE SHARD

数据上千万,都挤在一个表里,导致查询太慢?分库分表洛!但已经用了HIBERNATE了,不想转其他框架?用HIBERNATE SHARD!

在向大家详细介绍Hibernate Shard三种策略之前,首先让大家了解下Hibernate Shard简介,然后全面介绍Hibernate Shard三种策略。

1. Hibernate Shard简介
Hibernate Shard多数据库水平分区解决方案。Hibernate 的一个扩展,用于处理多数据库水平分区架构。由google工程师 2007年 捐献给 Hibernate社区。目前版本: 3.0.0 beta2, 未发GA版。条件:Hibernate Core 3.2, JDK 5.0

2. 水平分区原理
一个库表如 Order 存在于多个数据库实例上。按特定的分区逻辑,将该库表的数据存储在这些实例中,一条记录的主键 PK,在所有实例中不得重复。水平分区在大型网站,大型企业应用中经常采用。目的出于海量数据分散存储,分散操作,分散查询以便提高数据处理量和整体数据处理性能。使用:google工程师的设计还是非常好的,完全兼容 Hibernate本身的主要接口。
org.hibernate.Session  
  org.hibernate.SessionFactory  
  org.hibernate.Criteria  
  org.hibernate.Query 

因此程序员开发变化不大,甚至不需要关心后台使用了分区数据库。程序迁移问题不大。而且配置上比较简明。

3. Hibernate Shard三种策略:
◆ShardAccessStrategy, 查询操作时,到那个分区执行。默认提供两个实现:
顺序策略:SequentialShardAccessStrategy, 每个query按顺序在所有分区上执行。
平行策略:ParallelShardAccessStrategy, 每个query以多线程方式并发平行的在所有分区上执行。此策略下,需要使用线程池机制满足特定的性能需要,java.util.concurrent.ThreadPoolExecutor.

◆ShardSelectionStrategy, 新增对象时,存储到哪个分区。框架默认提供了一个轮询选择策略 RoundRobinShardSelectionStrategy, 但一般不这样使用。通常采用“attribute-based sharding”机制,基于属性分区。一般是用户根据表自己实现一个基于属性分区的策略类ShardSelectionStrategy ,例如,以下WeatherReport基于continent属性选择分区:  
public class WeatherReportShardSelectionStrategy implements ShardSelectionStrategy {  
public ShardId selectShardIdForNewObject(Object obj) {  
if(obj instanceof WeatherReport) 
{  
return ((WeatherReport)obj).getContinent().getShardId();  
}
  
throw new IllegalArgumentException();  
}
 

◆ShardResolutionStrategy, 该策略用于查找单个对象时,判断它在哪个或哪几个分区上。默认使用 AllShardsShardResolutionStrategy ,可以自定义例如:  

public class WeatherReportShardResolutionStrategy extends AllShardsShardResolutionStrategy
{
public WeatherReportShardResolutionStrategy(List<ShardId> shardIds)
{
super(shardIds);
}


public List<ShardId> selectShardIdsFromShardResolutionStrategyData( ShardResolutionStrategyData srsd)
{
if(srsd.getEntityName().equals(WeatherReport.class.getName()))
{
return Continent.getContinentByReportId(srsd.getId()).getShardId();
}

return super.selectShardIdsFromShardResolutionStrategyData(srsd);
}

}

posted @ 2012-01-04 22:40 paulwong 阅读(895) | 评论 (0)编辑 收藏

Webx-淘宝的框架

淘宝的一个框架:
Webx:http://openwebx.org/docs/preface.html

代码下载:
https://github.com/webx/citrus

posted @ 2012-01-04 22:04 paulwong 阅读(1242) | 评论 (0)编辑 收藏

MyEclipse详解及MyEclipse7.5的优化

  这篇文章本要讲了两方面的内容
第一:对MyEclipse的解释,让您更加细致准确的了解MyEclipse,
第二:对
MyEclipse7.5的优化
MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和J2EE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。MyEclipse是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。
  在结构上,MyEclipse的特征可以被分为7类:
1. J2EE模型
2. WEB开发工具
3. EJB开发工具
4. 应用程序服务器的连接器
5. J2EE项目部署服务
6. 数据库服务
7. MyEclipse整合帮助
  对于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。
  简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。

MyEclipse7.5的优化
1、去除不需要加载的模块 一个系统20%的功能往往能够满足80%的需求,MyEclipse也不例外,我们在大多数时候只需要20%的系统功能,所以可以将一些不使用的模块禁止 加载启动。通过Windows - Preferences打开配置窗口,依次选择左侧的General - Startup and Shutdown,这个时候在右侧就显示出了Eclipse启动时加载的模块,可以根据自己的实际情况去除一些模块。
windows–>perferences–>general–>startup and shutdown
关掉没用的启动项:
WTP :一个跟myeclipse差不多的东西,主要差别是 WTP 是免费的,如果使用myeclipse,这个可以取消
Mylyn:组队任务管理工具,类似于 CVS ,以任务为单位管理项目进度,没用到的可以取消
Derby:一种保存成 jar 形式的数据库,我没用到,取消一大排以 MyEclipse EASIE 打头的启动项:myeclipse 支持的服务器,只选自己用的,其他取消,比如我只选了tomcat6.x


2、取消MyEclipse在启动时自动验证项目配置文件
默认情况下MyEclipse在启动的时候会自动验证每个项目的配置文件,这是一个非常耗时的过程,
可以在Preferences窗口依次选择 MyEclipse Enterprise Workbench - Validation,然后在右侧的Validator列表中只保留 Manual 项就可以了(Manual全部勾选,Bulid项只留下第一项)。
如果需要验证的时候只需要选中文件,然后右键选择 MyEclipse - Run Validation就可以了。
windows–>perferences–>myeclipse–>validation
把除了manual 下面的全部点掉,build下只留 classpath dependency Validator
手工验证方法: 在要验证的文件上,单击鼠标右键–>myeclipse–>run validation

3、去掉拼写检查(如果你觉的有用可以不去)
拼写检查会给我们带来不少的麻烦,我们的方法命名都会是单词的缩写,他也会提示有错,所以最好去掉,没有多大的用处:
windows–>perferences–>general–>validation->editors->Text Editors->spelling
myeclipse 打开 jsp 的默认编辑器不好,会同时打开预览
windows–>perferences–>general–>editors->file associations,
把默认改成 MyEclipse JSP Editor()
原默认的jsp编辑器是 MyEclipse Visual JSP Designer,顾名思义,此编译器是jsp可视化编辑器,对于初学者有很多的帮助,但修改此项的默认编辑器其实可以提高启动速度)


4、关闭自动更新
如果是myeclipse7.5:
(1)关掉maven自动更新: window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven, 关闭所有Download和Update开头的选项,共四项(去掉前面的勾)
(2)关闭更新调度:window –> preferences –> General –> Startup and Shutdown –> Automatic Updates Scheduler(去掉前面的勾)
(3)window –> preferences –>Myeclipse Dashboard,关闭Show……on start

5、加大JVM的非堆内存
打开 myeclipse.ini
-startup
../Common\plugins\org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
--launcher.library
../Common\plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.101.R34x_v20080731
-clean
-configuration
configuration
-vm
C:\Users\lenovo\AppData\Local\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\client\jvm.dll
-vmargs
-Xmx384m
-XX:MaxPermSize=384m
-XX:ReservedCodeCacheSize=96m
以上是我的myeclipse.ini,需要修改是-Xmx,-XX:MaxPermSize,-XX:ReservedCodeCacheSize,
将这三项的值调大,但并不是越大越好,曾经在相同的条件下做过测试(内存2GB),-Xmx,-XX:MaxPermSize的值为384m时比512m时要快(视具体的计算机而定),
-Xmx,-XX:MaxPermSize的值设为同样大小且两者之和不能超出你的计算机本身的内存大小


6、window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,将Maven JDK改为电脑上安装的JDK,即不使用myeclipse提高的JDK
登记add按钮,选择你的电脑上的JDK即可(注意:不是JRE,我的值为:Java6.014)

posted @ 2012-01-03 23:38 paulwong 阅读(275) | 评论 (0)编辑 收藏

Watij and Maven

By the way, I did this "by hand" and got it working.

First, download the waitj bundle and unzip it.

Then, use maven to manually install each dependency in the lib folder
like so:
mvn install:install-file -Dfile=webspec.jar -DartifactId=webspec -
DgroupId=watij -Dversion=1.3.1 -Dpackaging=jar

You can also do deploy:deploy-file if you want to put them into a
central maven repo.

Of course, you don't need to do this for log4j, junit, slf4j. I did
it for all the others for speed, registering them under "watij" and
version 1.3.1

Got this working in Eclipse, a simple login test case, yipee!

Here is the POM snippet for my project:

  <dependencies> 
    
<dependency> 
      
<groupId>junit</groupId> 
      
<artifactId>junit</artifactId> 
      
<version>4.8.2</version> 
      
<scope>test</scope> 
    
</dependency> 


    
<!-- WATIJ --> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>webspec</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>engine-gecko</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>engine-ie</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>engine-webkit</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>jniwrap-native</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>jxbrowser</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>MozillaGlue</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>MozillaInterfaces</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>mshtml</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>runtime</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>tuxpack</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>winpack</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>xulrunner-linux</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>xulrunner-linux64</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>xulrunner-mac</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>watij</groupId> 
      
<artifactId>xulrunner-windows</artifactId> 
      
<version>1.3.1</version> 
    
</dependency> 


    
<dependency> 
      
<groupId>log4j</groupId> 
      
<artifactId>log4j</artifactId> 
      
<version>1.2.15</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>org.slf4j</groupId> 
      
<artifactId>slf4j-api</artifactId> 
      
<version>1.5.8</version> 
    
</dependency> 
    
<dependency> 
      
<groupId>org.slf4j</groupId> 
      
<artifactId>slf4j-log4j12</artifactId> 
      
<version>1.5.8</version> 
    
</dependency> 



posted @ 2012-01-03 22:08 paulwong 阅读(815) | 评论 (0)编辑 收藏

Watij入门

     摘要: Watij介绍 Javadoc API for Watij: http://watij.sourceforge.net/docs/api/index.html?watij/IE.html 第三章 Watij环境设置 3.1 Watij环境要求 l Watij 3.2.1 l JDK 1.5 l Java IDE(本文中使用Eclipse) 3.2 Watij安装及设置 l 下载软...  阅读全文

posted @ 2012-01-03 22:01 paulwong 阅读(2350) | 评论 (0)编辑 收藏

了解CMS(Concurrent Mark-Sweep)垃圾回收器

1.总体介绍:

CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。

2.CMS过程:

  • 初始标记(STW initial mark)
  • 并发标记(Concurrent marking)
  • 并发预清理(Concurrent precleaning)
  • 重新标记(STW remark)
  • 并发清理(Concurrent sweeping)
  • 并发重置(Concurrent reset)
初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
并发预清理 :并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代,或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,因为下一个阶段会Stop The World。
重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯,并处理对象关联。
并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。  

CSM执行过程:
 


3.CMS缺点

  • CMS回收器采用的基础算法是Mark-Sweep。所有CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片。 CMS不对堆空间整理压缩节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。为了解决堆空间浪费问题,CMS回收器不再采用简单的指针指向一块可用堆空间来为下次对象分配使用。而是把一些未分配的空间汇总成一个列表,当JVM分配对象空间的时候,会搜索这个列表找到足够大的空间来hold住这个对象。
  • 需要更多的CPU资源。从上面的图可以看到,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切换是不靠谱的。并且,重新标记阶段,为空保证STW快速完成,也要用到更多的甚至所有的CPU资源。当然,多核多CPU也是未来的趋势!
  • CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。
总得来说,CMS回收器减少了回收的停顿时间,但是降低了堆空间的利用率。

4.啥时候用CMS

如果你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,如果在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。

posted @ 2012-01-03 20:31 paulwong 阅读(742) | 评论 (0)编辑 收藏

JBOSS远程代码执行漏洞

  JBOSS默认配置会有一个后台漏洞,漏洞发生在jboss.deployment命名空间 中的addURL()函数,该函数可以远程下载一个war压缩包并解压访问http://www.safe3.com.cn:8080/jmx-console/ 后台,如下图   下拉找到如下图所示     点击flavor=URL,type=DeploymentScanner进入 在输入框中写入war压缩文件webshell的url地址,如上图点击invoke执行界面获得一个jsp的webshell,如下图  
临时漏洞修补办法:给jmx-console加上访问密码
1.在 ${jboss.server.home.dir}/deploy下面找到jmx-console.war目录编辑WEB-INF/web.xml文件 去掉 security-constraint 块的注释,使其起作用
2.编辑WEB-INF/classes/jmx-console-users.propertiesserver/default/conf/props/jmx-console-users.properties (version >=4.0.2)和 WEB-INF/classes/jmx-console-roles.properties 或server/default/conf/props/jmx-console-roles.properties(version >=4.0.2) 添加用户名密码
3.编辑WEB-INF/jboss-web.xml去掉 security-domain 块的注释 ,security-domain值的映射文件为 login-config.xml (该文件定义了登录授权方式)

posted @ 2011-12-31 11:28 paulwong 阅读(793) | 评论 (0)编辑 收藏

仅列出标题
共112页: First 上一页 88 89 90 91 92 93 94 95 96 下一页 Last