MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1,
Calendar cd = Calendar.getInstance();
cd.add(Calendar.DATE, 1);//增加一天
 //cd.add(Calendar.MONTH, n);//增加n个月
这里不要使用set方法,也不要使用roll,原因见明海棠文集之日期时间1.0(注:这个帖子很强大)
另外commons-lang里的DateUtils里有一些以add开头的静态方法,例如addMonths(),实际也是调用add实现的。好像commons-lang2.4以后才有这个功能。

2,java里的格式 yyyy-MM-dd HH:mm:ss
  oracle里的格式 yyyy-MM-dd hh24:mi:ss

 //格式化时间——精确到毫秒并且长度一致,如果用
yyyyMMddHHmmssS就会不一致
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");



3,
Calendar cal = Calendar.getInstance();
cal.set(2008, 3, 1);//
注意Calendar.MONTH是从0开始的

posted @ 2008-07-17 20:32 leekiang 阅读(321) | 评论 (0)编辑 收藏

苏轼《卜算子·黄州定慧院寓居作》
缺月挂疏桐,漏断人初静。谁见幽人独往来?缥缈孤鸿影。
惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞沙洲冷。
http://zhidao.baidu.com/question/25708793.html?fr=qrl
http://zhidao.baidu.com/question/11411756.html

posted @ 2008-07-16 00:38 leekiang 阅读(343) | 评论 (0)编辑 收藏

0 0-15 23 * * ?   每天23:00至23:15每分钟触发一次
0 0/5 * * * ?     每隔5分钟触发一次
0 15 10 L * ?     每月最后一日的上午10:15触发

bean配置的顺序:
定时器的工厂bean-->cronbean-->具体实现的bean

<bean
        
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        
<property name="triggers">
            
<list>
                
<ref bean="cronExpReport" />
            
</list>
        
</property>
    
</bean>

    
<!-- 每天23:00至23:15每分钟一次触发 -->
    
<bean id="cronExpReport"
        class
="org.springframework.scheduling.quartz.CronTriggerBean">
        
<property name="jobDetail">
            
<ref bean="detailBean" />
        
</property>
        
<property name="cronExpression">
            
<value>0 0-15 23 * * ?</value>
        
</property>
    
</bean>

<bean id="detailBean"
        class
="org.springframework.scheduling.quartz.JobDetailBean">
        
<property name="jobClass">
            
<value>com.bo.detailBO</value>
        
</property>
        
<property name="jobDataAsMap">
            
<map>
                 
<entry key="baseBO">
                    
<ref bean="baseBO" />
                
</entry>
            
</map>
        
</property>
 
</bean>

Define of cronExpression

+------------------------------------+
| Position | Meaning | Value Scope   |
+------------------------------------+
| 1        | second  | 0-59          |
+------------------------------------+
| 2        | minute  | 0-59          |
+------------------------------------+
| 3        | hour    | 0-23          |
+------------------------------------+
| 4        | day     | 1-31          |
+------------------------------------+
| 5        | month   | 1-12          |
+------------------------------------+
| 6        | week    | 1-7           |
+------------------------------------+
| 7  可选  | year    | 1970-2099     |
+------------------------------------+

http://hi.baidu.com/tonent/blog/item/894e8b525124960a0cf3e3a1.html
http://blog.csdn.net/changsure/archive/2007/03/27/1542194.aspx
http://www.xici.net/b391997/d26742282.htm

posted @ 2008-07-11 23:44 leekiang 阅读(274) | 评论 (0)编辑 收藏

1,service方法的transactionAttributes配置为readonly时,
批处理中出现错误: ORA-01456: 不可以在 READ ONLY 事务处理中执行插入/删除/更新操作

2,Failed to convert property value of type
错误的原因是service属性应该是接口,而不能是一个类

3,spring2.5支持jdk1.4
readme.txt里有这样一句:
The Spring Framework 2.5 requires JDK 1.4.2 and J2EE 1.3 (Servlet 2.3, JSP 1.2, JTA 1.0, EJB 2.0). JDK 1.6 is
required for building the framework; for the full build including all aspects, AspectJ is required as well.
core包下有个JdkVersion类,用来判断jdk版本.代码里的相关位置对环境变量进行了判断,有时候做同一件事提供了两套方案,高于1.5(或1.6)一种,低于1.5(或1.6)又是一种,构建时用1.6版本以1.4编译,就能在1.4上用了。

4,spring启动时ApplicationContext
http://www.blogjava.net/jiake/archive/2009/01/07/250235.html

5,属性命名时不支持第一个字母是小写,而第二个字母是大写。
也就是说,对于JavaBean来讲,第一个与第二个字母都要小写
参考:
http://www.javaeye.com/topic/103184
http://www.javaeye.com/topic/88921
http://www.javaeye.com/problems/6293
javabean specification,规定了一般的属性名称首字母小写,如果遇到前两个字母大写的属性,则getter方法保持属性名称不变,例如URL属性的 getter方法为getURL,但是并没有规定类似eTypeName这样的属性的getter方法写成geteTypeName的形式。
如果要符合javabean规范,则只能将eTypeName改成ETypeName


8,springfuse
Code generation for Spring-based Web applications 

posted @ 2008-07-11 23:36 leekiang 阅读(292) | 评论 (0)编辑 收藏

1,JBPM的版本机制允许在数据库中多个同名流程定义共存,流程实例以当时的最新版本来启动,并且在它的整个生命周期中将保持以相同的流程定义执行。当一个新的版本被部署,新的流程实例以新版本启动,而老的流程实例则以老的流程定义继续执行

2,swimlane(泳道)
实际应用中,一个人是一个流程中多个Task的参与者(actor)的情况是很常见的。在jbpm中通过创建一个swimlane并且把swimlane赋给一个task的方式来设置当前task的参与者(actor)。一个业务流程中的swimlane可以被看做为一个参与者的参与者对象的名称,当然它不一定是固定的某个人,它可以是一个用户组,一个特定用户的角色等。首次执行到达一个Task,赋给该Task的一个swimlane就会算出参与者(actor)。
自己的理解:swimlane是一个描述任务接收者的特殊的对象,可以是一个用户,也可以是一个角色,可以是任何东西,只要能根据这个swimlane算出有哪些actor

3,JBPM中任务的分配方式有两种:一种是为task指定一个assignment-handler,既一个实现了AssignmentHandler接口的类;另外一种是为task指定一个swimlane(泳道),swimlane可以在流程中定义好,一个流程中可以定义若干个swimlane,在定义一个swimlane时同样也是指定了个实现了AssignmentHandler接口的类,当我们的task指定了一个swimlane后,其效果同我们指定一个assignment-handler效果是一样的,只不过可以简化我们任务的分配工作.
自己的理解:这两种方式实际上是同一种,
可以把swimlane理解为assignment-handler的命名,或者快捷方式,方便重用(assignment-handler是一次性的)。看来swimlane这个名字是个噱头啊。

4,以图形化的方式显示JBPM当前流程的方法及原理分析

http://blog.csdn.net/tuwen/archive/2007/09/12/1782623.aspx

5,jbpmside是一个基于jbpm进行扩展和封装的开源工作流项目

6, getting started with  jbpm and spring
http://www.theserverside.com/tt/articles/article.tss?l=jBPMandSpring

7,jbpm3.2需要jdk1.5
8,每一个jbpm_processinstance的roottoken有且只有一个。
如果当前token在folk节点上,则其多个子token在各个分支的节点上。
可以查到每一个token所属的流程实例。

posted @ 2008-07-03 21:59 leekiang 阅读(499) | 评论 (0)编辑 收藏

我单位物资系统:库存表kcb,库存明细kcmx 

当发生一笔动态的时候,先查询库存表中的库存数量,然后加上增减数量,得到新库存,update,commit; 

接着把库存数量,增减数量,更改时间分别插入到库存明细:前次数量,增减数量,更改时间。 

问 题:现在有两条数据更改时间很接近  a  10:51:47:01b  10:51:46:25  .也就是说两条数据先后更新,而且更新的是同样一笔物资。于是,a  条记录得到的前存数量和b条记录得到的前存数量一样,(好像叫读脏数?)于是记录b的更新就被当作不存在了! 

系统在随后的更新中查到的是记录a更新候的数据,一切正常,唯有记录b  被忽略了;(于是库存错了,领导批了) 

 

还有一个奇怪的问题,就是库存明细的查询是用存储过程作的,为什么select到pb的数据窗口之后别的数据都是按时间顺序排列,唯有上面两条,a在b之前!时间也会错?相差太近? 

我以后怎么办?高人教我

http://blog.csdn.net/qiume/archive/2009/02/26/3938382.aspx
对数据库中的数据修改都是在内存中完成的,这些修改的结果可能已经写到硬盘也可能没有写到硬盘,如果在操作过程中,发生断电或系统错误等故障,数据库可以 保证未结束的事务对数据库的数据修改结果即使已经写入磁盘,在下次数据库启动后也会被全部撤销;而对于结束的事务,即使其修改的结果还未写入磁盘,在数据 库下次启动后会通过事务日志中的记录进行“重做”,即把丢失的数据修改结果重新生成,并写入磁盘,从而保证结束事务对数据修改的永久化。这样也保证了事务 中的操作要么全部完成,要么全部撤销。

posted @ 2008-06-26 11:24 leekiang 阅读(397) | 评论 (0)编辑 收藏

1,jBPM没有角色的概念,jBPM只有参与者的概念,也就是ActorID,它可以是用户ID,也可以是角色ID,也可以什么都不是
  http://www.uml.org.cn/workclass/200709306.asp
2,如何获得某actor的任务
  http://jbpm.group.javaeye.com/group/topic/2707
  任务的管理

posted @ 2008-06-25 18:38 leekiang 阅读(367) | 评论 (0)编辑 收藏

1,Oracle数据库的位图索引(Bitmap Index)确实是针对那些数值稀疏(low-cardinality低基数)的字段,但是还应记住的一点是,它是针对那些值不经常改变的字段的。在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。在位图索引中,如果你更新或插入其中一条数值为N的记录,那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定,这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后,才能获得锁,更新或插入数据。
http://blog.ccidnet.com/blog-htm-do-showone-uid-4092-itemid-291252-type-blog.html

在我们的系统里,不仅不是在一个column上创建bitmap index,而是在多个column上联合起来创建bitmap index,从而可以想见,几乎等同于每个bitmap index entry对应的只有极少数的rowid,即只对应极少数的row,而且每个bitmap都要创建一个或多个bitmap segment,相应的,DML操作可能需要频繁的lock很多rows,影响并发性(影响也需要修改同样bitmap entry的用户),同时,由于pctfree等存储参数影响index空间的分配及管理,和由于数据操作导致物理地址更改从而修改index entry,扩展,链接bitmap index entry,频繁修改导致的磁盘碎片,block分配链接等。这是空间增长和系统性能下降的部分原因。

bitmap主要用于数据仓库,table有大量的数据并且列上基数很小(一般是column的distinct values占rows总数的1%以下,或重复出现超过100次以上,Oracle建议此时才可以把该column列为创建bitmap index的侯选字段),同时,还由于数据仓库上并行访问的事务非常少。bitmap index并不适用于OLTP业务,OLTP一般都是有大量的并发事务来修改同样的数据。bitmap主要就是设计来为数据仓库服务的,即应用于低基数超 级大数据量查询服务,而且只用在where clause里包含and ,or,not,或equality queries(比如在and和or条件的查询,在把bit转换成rowid以前,就能很快的得到相应的boolean操作)。
http://bigboar.itpub.net/post/8411/225321

2,位图索引占用的空间很大.一个466万行记录的只有两个字段的表,占用空间约 88M,在该两个字段上建有一个位图索引,这个位图索引占用空间约168M
http://bigboar.itpub.net/post/8411/225321

查看各个表(包括索引)占用空间大小的sql:
Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name

http://space.itpub.net/193161/viewspace-50292
http://www.ixdba.com/html/y2007/m05/102-bitmap-index-deadlock.html

3,Oracle强烈建立,任何一个应用程序的库表至少需要创建两个表空间,其中之一用于存储表数据,而另一个用于存储表索引数据。因为如果将表数据和索引数 据放在一起,表数据的I/O操作和索引的I/O操作将产生影响系统性能的I/O竞争,降低系统的响应效率。将表数据和索引数据存放在不同的表空间中(如一 个为APP_DATA,另一个为APP_IDX),并在物理层面将这两个表空间的数据文件放在不同的物理磁盘上,就可以避免这种竞争了。
拥有独立的表空间,就意味着可以独立地为表数据和索引数据提供独立的物理存储参数,而不会发生相互影响,毕竟表数据和索引数据拥有不同的特性,而这些特性又直接影响了物理存储参数的设定。
此外,表数据和索引数据独立存储,还会带来数据管理和维护上的方面。如你在迁移一个业务数据库时,为了降低数据大小,可以只迁出表数据的表空间,在目标数据库中通过重建索引的方式就可以生成索引数据了。
http://blog.ccidnet.com/blog-htm-do-showone-uid-19759-itemid-341747-type-blog.html

4,B-Tree索引即normal普通索引

posted @ 2008-06-25 15:12 leekiang 阅读(3802) | 评论 (1)编辑 收藏

在jBPM中,任务的分配有两种模式:

  1. 推(Push)模式    在这种模式下,系统计算出应该由哪个参与者(actor)完成当前任务(task),然后直接将此task送到该actor的任务列表中(tasklist);
  2. 拉(Pull)模式    在这种模式下,系统首先计算出应该由哪个参与者池(pool of actors)完成当任务,并将该任务送入相应的任务池中;然后,再由参与者池中的任一人将任务拉到自己的任务列表中。

参与者池与角色、用户组的差异

一般的应用中,角色与用户组的概念比较常见,而参与者池则不常见。

针对一个Task一般会有多个可能的操作,而不同的角色有可能有权限进行其中的一部分或全部操作。所以,不同角色有可能属于相同的参与者池,一个角色也有可能被加入到多个参与者池中。

一 般用户组是按组织架构进行划分的,在同一个用户组可能会有多个不同的角色,或者具有不级别的权限。即使将同一角色、具有同一级别权限的用户划分为一组,也 不能回避具有更高级别权限的用户操作低级别工作任务项的情形。另一方面,在Multi-Entity架构下,也存在跨Entity操作的情形。

总而言之,参与者池是区别于按角色、按组织进行划分的、一种特别的用户分组方法。换言之,参与者池其实也是可以预先定义的。

何时进行任务分配计算

既然参与者池是可以预见的,那么在“拉模式”下,何时进行任务分配计算呢?

毫无疑问,在工作流系统中,计算是在任务状态转换时自动完成的。(当然,相对于应用的事务提交,工作流的这些操作都可以是异步完成的。)

因些,“拉”的含义,不是在用户刷新任务列表时才去计算他/她的所有工作项;恰恰相反,无论是“拉”或是“推”,工作流系统其实都预先计算好了参与者的任务列表或可以从中挑选任务的“任务池”。

jBPM参与者池的数据库设计

jbpmtask.jpeg
jbpm_taskinstance与jbpm_pooledactor是典型的“多对多”的关系,中间通过jbpm_taskactorpool拆分成两个“一对多”。
原文:http://dayubian.spaces.live.com/blog/cns!9E5A349DF844201E!365.entry

posted @ 2008-06-23 18:04 leekiang 阅读(1705) | 评论 (0)编辑 收藏

可伸缩性最佳实践:来自eBay的经验

为什么对客户需求的理解经常变动?那是因为没有抓住问题的本质,没有分析出需求对应的领域模型
http://www.javaeye.com/topic/214489?page=2

posted @ 2008-06-21 23:24 leekiang 阅读(290) | 评论 (0)编辑 收藏

仅列出标题
共54页: First 上一页 34 35 36 37 38 39 40 41 42 下一页 Last