﻿<?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-george-随笔分类-java</title><link>http://www.blogjava.net/george/category/38336.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 13 Dec 2009 08:21:15 GMT</lastBuildDate><pubDate>Sun, 13 Dec 2009 08:21:15 GMT</pubDate><ttl>60</ttl><item><title>spring注解笔记</title><link>http://www.blogjava.net/george/archive/2009/12/07/305078.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Mon, 07 Dec 2009 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/12/07/305078.html</guid><wfw:comment>http://www.blogjava.net/george/comments/305078.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/12/07/305078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/305078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/305078.html</trackback:ping><description><![CDATA[spring注解使用了有一段时间了，现做几个就简单的记录，具体是使用方式不用多说网上很多，这里便于记忆简单整理一下。<br />
1.注入的属性有2种方式<br />
&nbsp;&nbsp;&nbsp;1.1&nbsp;@Autowired（按类型type注入）<br />
&nbsp;&nbsp;&nbsp;1.2 @Resource（按名字name注入），<br />
&nbsp;&nbsp;&nbsp;&nbsp;另：如果遇到重复使用@Qualifer标注别名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不需要某些属性注入可以设置Autowired或resources的required属性为false<br />
2.将bean纳入spring容器有4种方式<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.1 @Component（表示是spring容器中的bean，比较中立,没有其他含义）<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.2&nbsp;@Controller ，@Service ，@Repository，这3种和@Compnent功能一样，只是用于三层架构中的控制，业务及持久层。目前只是命名不同。<br />
&nbsp;&nbsp;&nbsp;&nbsp;另：@Scope可以定义bean的作用范围。<br />
3.对于注解需要配置context:component-scan定义初始化容器扫描的目录。<br />
<pre class="displaycode">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">context:component-scan&nbsp;</span><span style="color: #ff0000">base-package</span><span style="color: #0000ff">="com.blog"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context:include-filter&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="regex"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000ff">="com\.blog\.service\..*"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context:exclude-filter&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="aspectj"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000ff">="com.blog.util..*"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context:component-scan</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
</pre>
<br />
4.注释配置和 XML 配置的适用场合
<p>&nbsp;&nbsp;&nbsp;&nbsp;4.1注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的，（如 Service 使用了哪几个 DAO 类），这种配置信息不会在部署时发生调整，那么注释配置优于 XML 配置；反之如果这种依赖关系会在部署时发生调整，XML 配置显然又优于注释配置，因为注释是对 Java 源代码的调整，您需要重新改写源代码并重新编译才可以实施调整。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.2如果 Bean 不是自己编写的类（如 JdbcTemplate、SessionFactoryBean 等），注释配置将无法实施，此时 XML 配置是唯一可用的方式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.3注释配置往往是类级别的，而 XML 配置则可以表现得更加灵活。比如相比于 @Transaction 事务注释，使用 aop/tx 命名空间的事务配置更加灵活和简单。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.4所以在实现应用中，我们往往需要同时使用注释配置和 XML 配置，<strong>对于类级别且不会发生变动的配置可以优先考虑注释配置</strong>；<strong>而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置</strong>。<br />
参考资料：&nbsp;<br />
<a href="http://kdboy.javaeye.com/blog/419159">http://kdboy.javaeye.com/blog/419159</a> <br />
<a href="http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/">http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/</a></p>
<img src ="http://www.blogjava.net/george/aggbug/305078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-12-07 23:21 <a href="http://www.blogjava.net/george/archive/2009/12/07/305078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat内存溢出总结</title><link>http://www.blogjava.net/george/archive/2009/08/18/291579.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Mon, 17 Aug 2009 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/08/18/291579.html</guid><wfw:comment>http://www.blogjava.net/george/comments/291579.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/08/18/291579.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/291579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/291579.html</trackback:ping><description><![CDATA[在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的，当然处理方式也不一样。<br />
这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.OutOfMemoryError: Java heap space<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.OutOfMemoryError: PermGen space<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.OutOfMemoryError: unable to create new native thread.<br />
对于前两种情况，在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。（-Xms -Xmx -XX:PermSize&nbsp; -XX:MaxPermSize）<br />
最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。<br />
<br />
第一种：是堆溢出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JVM中如果98％的时间是用于GC且可用的 Heap size 不足2％的时候将抛出此异常信息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没有内存泄露的情况下，调整-Xms -Xmx参数可以解决。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Xms:初始堆大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Xmx:最大堆大小&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但堆的大小受下面三方面影响：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.相关操作系统的数据模型（32-bt还是64-bit）限制；（32位系统下，一般限制在1.5G~2G；我在2003 server 系统下（物理内存：4G和6G，jdk：1.6）测试 1612M，64为操作系统对内存无限制。）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.系统的可用虚拟内存限制；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.系统的可用物理内存限制。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;堆的大小可以使用 java -Xmx***M&nbsp; version 命令来测试。支持的话会出现jdk的版本号，不支持会报错。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m <br />
<br />
第二种：永久保存区域溢出<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域，它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理，所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。<a href="http://www.javaeye.com/topic/80620?page=1">http://www.javaeye.com/topic/80620?page=1</a>&nbsp;的帖子有讨论的这个问题。可能是由于这些框架会动态class，而且jvm的gc是不会清理PemGen space的，导致内存溢出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这一个一般是加大-XX:PermSize&nbsp; -XX:MaxPermSize 来解决问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-XX:PermSize 永久保存区域初始大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-XX:PermSize 永久保存区域初始最大值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这一般结合第一条使用，比如 set JAVA_OPTS= -Xms1024m -Xmx1024m&nbsp; -XX:PermSize=128M -XX:PermSize=256M<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有一点需要注意：java -Xmx***M&nbsp; version 命令来测试的最大堆内存是 -Xmx与&nbsp;-XX:PermSize的 和 比如系统支持最大的jvm堆大小事1.5G，那&nbsp;&nbsp;-Xmx1024m&nbsp; -XX:PermSize=768M 是无法运行的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
第三种：无法创建新的线程。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种现象比较少见，也比较奇怪，主要是和jvm与系统内存的比例有关。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G)，并且它至少要占用可用内存的一半。有人发现，在线程个数很多的情况下，你分配给JVM的内存越多，那么，上述错误发生的可能性就越大。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;产生这种现象的原因如下（<a href="http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html">从这个blog中了解到原因：http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html</a>）：
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每一个32位的进程最多可以使用2G的可用内存，因为另外2G被操作系统保留。这里假设使用1.5G给JVM，那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载，那么真正剩下的也许只有400M，现在关键的地方出现了：当你使用Java创建一个线程，在JVM的内存里也会创建一个Thread对象，但是同时也会在操作系统里创建一个真正的物理线程(参考JVM规范)，操作系统会在余下的400兆内存里创建这个物理线程，而不是在JVM的1500M的内存堆里创建。在jdk1.4里头，默认的栈大小是256KB，但是在jdk1.5里头，默认的栈大小为1M每线程，因此，在余下400M的可用内存里边我们最多也只能创建400个可用线程。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样结论就出来了，要想创建更多的线程，你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。</p>
<p>给出一个有关能够创建线程的最大个数的估算公式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于jdk1.5而言，假设操作系统保留120M内存：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在2000/XP/2003的boot.ini里头有一个启动选项，好像是：<font color="#339966"><strong>/PAE /3G</strong></font> ，可以让用户进程最大内存扩充至3G，这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此这种情况需要结合操作系统进行相关调整。<br />
<br />
因此：我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题。<br />
<br />
参考资料（从这些资料中受益良多）：<br />
<a href="http://www.javaeye.com/topic/80620?page=1">http://www.javaeye.com/topic/80620?page=1</a> <br />
<a href="http://ggmm.blog.sohu.com/117545379.html">http://ggmm.blog.sohu.com/117545379.html</a> <br />
<a href="http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html">http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html</a> <br />
<a href="http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html">http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html</a> </p>
<br />
<img src ="http://www.blogjava.net/george/aggbug/291579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-08-18 00:28 <a href="http://www.blogjava.net/george/archive/2009/08/18/291579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached资源</title><link>http://www.blogjava.net/george/archive/2009/07/25/288402.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Sat, 25 Jul 2009 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/07/25/288402.html</guid><wfw:comment>http://www.blogjava.net/george/comments/288402.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/07/25/288402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/288402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/288402.html</trackback:ping><description><![CDATA[memcached是目前比较不错的缓存。是一种集中式可以分布式部署的。现在许多大型的网站（facebook，豆瓣等）都使用memcached作为提高网站性能的重要的一环。<br />
最近在一个项目中用到了它感觉不错，下面提供一些不错的资源。<br />
Memcached相关资源：<br />
官方网站：<a href="http://www.danga.com/memcached/" target="_blank">http://www.danga.com/memcached/<br />
</a>Java client：<a href="http://www.infoq.com/cn/articles/memcached-java" target="_blank">http://www.infoq.com/cn/articles/memcached-java</a>&nbsp;<br />
不错的中文资源：<a href="http://tech.idv2.com/2008/08/17/memcached-pdf/" target="_blank">http://tech.idv2.com/2008/08/17/memcached-pdf/ （如果要了解memcached细节这个不错）<br />
</a>windows memcache安装：<a href="http://www.fcicq.net/wp/?p=160" target="_blank">http://www.fcicq.net/wp/?p=160</a>&nbsp;<br />
<br />
<span lang="EN-US" style="font-size: 20pt; mso-fareast-font-family: 黑体; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN"><strong><span style="font-size: 12pt"><span style="font-family: 黑体; mso-fareast-font-family: 黑体; mso-hansi-font-family: Arial"><strong><br />
</strong></span></span></strong></span>
<img src ="http://www.blogjava.net/george/aggbug/288402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-07-25 23:55 <a href="http://www.blogjava.net/george/archive/2009/07/25/288402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java处理图片的水印效果</title><link>http://www.blogjava.net/george/archive/2009/05/03/268700.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Sun, 03 May 2009 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/05/03/268700.html</guid><wfw:comment>http://www.blogjava.net/george/comments/268700.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/05/03/268700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/268700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/268700.html</trackback:ping><description><![CDATA[最近想做一个动态的图标，类似于iphone中的信息图标，图片上可以动态的显示通知信息的数目。<br />
因此就想到的水印效果，将一个默认的背景图片和数字合成。<br />
<br />
下面的这篇文章可以大大这个目的：<br />
<a href="http://javaeyetianjin.group.javaeye.com/group/topic/8527">http://javaeyetianjin.group.javaeye.com/group/topic/8527</a><br />
但缺点也很明显，图像会有一定程度的失真。<br />
BufferedImage image = new BufferedImage(wideth, height,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_ARGB);<br />
可能在图片的处理过程中将像素打包成整数造成的。<br />
目前还没找到比较好的方案。<br />
<br />
<a href="http://www.blogjava.net/Alpha/archive/2007/08/20/138171.html">http://www.blogjava.net/Alpha/archive/2007/08/20/138171.html</a><br />
这个处理还是有点失真。<br />
<img src ="http://www.blogjava.net/george/aggbug/268700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-05-03 17:10 <a href="http://www.blogjava.net/george/archive/2009/05/03/268700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于spingside</title><link>http://www.blogjava.net/george/archive/2009/03/19/260608.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Wed, 18 Mar 2009 16:49:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/03/19/260608.html</guid><wfw:comment>http://www.blogjava.net/george/comments/260608.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/03/19/260608.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/260608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/260608.html</trackback:ping><description><![CDATA[关注springside已经有一段时间，<br />
最早是从2.0版本开始的，现在已经到了3.1.2了。<br />
ss给我的感觉是从新鲜到兴奋到失望。这儿发点牢骚。<br />
主要体现在下面几点；<br />
1.springside项目的延续性不好<br />
ss2到ss3.1.2随着版本号的增加功能确越来越小。做的一些demo演示越来越不实用。<br />
很怀念书店的demo，这个例子可以所是让ss经过了一个实践的检验，里面的技术细节考虑的要比现在的miniservice，miniexample要周全的多。<br />
我喜欢ss一方面是因为他的新鲜的架构组合和新技术指导性，另一方很大程度上是因为这个demo，他让我看到了新架构带来的生产力，实在的东西。<br />
而现在你在从springside<a href="http://www.springside.org.cn">官方网站</a>下载SpringSide 2.0 RC1 all in one，下来运行一下看看，没有半天到一天的时间更不不可能跑起来。这个里面使用maven来管理jar包，使用ant来调用，遗憾的是springside原先建立的私有lib Repository已经消失了，在这个项目中依赖的包非常多，有些是可以在公共的Repository找到的，这部分到好办直接加入公共的Repository地址就可以了，而有以部分是经过springside封装或重新打包的这些包何处去寻，那只好把这一部分屏蔽掉了，保证项目的运行。原来引入这个maven工具是为了很方面明晰的找到依赖的包，这下倒好反而成了绊脚石。要理清楚里面的关系，还是要一点时间的。这个就是项目不延续造成的。<br />
那有人就奇怪了，说你为什么不用最新的版本，而这也是我的苦衷，现在的最新版本倒是很轻量，把这些东西全砍掉了，只留下了一些miniexample，很难有进一步的更细节一点的指导，而且这些东西没有经过一些实际项目的检验，可能还是会在细节上有所欠缺。就像一开始ss被封装成像ruby一样类似自动crud功能，而这个想法固然很cool但在实际应用中还是一个花架子，有很多不周全的地方，如果对基类不是很了解的情况下很难使用，反而没有自己写的明晰快速。<br />
<br />
2.定位不明晰<br />
ss2到ss3.12像是走了两个极端，一个功能非常多（包括 jms,mail,jbossrules,lucene,compass,acegi,cxf,jbpm,activemq），一个一下瘦身太厉害基本减完了。<br />
虽然在后续可开发计划中会陆续的补充，但是和ss2相比波动太大，而没有在ss2基础上过度过来，好像是另起炉灶的感觉。<br />
现在再想想ss的定位，&nbsp; <br />
&nbsp; SpringSide是以<span class="nobr"><a href="http://www.springframework.org/" title="Visit page outside Confluence" rel="nofollow">Spring Framework<sup><img class="rendericon" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7" /></sup></a></span>为核心，提供Pragmatic的企业应用开发开源Kickstart。<br />
&nbsp; 定位愈加清晰，不再企图做一个RoR/Gails式的框架，只做主流选型组合的编程模式总结。<br />
&nbsp; SpringSide2.0的末期有点繁杂与失控，何宝荣说：不如我们从头来过<br />
这里是Pragmatic（实用的），难道和ss2相比就ss3会更使用，技术更新这是肯定的，新技术当然可以吸引一部分眼球，但一旦使用了ss后更希望是项目上的指导。而如果只是些miniweb在项目上遇到的问题是很难依靠这个来解决的，感觉这会伤了许多ss fans的心。<br />
定位愈加清晰，不再企图做一个RoR/Gails式的框架，只做主流选型组合的编程模式总结。这一点我认同<br />
SpringSide2.0的末期有点繁杂与失控，何宝荣说：不如我们从头来过&nbsp;&nbsp; ss2确实比较复杂，但是里面也不乏经典的东西，很多地方都可以为实际项目所借鉴。重头来过这个会伤了我们，如果安版本持续下去哪怕版本慢一些，这样不好吗，重头来过，你是要多ss用户负责的。（貌似现在svn中2.0的源码已经没了）<br />
这里说一些题外话：<br />
在现在的互联网发展速度非常快，在互联网公司基本使用的都是动态语言，他们更敏捷，java在web的敏捷方面是如何优化也不能和他们相比的。而什么公司会用ss这类的东西来搭建企业应用呢，一般都一些集团公司的信息系统或门户，而不是互联网公司，如果互联网公司用java做主营业务，那大部分都没有饭吃（当然不排除一些特例），而这些集团公司更需要的是稳定，不过是功能和性能上的稳定，更重要的是技术上的稳定，因为他们打部分是以流程和业务为核心，如果使用动态语言去创新获得良好的用户体验，但技术变化过快，在人员流动的情况下企业的业务很容易收到影响。而作为一个信息规划人员，一般都会考虑使用一种相对稳定的技术，因为系统延续性，和信息的集成和流动才是最重要的，作为一个业务支撑部门。有句话说的好，我们需要创新，但应该是持续创新，而不是破坏性创新。因此在这些用户群体才是最需要ss的，而不是要把ss搞和动态语言一样轻量。如果ss在这方面当然是项目更深入更细节的问题上给于指导，那是最好不过了，bookstore的demo就是一个不错的列子（当然还是有一些问题，比如在acegi的acl上还要进一步细化，等等）。而不是像现在的miniweb把我们领到ss里，然后撒手不管了。<br />
<br />
说了这么多，没别的意思，希望springside更好。刚才出社会没多久，可能有些地方视野还没达到，这里只是说说我的想法。有不对的地方多多包含。
<img src ="http://www.blogjava.net/george/aggbug/260608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-03-19 00:49 <a href="http://www.blogjava.net/george/archive/2009/03/19/260608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用lucene开发简单的站内搜索</title><link>http://www.blogjava.net/george/archive/2009/03/18/260583.html</link><dc:creator>georgeliu</dc:creator><author>georgeliu</author><pubDate>Wed, 18 Mar 2009 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/george/archive/2009/03/18/260583.html</guid><wfw:comment>http://www.blogjava.net/george/comments/260583.html</wfw:comment><comments>http://www.blogjava.net/george/archive/2009/03/18/260583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/george/comments/commentRss/260583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/george/services/trackbacks/260583.html</trackback:ping><description><![CDATA[<br />
关于这个内容javaeye已经有不错的例子了<br />
http://jnotnull.javaeye.com/blog/275327<br />
<br />
在这个例子的基础上我想说一一些需要注意的地方。<br />
<strong>1.重建索引和增量索引</strong>：<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;">IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(directory,analyzer,rebuild,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter.MaxFieldLength(</span><span style="color: #000000;">200000</span><span style="color: #000000;">));</span></div>
<br />
只需要在构造IndexWriter的时候设置rebuild值就可以了<br />
当rebuild设为true的时候：就会删除原来的索引，重建索引文件<br />
当rebuild设为false时：表示增量索引，是在原来索引文件的基础上增加新的索引内容，当然第一次没有索引文件的时候必须先重建索引生成索引文件。<br />
<br />
在lucene2.4中不使用<span>Field.Index.TOKENIZED而是使用</span><span style="color: #000000;">Field.Index.ANALYZED，表示要对这个field进行分词<br />
</span>
<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;">if</span><span style="color: #000000;">(article.getArticleId()</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;doc.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Field(Fields.FIELD_ARTICLEID,article.getArticleId(),Field.Store.YES,Field.Index.NOT_ANALYZED));<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(article.getTitle()</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;doc.add(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Field(Fields.FIELD_TITLE,article.getTitle(),Field.Store.YES,Field.Index.ANALYZED));</span></div>
当然这里的<span style="color: #000000;">Fields.FIELD_ARTICLEID</span>是自定义的类变量<br />
<strong><br />
2.分页检索</strong><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;">ScoreDoc[]&nbsp;hits&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;searcher.search(query,</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,startIndex</span><span style="color: #000000;">+</span><span style="color: #000000;">perPage,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Sort(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">))).scoreDocs;<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;numTotalHits&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;searcher.maxDoc();</span><span style="color: #008000;">//</span><span style="color: #008000;">hits.length;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;endIndex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.min(numTotalHits,startIndex&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;perPage);</span></div>
使用<span style="color: #000000;">searcher.maxDoc()取出搜索的总记录数，使用</span><span style="color: #000000;">search(query,</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,startIndex</span><span style="color: #000000;">+</span><span style="color: #000000;">perPage,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Sort(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">))).scoreDocs取出当前一页的索引记录（这个是2.4的新用法，可以获得更高的性能），</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Sort(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SortField(Fields.FIELD_CHECKTIME,SortField.AUTO,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)))来处理索引结果的排序。<br />
</span>
<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;">Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">searcher.doc(hits[i].doc);<br />
String&nbsp;title1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;doc.get(Fields.FIELD_TITLE);</span></div>
使用<span style="color: #000000;">searcher.doc(hits[i].doc)取出索引的具体记录</span><br />
<br />
<strong>3.高亮显示</strong><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;">SimpleHTMLFormatter&nbsp;simpleHTMLFormatter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleHTMLFormatter(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;b&gt;&lt;font&nbsp;color='red'&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/font&gt;&lt;/b&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Highlighter&nbsp;highlighter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Highlighter(simpleHTMLFormatter,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;QueryScorer(query));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
highlighter.setTextFragmenter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFragmenter(bestMatchSize));<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(title1&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;TokenStream&nbsp;tokenStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;analyzer.tokenStream(Fields.FIELD_TITLE,<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;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringReader(title1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;highLightTitle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;highlighter.getBestFragment(tokenStream,title1);<br />
}</span></div>
<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleHTMLFormatter(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;b&gt;&lt;font&nbsp;color='red'&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/font&gt;&lt;/b&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">)构造高亮显示的样式。</span><br />
<span style="color: #000000;">highlighter.setTextFragmenter(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleFragmenter(bestMatchSize))设置显示索引内容的最大字符数，相当于自动抽取含有关键的摘要。</span><br />
<br />
<br />
当然这个只是简单索引和检索过程。<br />
还有一些其他工作要做：<br />
1.索引的过程就是查询的过程，需要把没有索引的文章查询出来进行索引，完毕有要打上标记。这里面就要为文章扩展索引标记，建立一些文章查询。<br />
2.将索引操作加入调度定时执行，这个用quartz就可以了。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/george/aggbug/260583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/george/" target="_blank">georgeliu</a> 2009-03-18 21:48 <a href="http://www.blogjava.net/george/archive/2009/03/18/260583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>