Shark的缓存

      系统出现了两个关于Shark缓存方面的问题,所以我把Shark配置文件的缓存的设置部分进行的简单的翻译和分析,并对API的缓存部分也分析了下用来解决我的问题.

问题1:
  描述:业务消失,在一次完成业务的最后一个环节时,由于一个数据库字段长度不够引起数据库事务回滚,使此环节未能完成,而此业务确不在可接受的环节列表中了,而重启服务器后业务又再度出现了.
  原因分析: 由于我把自已的数据库操作同shark的数据库操作放入同一事务中了,而shark的操作成功完成后,shark把这个process放入到了缓存中去,并认为此业务已完成了,而我之后的操作出错后造成了数据库的回滚,使此业务又回到了未完成状态,而shark的缓存并没有更新,而重启服务器后process缓存又重新从数据库装载,所以业务又出现了
问题2:
  描述:服务启动时初始化XPDL缓存时出错java内存溢出
  原因分析: 由于XPDL文件太大太多,造成java内存溢出

 

 

 

配置部分:shark.conf

#########################KERNEL SETTINGS for CACHE INITIALIZATION 内核设置-缓存初始化部分
# Following can be set to init process and resource caches at shark startup.
# 以下可以设置在初始化process和resource缓存在shark启动
# If you uncomment following lines, all processes and resources will be filled
# into cache (if the cache size allows this).
#如果你解除注释下面的行,那么所有的processes和resources将会被加入到缓存
# The value of following properties can be set as a comma separated list of
# the process/resource ids that need to be put into cache on engine start,
# e.g.: Cache.InitProcessCacheString=1_test_js_basic, 5_test_js_Game
#值可以设置为将你要在引擎启动时要加入缓存的process/resource的ID以逗号分隔的一个列表
#例如  Cache.InitProcessCacheString=1_test_js_basic, 5_test_js_Game
# Shark kernel default is "not init anything"
#Shark内核的默认值是: 什么都不初始化
#Cache.InitProcessCacheString=*
#Cache.InitResourceCacheString=*


结论:由于启动时那个是XPDL缓存溢出 并非此设置.另这个缓存只是初始化时process和resource缓存的设置,经我试验此处虽没有设置缓存但在shark启动后process和resource仍然有大小为100的缓存,原因是使用的缓存管理器的设置(LRU)默认值为100


######################### KERNEL SETTING for CACHING CLOSED PROCESSES   内核设置-缓存关闭的流程
# If Shark's caching manager is specified, you can define if closed
# processes will be cached or not. Kernel's default is false.
#如果已指定shark的缓存管理器,那么你可以定义是否缓存关闭的流程,内核的默认设置是"false"
#SharkKernel.cacheClosedProcesses=false


#-----------------------------------------------------------------------------
#                   DODS'S Database Manager Configuration   DODS'S(数据库持久层功能类hibernate)数据库管理设置
#-----------------------------------------------------------------------------

#
# Default cache configuration
#
#  默认缓存设置
DatabaseManager.defaults.cache.maxCacheSize=100 # 最大缓存值
DatabaseManager.defaults.cache.maxSimpleCacheSize=50 # 最大简单缓存值
DatabaseManager.defaults.cache.maxComplexCacheSize=25 # 最大复杂缓存值
DatabaseManager.defaults.cache.maxMultiJoinCacheSize=25 # 最大多表关联缓存值
#以下被注释部分为关闭数据库持久层的缓存所取的值
#DatabaseManager.defaults.cache.maxCacheSize=0
#DatabaseManager.defaults.cache.maxSimpleCacheSize=0
#DatabaseManager.defaults.cache.maxComplexCacheSize=0
#DatabaseManager.defaults.cache.maxMultiJoinCacheSize=0
DatabaseManager.defaults.cache.reserveFactor=0.1 #这个不知道是什么,大概是一个工厂类的版本

#
# Default table configuration
#
DatabaseManager.defaults.maxExecuteTime=200 #最大执行时间

DatabaseManager.defaults.CacheLockRetryCount=12 #缓存锁重试次数
DatabaseManager.defaults.CacheLockTimeout=120 #缓存锁超时值

 

 

结论:数据库持久层的缓存是开启的,业务消失的问题有可能是这个引起的


#=============================================================================
# Default cache is LRU 默认缓存使用LRU(最近最少使用)缓存管理器
#
#-----------------------------------------------------------------------------
# Cache defaults
#
CacheManagerClassName=org.enhydra.shark.caching.LRUCacheMgr  #缓存管理器的类名

# Default LRU cache sizes (LRU implementation default is 100 for each cache)
# 默认的LRU缓存大小(LRU实现了默认为100的循环使用缓存)
#LRUProcessCache.Size=100
#LRUResourceCache.Size=100

#以下是另一种缓存管理器:简单缓存管理器,应该不是LRU的
#CacheManagerClassName=org.enhydra.shark.caching.SimpleCacheMgr
# Default simple cache sizes
#SimpleProcessCache.Size=100
#SimpleResourceCache.Size=100

 

 

结论:这是shark中缓存的类设置,也就是这里的值决定的Process和Resource的缓存大小,按默认设置取默认值100,也说是说按默认配置Process和Resource的缓存为100.

 

#=============================================================================
# Default Tool agent settings    默认工具代理设置
#
#-----------------------------------------------------------------------------
#
# Specifies the size of cache for holding ext. attributes (for shark performance reason)
# 指定 holding ext 的缓存大小
# Default -1 means unlimited
# 默认-1为不限制
#AbstractToolAgent.extAttribsCacheSize=-1

结论: 我并没有使用 shark的工具代理功能,应该没有关系

#=============================================================================
# DODS Settings for Id Generator   DODS 的ID生成器设置
#-----------------------------------------------------------------------------
# default cache size for Ids (if cache size for particular object Id is not
# specified, then this size is used, and if this cache size also isn't
# specified, program default is used)
# ID生成器的缓存大小 (不明白说些什么,大概是说如果是特殊类型的ID时的处理方式)
DODS.defaults.IdGenerator.CacheSize=100

# cache size for process instance Ids 
# 流程实例的ID缓存大小
#DODS.IdGenerator._process_.CacheSize=100

# cache size for activity instance Ids
# 环节实例的ID缓存大小
#DODS.IdGenerator._activity_.CacheSize=100

结论: 这是ID生成器的缓存设置,和我的问题无关

 

 

API部分:
shark的ExecutionAdministration接口提供了管理理缓存的方法如下

void clearProcessCache(WMSessionHandle shandle) //清空Process缓存

void clearResourceCache(WMSessionHandle shandle) //清空Resource缓存

void setProcessCacheSize(WMSessionHandle shandle, int size) //设置Process缓存大小

void setResourceCacheSize(WMSessionHandle shandle, int size) //设置Resource缓存大小

 

解决方法:
这样关于流程消失的问题解决方法就出来了,有两个方案
1.把Process和Resource的缓存大小设为0
LRUProcessCache.Size=0
LRUResourceCache.Size=0
这样做起来很简单,但是牺牲的性能
2.在数据库回滚时调用shark的ExecutionAdministration中的clearProcessCache和clearResourceCache来清空缓存,这就是写代码配到spring中的数据库回滚类中比较麻烦,但是可以断续使用shark对Process和Resource的缓存
关于XPDL太多引起的java内存溢出仍没有好的办法只有两下方案
1.缩小XPDL包的大小并分割为多个包,这样更新XPDL包时XPDL相对会小一此
2.加大服务器内存,并多分配给JDK

 

转载请注明出处( Cooper的专栏     http://blog.csdn.net/cooper_lyt

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值