﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-闲人野居-随笔分类-jdk相关</title><link>http://www.blogjava.net/zyl/category/14524.html</link><description>好好学习，天天向上</description><language>zh-cn</language><lastBuildDate>Tue, 17 Apr 2007 05:39:26 GMT</lastBuildDate><pubDate>Tue, 17 Apr 2007 05:39:26 GMT</pubDate><ttl>60</ttl><item><title>用泛型时遇到的尴尬问题</title><link>http://www.blogjava.net/zyl/archive/2007/04/17/111128.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Tue, 17 Apr 2007 00:22:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/04/17/111128.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/111128.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/04/17/111128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/111128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/111128.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 几天前遇到这么一个问题，让我郁闷了半天。当初为了方便定义了以下的一个接口：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IBusinessObject</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">PK&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Serializable</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;PK&nbsp;getPrimaryKey();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPrimaryKey(PK&nbsp;id);<br>}</span></div>
<br>在我的子类中是这么实现的<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Code&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IBusinessObject</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Long</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">{<br>&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;primaryKey;<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPrimaryKey(Long&nbsp;id){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.primaryKey</span><span style="color: #000000;">=</span><span style="color: #000000;">id;<br>&nbsp;}<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Long&nbsp;getPrimaryKey(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;primaryKey<br>&nbsp;}<br>}</span></div>
<br><br>在通常的实例化过程中，是不会存在问题的。当时的问题是，我定义了另外一个类，用于引用Code<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TestBean&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Code&nbsp;code;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setCode(){<img src="http://www.blogjava.net/Images/dot.gif">}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Code&nbsp;getCode(){<img src="http://www.blogjava.net/Images/dot.gif">}<br>}</span></div>
<br>当在spring环境中时，使用spring的bind类处理的时候，发现，我的code.primaryKey的类型居然为Serializable,而不是我想要的Long<br>当时以为其他地方搞错了，写了个简单的测试代码<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">TestBean&nbsp;b</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TextBean();<br>BeanWrapperImpl&nbsp;wrapper</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BeanWrapperImpl(b);<br>b.setPropertyValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">code.primaryKey</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>assertTrue(b.getCode().getPrimaryKey()&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Long);</span></div>
<br>居然是失败的。<br>只有在<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">b.setPropertyValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">code.primaryKey</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Long(</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br>assertTrue(b.getCode().getPrimaryKey()&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Long);</span></div>
<br>才成功。<br>仔细跟踪，发现原来，泛型的时候，产生的编译类中，有两个同名的方法<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPrimaryKey(Long&nbsp;id){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.primaryKey</span><span style="color: #000000;">=</span><span style="color: #000000;">id;<br>&nbsp;}<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Long&nbsp;getPrimaryKey(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;primaryKey<br>&nbsp;}<br>和<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPrimaryKey(Serializable&nbsp;id){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.primaryKey</span><span style="color: #000000;">=</span><span style="color: #000000;">id;<br>&nbsp;}<br>&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Serializable&nbsp;getPrimaryKey(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;primaryKey<br>&nbsp;}&nbsp;</span></div>
<br>而java.beans规范对于这种情况是没有办法分清楚，所以也就导致了结果和预期的不同。<br>如果是在程序中，这点算不了问题。可是我需要在web的页面上进行值的绑定，而输入的东西，只能为字符串。所以不可能出来Long类型。<br>目前，采用了一种比较傻的办法，在TestBean中增加了一个临时变量x，通过x向code传值<br>如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setWsCode(String&nbsp;wsCode)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.wsCode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;wsCode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(StringUtils.isNumeric(wsCode))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.code.setPrimaryKey(NumberUtils.toLong(wsCode));<br>}</span></div>
<br>不知道还有没有其他好的解决方案。<br><br><br><img src ="http://www.blogjava.net/zyl/aggbug/111128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-04-17 08:22 <a href="http://www.blogjava.net/zyl/archive/2007/04/17/111128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ehcache 配置</title><link>http://www.blogjava.net/zyl/archive/2007/04/05/ehcache.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Thu, 05 Apr 2007 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/04/05/ehcache.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/108764.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/04/05/ehcache.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/108764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/108764.html</trackback:ping><description><![CDATA[欠了很久的文章，本来都不想发了，可还是发吧<br><br>ehcache的默认配置文件名为ehcache.xml，也可以自己指定。配置文件比较的简单，基本上也就是常用的几个元素。<br><br><span style="font-weight: bold;">配置元素说明：<br><br></span>diskStore：配置DiskStore，当需要使用磁盘保存的时候，需要对象实现序列化接口<br><br>&nbsp;&nbsp;&nbsp; 属性：path 配置文件存储位置，如user.home，user.dir，java.io.tmpdir<br><br>cacheManagerEventListenerFactory ：指定CacheManagerEventListenerFactory，用于创建CacheManagerPeerProvider<br><br>用于提醒当CacheManager中的缓存增加或者删除时。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 属性:class:完整的工厂类名称 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br><br>事件包括 增加cache和删除cache<br><br>cacheManagerPeerProviderFactory:指定CacheManagerPeerProviderFactory，用于创建CacheManagerPeerProvider，用于在cluster中查找CacheManagers，主要用于机群环境<br><br>&nbsp;&nbsp;&nbsp; 属性：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class:完整的工厂类名称<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br><br>默认的配置：<br>&nbsp;<br>&lt;cacheManagerPeerProviderFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multicastGroupPort=4446, timeToLive=32"/&gt;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br>&lt;cacheManagerPeerProviderFactory class=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties="peerDiscovery=manual,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | //server1:40000/sampleCache2|//server2:40000/sampleCache2"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br><br>cacheManagerPeerListenerFactory：指定CacheManagerPeerListenerFactory，用于创建CacheManagerPeerListener，监听cluster中的复制信息<br>&nbsp;&nbsp;&nbsp; 属性：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class:完整的工厂类名称<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; properties:逗号分割的属性<br><br>默认配置<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; &lt;cacheManagerPeerListenerFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties="hostName=fully_qualified_hostname_or_ip,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port=40001,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socketTimeoutMillis=120000"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br><br>defaultCache: 默认缓存配置<br><br>&nbsp;&nbsp;&nbsp; 必须属性：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; name:设置缓存的名称，用于标志缓存,惟一<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxElementsInMemory:在内存中最大的对象数量<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; maxElementsOnDisk：在DiskStore中的最大对象数量，如为0，则没有限制<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; eternal：设置元素是否永久的，如果为永久，则timeout忽略<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; overflowToDisk：是否当memory中的数量达到限制后，保存到Disk<br><br>&nbsp;&nbsp;&nbsp; 可选的属性：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; timeToIdleSeconds：设置元素过期前的空闲时间<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; timeToLiveSeconds：设置元素过期前的活动时间<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; diskPersistent：是否disk store在虚拟机启动时持久化。默认为false<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; diskExpiryThreadIntervalSeconds:运行disk终结线程的时间，默认为120秒<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memoryStoreEvictionPolicy：策略关于Eviction<br><br>缓存子元素：<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; cacheEventListenerFactory：注册相应的的缓存监听类，用于处理缓存事件，如put,remove,update,和expire<br>&nbsp;&nbsp;&nbsp; bootstrapCacheLoaderFactory:指定相应的BootstrapCacheLoader，用于在初始化缓存，以及自动设置。<br>如下的例子：<br>&nbsp;<br>&nbsp;&lt;cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties="replicateAsynchronously=true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replicatePuts=true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replicateUpdates=true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replicateUpdatesViaCopy=true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replicateRemovals=true "/&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp; <br>&lt;bootstrapCacheLoaderFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp; <br>&nbsp;&lt;defaultCache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="10000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="120"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="120"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsOnDisk="10000000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskPersistent="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diskExpiryThreadIntervalSeconds="120"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memoryStoreEvictionPolicy="LRU"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br><br>cache配置同defaultCache<br>&nbsp;<br>&lt;cache name="sampleDistributedCache1"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="10"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="false"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;cacheEventListenerFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bootstrapCacheLoaderFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/cache&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br><br>基本上都比较简单，当然也可以直接使用程序实现相应的功能<br><img src ="http://www.blogjava.net/zyl/aggbug/108764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-04-05 18:42 <a href="http://www.blogjava.net/zyl/archive/2007/04/05/ehcache.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用ehcache</title><link>http://www.blogjava.net/zyl/archive/2007/02/28/101208.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Wed, 28 Feb 2007 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/02/28/101208.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/101208.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/02/28/101208.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/101208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/101208.html</trackback:ping><description><![CDATA[
		<br />    一直以来懒得配置缓存，基本的缓存也就是orm层，基本上都交给hibernate去配置了。这段时间，感觉页面速度太慢了，还是需要使用缓存。现在的缓存工具也挺多的，较不错的属ehcache和oscache了。决定分别研究一下。<br />    先来说说ehcache，目前的版本为1.2,已经支持集群了。对于ehcache的使用，感觉很容易上手，基本上都是配置。以前在hibernate的时候配置过，所以也不是很陌生。API也挺简单，如下的api：<br />    CacheManager主要的缓存管理类，一般一个应用为一个实例，如下<br />    CacheManager.create();也可以使用new CacheManager的方式创建<br />     默认的配置文件为ehcache.xml文件，也可以使用不同的配置：<br />     <br /> <br />CacheManager manager = new CacheManager("src/config/other.xml");     <br /><br /><b>缓存的创建，采用自动的方式</b><br /> <br />CacheManager singletonManager = CacheManager.create();<br />singletonManager.addCache("testCache");<br />Cache test = singletonManager.getCache("testCache");     <br /><b><br />或者直接创建Cache</b><br /> <br />CacheManager singletonManager = CacheManager.create();<br />Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2);<br />manager.addCache(memoryOnlyCache);<br />Cache test = singletonManager.getCache("testCache");     <br /><br /><b>删除cache</b><br /> <br />CacheManager singletonManager = CacheManager.create();<br />singletonManager.removeCache("sampleCache1");     <br /><br /><b>在使用ehcache后，需要关闭</b><br /> <br />CacheManager.getInstance().shutdown()     <br /><b><br />caches 的使用</b><br /> <br />Cache cache = manager.getCache("sampleCache1");     <br /><b><br />执行crud操作</b><br /> <br />Cache cache = manager.getCache("sampleCache1");<br />Element element = new Element("key1", "value1");<br />cache.put(element);     <br /><br /><b>update</b><br /> <br />Cache cache = manager.getCache("sampleCache1");<br />cache.put(new Element("key1", "value1");<br />//This updates the entry for "key1"<br />cache.put(new Element("key1", "value2");     <br /><b><br />get Serializable</b><br /> <br />Cache cache = manager.getCache("sampleCache1");<br />Element element = cache.get("key1");<br />Serializable value = element.getValue();     <br /><br /><b>get non serializable</b><br /> <br />Cache cache = manager.getCache("sampleCache1");<br />Element element = cache.get("key1");<br />Object value = element.getObjectValue();     <br /><br /><b>remove</b><br /> <br />Cache cache = manager.getCache("sampleCache1");<br />Element element = new Element("key1", "value1"<br />cache.remove("key1");     <br /><br />不过缓存还是基本上以配置方式为主，下一篇文章将会说明ehcache如何配置<br />    <br /><br />    <br />    <br /><br /><img src ="http://www.blogjava.net/zyl/aggbug/101208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-02-28 20:14 <a href="http://www.blogjava.net/zyl/archive/2007/02/28/101208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用javassist动态注入代码</title><link>http://www.blogjava.net/zyl/archive/2007/02/10/99171.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Sat, 10 Feb 2007 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/02/10/99171.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/99171.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/02/10/99171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/99171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/99171.html</trackback:ping><description><![CDATA[    关于java字节码的处理，目前有很多工具，如bcel，asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令，可以采用javassist。javassist是jboss的一个子项目，其主要的优点，在于简单，而且快速。直接使用java编码的形式，而不需要了解虚拟机指令，就能动态改变类的结构，或者动态生成类。<br />    下面通过一个简单的例子，通过javassist来实现如何动态注入代码。<br />    假设，存在类A,如下：<br />public class A {<br />    public void method() {<br />        for (int i = 0; i &lt; 1000000; i++) {<br />        }<br />        System.out.println("method1");<br />    }<br />}<br />测试类B如下：<br />public class B {<br />    public static void main(String[] args) {<br />        A a = new A();<br />        a.method();    <br />    }<br />}<br />现在想统计一下method的执行时间，<br />默认的实现是修改method：<br /> public void method() {<br />        long start = System.currentTimeMillis();<br />        for (int i = 0; i &lt; 1000000; i++) {<br />        }<br />        System.out.println("method1");<br />        long end = System.currentTimeMillis();<br />        System.out.println(end - start);<br />    }<br />如果A的方法很多，统计方法的执行时间的代码就会相应的增加。为了减少工作量，通过动态注入代码的形式来实现。<br />修改B的main方法：<br />    public static void main(String[] args) throws Exception {<br />      //用于取得字节码类，必须在当前的classpath中，使用全称<br />        CtClass ctClass = ClassPool.getDefault().get("org.esoft.A");<br />         //需要修改的方法名称<br />        String mname = "method";        <br />        CtMethod mold = ctClass.getDeclaredMethod(mname);<br />         //修改原有的方法名称<br />        String nname = mname + "$impl";<br />        mold.setName(nname);<br />         //创建新的方法，复制原来的方法<br />        CtMethod mnew = CtNewMethod.copy(mold, mname, ctClass, null);<br />         //主要的注入代码<br />        StringBuffer body = new StringBuffer();<br />        body.append("{\nlong start = System.currentTimeMillis();\n");<br />        //调用原有代码，类似于method();($$)表示所有的参数<br />        body.append(nname + "($$);\n");<br />        body.append("System.out.println(\"Call to method "<br />                    + mname<br />                    + " took \" +\n (System.currentTimeMillis()-start) + "<br />                    + "\" ms.\");\n");<br />       <br />        body.append("}");<br />         //替换新方法<br />        mnew.setBody(body.toString());<br />         //增加新方法<br />        ctClass.addMethod(mnew);<br />        //类已经更改，注意不能使用A a=new A();，因为在同一个classloader中，不允许装载同一个类两次<br />        A a=(A)ctClass.toClass().newInstance();<br />        a.method();<br />    }<br />这只是简单的一个应用。javassist还提供了很多的功能，用于更改类结构。有兴趣的可以参考相关文档<br /><br /><img src ="http://www.blogjava.net/zyl/aggbug/99171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-02-10 21:02 <a href="http://www.blogjava.net/zyl/archive/2007/02/10/99171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本的类装入异常 </title><link>http://www.blogjava.net/zyl/archive/2007/02/04/97881.html</link><dc:creator>布衣郎</dc:creator><author>布衣郎</author><pubDate>Sun, 04 Feb 2007 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/zyl/archive/2007/02/04/97881.html</guid><wfw:comment>http://www.blogjava.net/zyl/comments/97881.html</wfw:comment><comments>http://www.blogjava.net/zyl/archive/2007/02/04/97881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyl/comments/commentRss/97881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyl/services/trackbacks/97881.html</trackback:ping><description><![CDATA[
		<span style="font-size: 14px; line-height: 30px;">    在java中，类装载异常虽然不是很常见，可如果发生异常，其处理还是比较麻烦的。<br />    下面的几种异常是比较常见的：<br /><b>ClassNotFoundException</b><br />    ClassNotFoundException 是最常见的类装入异常类型。它发生在装入阶段。Java 规范对 ClassNotFoundException 的描述是这样的：<br />    当应用程序试图通过类的字符串名称，使用以下三种方法装入类，但却找不到指定名称的类定义时抛出该异常。<br />    * 类 Class 中的 forName() 方法。<br />    * 类 ClassLoader 中的 findSystemClass() 方法。<br />    * 类 ClassLoader 中的 loadClass() 方法。<br />    所以，如果显式地装入类的尝试失败，那么就抛出 ClassNotFoundException。<br />    这些异常修复起来通常比较简单。可以用  verbose 选项检查类路径，确保使用的类路径设置正确。如果类路径设置正确，但是仍然看到这个错误，那么就是需要的类在类路径中不存在。要修复这个问题，可以把类移动到类路径中指定的目录或 JAR 文件中，或者把类所在的位置添加到类路径中。<br /><br /><b>NoClassDefFoundError</b><br />    NoClassDefFoundError 是类装入器在装入阶段抛出的另一个常见异常。JVM 规范对 NoClassDefFoundError 的定义如下：<br />    如果 Java 虚拟机或 ClassLoader 实例试图装入类定义（作为正常的方法调用的一部分，或者作为使用 new 表达式创建新实例的一部分），但却没有找到类定义时抛出该异常。<br />    当目前执行的类已经编译，但是找不到它的定义时，会存在 searched-for 类定义。 <br />    实际上，这意味着 NoClassDefFoundError 的抛出，是不成功的隐式类装入的结果。<br />    简单说来，就是引用的类在类路径中没有找到。<br /><b>ClassCastException</b><br />    类装入器能够抛出的另一个异常是 ClassCastException。它是在类型比较中发现不兼容类型的时候抛出的。JVM 规范指定 <b>ClassCastException </b>是：<br />    该异常的抛出，表明代码企图把对象的类型转换成一个子类，而该对象并不是这个子类的实例。 <br /><b>UnsatisfiedLinkError</b><br />    在把本地方法调用链接到对应的本机定义时，类装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时，在链接阶段的解析过程会发生 UnsatisfiedLinkError。JVM 规范指定 UnsatisfiedLinkError 是：<br />    对于声明为 native 的方法，如果 Java 虚拟机找不到和它对应的本机语言定义，就会抛出该异常。 <br />    当调用本机方法时，类装入器会尝试装入定义了该方法的本机库。如果找不到这个库，就会抛出这个错误。<br />    本机库的装入由调用 System.loadLibrary() 方法的类的类装入器启动 ，根据使用的类装入器，会搜索不同的位置：<br />    * 对于由 bootstrap 类装入器装入的类，搜索 sun.boot.library.path。<br />    * 对于由扩展类装入器装入的类，先搜索 java.ext.dirs，然后是 sun.boot.library.path，然后是 java.library.path。<br />    * 对于由系统类装入器装入的类，搜索 sun.boot.library.path，然后是 java.library.path。<br /><b>ClassCircularityError</b><br />    JVM 规范指定 ClassCircularityError 的抛出条件是：<br />    类或接口由于是自己的超类或超接口而不能被装入。 <br />    这个错误是在链接阶段的解析过程中抛出的。这个错误有点奇怪，因为 Java 编译器不允许发生这种循环情况。但是，如果独立地编译类，然后再把它们放在一起，就可能发生这个错误。<br /><b>ClassFormatError</b><br />JVM 规范指出，抛出 ClassFormatError 的条件是：<br />    负责指定所请求的编译类或接口的二进制数据形式有误。 <br />    这个异常是在类装入的链接阶段的校验过程中抛出。如果字节码发生了更改，例如主版本号或次版本号发生了更改，那么二进制数据的形式就会有误。例如，如果对字节码故意做了更改，或者在通过网络传送类文件时现出了错误，那么就可能发生这个异常。<br />    修复这个问题的惟一方法就是获得字节码的正确副本，可能需要重新进行编译。<br /><b>ExceptionInInitializerError</b><br />根据 JVM 规范，抛出 ExceptionInInitializer 的情况是：<br />    * 如果初始化器突然完成，抛出一些异常 E，而且 E 的类不是 Error 或者它的某个子类，那么就会创建 ExceptionInInitializerError 类的一个新实例，并用 E 作为参数，用这个实例代替 E。<br />    * 如果 Java 虚拟机试图创建类 ExceptionInInitializerError 的新实例，但是因为出现 Out-Of-Memory-Error 而无法创建新实例，那么就抛出 OutOfMemoryError 对象作为代替。<br /><br /></span>
<img src ="http://www.blogjava.net/zyl/aggbug/97881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyl/" target="_blank">布衣郎</a> 2007-02-04 20:58 <a href="http://www.blogjava.net/zyl/archive/2007/02/04/97881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>