
Java
cherami
这个作者很懒,什么都没留下…
展开
-
有时候并不是很喜欢IoC/DI
相信现在做Java的人都应该听说过IoC/DI,也就是由容器负责类之间的初始化和组装,好处是很明显的,你不用自己写代码维护类之间的依赖关系,而且如果别人想用某个实现替换你的,也很简单,修改下配置文件就可以,但是有时候,例如你在看别人的源代码的时候,你想知道某个类谁在使用,很可能用IDE的工具是找不到的(例如Eclipse的References功能),但是这个类确实是被别的类引用的。呵呵,当然,这...2007-03-21 09:02:57 · 103 阅读 · 0 评论 -
数据库可移植性重要吗?
对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用ORM的应用可能也问题不大,但是一旦需求来了,它就变得非常的重要,现在我们就遇到了这样的需求。我们原来一直使用Oracle,也从来没有想到要更换数据库类型,所以我们一直心安理得的使用各种Oracle优化技巧来优化我们的SQL(我们的系统的性能要求也比较高),现在有个新客户,要求使用SQL Server,这下就麻烦大了,初步估计需要50...2007-04-18 06:30:31 · 1536 阅读 · 0 评论 -
使用工具修改代码时一定要谨慎
今天早上来更新了下代码,发现自己负责的和Crystal Report集成的代码突然不能工作了,刚好昨天升级了Crystal Report,而我们明天早上就要做演示的,天啊。不过好在我是一个经验丰富的老鸟了,这点事情还不至于让我手忙脚乱,看了下控制台,没有异常信息,在关键代码的地方设置了断点,跟踪了下,发现原来工作的一个Query不能工作了,但是异常被截获并忽略了,把异常信息打出来,报的信息是查询...2007-04-19 03:21:11 · 178 阅读 · 0 评论 -
Java序列化确实很慢啊
我们的系统还使用古老的Ant1.5作为构建工具,而且做了一些定制(可能修改了部分源代码),我们就不能随便升级到高版本,而Ant1.5的那个Junit的task比较旧,运行每个TestCase的时候都是重新开一个新的VM,而我们的单元测试框架要读取很多EJB配置文件完成初始化,如果每个TestCase都去解析那些文件就太慢了,每个TestCase至少需要10秒,所以没有办法,我就把所有的Case都手...2007-04-25 06:37:10 · 538 阅读 · 0 评论 -
links for 2007-05-12
Lucene Hack之通过缩小搜索结果集来提升性能 (1)(tags: lucene 性能 搜索) 作者: 解惑/Cherami 原载: links for 2007-05-12 版权所有。转载时必须以链接形式注明作者和原始出处及本声明。 分类: Java...2007-05-12 14:21:57 · 98 阅读 · 0 评论 -
太复杂了!!!
今天总算是把工程在Eclipse下配置好了,而且没有任何错误,从Oneal那里拷贝来的工程文件一堆错误,我这个人又是那种容不得满眼全是错误的人,花了一个小时搞定这个问题,开始熟悉项目,结果是:真是太复杂了!系统的大部分都是通过Web Service调用的,包括和其他的系统集成以及和工作流引擎集成,而Web Service又是通过Session Bean调用DAO,DAO再调用hibernate,...2007-07-03 12:58:50 · 193 阅读 · 0 评论 -
AR何其多
看了新公司的发布目录,感叹公司把Java相关的发布包用得出神入化,从最简单的Jar到最常见的War,以及中大型J2EE工程中的Ear,然后是JBoss特定的Sar,以及被Jboss收购后的Hibernate提供的Har,真的是被AR搞混头了,特此列举一下:JAR:java类文件的打包发布WAR:WEB应用的打包发布EAR:J2EE应用的打包发布,一般包括EJBSAR:JBoss的Serv...2007-07-09 13:29:56 · 112 阅读 · 0 评论 -
JSP的一个小误区
相信很多人在面试的时候都会被问到JSP和Servlet的区别,我认为JSP就是功能受限的Servlet,因为JSP不能作为后台的控制Servlet用,但是实际上我的这个想法是错误的,JSP是可以像普通的Serlvet那样作为控制用的Servlet用的,在web.xml里面定义一下就行了: <servlet> <servlet-name>control...2007-07-12 11:15:09 · 105 阅读 · 0 评论 -
Hot Deploy成功
前几天曾经抱怨新公司的开发环境太复杂,不能Hot Deploy,极其影响开发的效率,今天成功的在Eclipse(实际上是MyEclipse)中配置好了可以Hot Deploy的环境,其实也很简单,我们的工程发布非常的复杂,sar, ear, har, jar, war一个套一个,要想严格的按照那个目录结果配置工程几乎不可能,但是要想Hot Deploy很简单,配置一个Web工程,引入全部的工程需要...2007-07-12 11:24:08 · 418 阅读 · 0 评论 -
文件删除不成功
Java的功能在某些地方确实很有缺陷,File的delete方法就是一个很大的问题,如果文件被使用而不能删除,那么这个方法调用是不会抛出异常的,也不会返回任何信息,就像方法调用根本没有发生一样。由于是临时产生的文件,如果不能删除,那么文件越来越多就可能撑爆硬盘。方法当然可以有一些,例如可以加一个线程不停的试,,删除不成功就等待一段时间,直到删除成功,这个方法应该是比较有效的,因为大部分情况下,文...2007-07-12 11:31:21 · 210 阅读 · 0 评论 -
URLDataSource请求资源三次的问题
这个是进公司的第二个任务,由于是多个应用服务器集群,而产生pdf报表和发送邮件是通过JMS的异步方式,因此可能是服务器A产生PDF文件,而服务器B发送邮件,原来的实现是通过FileDataSource从本机取,因此有时候就不能成功发送邮件,后来修改为使用URLDataSource从自己写的一个Servlet取,但是很奇怪的是对于每个资源都会被请求三次,上网找了下,有个人也遇到同样的问题,但是他最后...2007-07-13 04:58:48 · 600 阅读 · 0 评论 -
使用JBossCache作为Hibernate的二级缓存
这个是最近的工作成果,使用JBossCache作为Hibernate的二级缓存,因为JBossCache支持Transactional的缓存策略(Strategy),而且支持Cluster,Cluster还支持Invalidation的方式,比Replication方式更好,对两种方式同时支持同步和异步,还有其他很多特性,比OSCache好得多。由于我们是把Hibernate作为服务配置的,所以...2007-07-23 11:36:48 · 150 阅读 · 0 评论 -
推荐一个Eclipse插件:Implementors
也许有点老土了,但是这个插件确实是刚刚别人推荐给我的,而且很好用,特别是对于EJB开发之类的需要提供接口并实现的情况下,不用再自己去找实现类了。感兴趣的自己去下载吧。 作者: 解惑/Cherami 原载: 推荐一个Eclipse插件:Implementors 版权所有。转载时必须以链接形式注明作者和原始出处及本声明。 分类: Java...2007-08-01 05:06:10 · 173 阅读 · 0 评论 -
使用AOP带来的问题
AOP绝对是个好东西,但是因为大部分的AOP实现都是通过修改字节码实现的,这就给Hot Deploy带来问题,在进行Hot Code Replace的时候JVM会抛错:Hot code replace failed - Hierarchy change not implemented,根据字面的意思,我猜测是JVM判断出原始的字节码有变化,但是JVM中的字节码是修改过的,类似子类的结构。目前还没有...2007-08-02 04:57:34 · 295 阅读 · 0 评论 -
得到当前方法
在写代码的时候我们可能会需要当前的方法名,特别是在输出一些调试信息的时候,但是如果使用字符串硬写的话不太好,API好像也不带对应的功能,如果细心的话,异常信息里面是带出错的方法名的,我们可以dump stack trace并分析得到当前方法的方法名,实际上有更好的方法,和dump stack trace类似:public static String getCurrentMethodName() ...2007-08-09 13:53:46 · 132 阅读 · 0 评论 -
Tomcat集群概要
其实已经有很多文档了,不过还是老话,给自己备忘,总结些要注意的要点,给一些范例,以后肯定用得着。以JK作为Apache和Tomcat的连接器,首先配置的是Apache的httpd.conf,主要是加载JK和配置转发规则:加载和配置JK: # Load mod_jk module# Specify the filename of the mod_jk libLoadModule jk_mo...2007-09-05 03:59:50 · 113 阅读 · 0 评论 -
Eclipse的一个问题
最近遇到的,偶然间解决的,如果一些文件和目录已经被Workspace中的一个工程引用(即使是处于Close状态的),如果你另外的工程创建到那些文件的引用的时候会报错,你刷新的时候也会出问题。最简单的解决办法就是关闭其他的工程,需要的时候再打开。 作者: 解惑/Cherami 原载: Eclipse的一个问题 版权所有。转载时必须以链接形式注明作者和原始出处及本声明。 分类:...2007-09-05 06:13:53 · 123 阅读 · 0 评论 -
Java远程调试
其实就是使用了JDK的JPDA,在启动服务器(Jboss或者Tomcat等)的命令行参数里面加上:-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n以Eclipse作为调试工具的话,创建一个Remote Java Application,连接参数填写正确的IP和端口(就是上面的8787)就行了 ...2007-09-05 06:47:29 · 117 阅读 · 0 评论 -
没落的Java社区
感觉原来的几个Java社区日益没落,当然这个和Java世界的消沉有很大关系,这两年已经看不到什么大的Java新闻了,特别是对于Java开发人员而言的大新闻,原来Spring带来的各种火热的讨论也已经沉寂下来,Java世界似乎已经毫无新意了,现有的任何Java开源产品或者组件所能够带来的开发效率的提升都无法和新的脚本语言匹敌(我想这也是为什么JavaEye会使用RoR重写的一个重要原因,同时也是Ro...2007-04-17 09:27:38 · 196 阅读 · 0 评论 -
也谈Java基础的重要性(续)
呵呵,意犹未尽,继续批驳。banq先生对自己的思维和真正想法并不是了然于胸,我想他不关心的是业务逻辑的实现了,他说他已经很多年不去翻J2SE了,那是因为他已经很多年不是“程序员”了,他不需要使用他的框架去完成一个实际的业务系统,你把这个框架做了,你鼓动别人去使用框架,去学习设计,还有意义吗?如果别人都去提高学习了,都去设计了,就不会有人用他的框架,而如果别人都不用,那他搞那个框架又是为了什么呢?...2007-04-10 08:09:44 · 155 阅读 · 0 评论 -
Java很简单也很难
说Java简单,是因为它的语法,这个也是当初最吸引我的,我被C++的语法搞蒙了。但是,在实际的工作中,能够真正把Java使用得自如的人并不是很多,见到的大部分的人写代码没有问题,但是如果遇到一些问题就茫然了,不知道如何去解决问题,虽然有些人知道用google可以解决很多问题,但是有时候是因为自己的某些问题导致的问题,也有时候仅仅是开发环境的一些干扰导致的,很少有人和他遇到的问题完全一样。在这种情...2007-03-23 02:12:55 · 334 阅读 · 0 评论 -
JUnit的Failure Trace的一个问题
不知道有没有人注意过或者写过,就是如果你在使用assertEquals比较一个字符串和一个对象的时候,Failure Trace给出的信息可能会误导你:junit.framework.AssertionFailedError: expected:<<script language="javascript" src="/js/common.js" />> but was:&...2007-03-27 03:51:33 · 657 阅读 · 0 评论 -
没有命名规范的代码是开发人员的地狱
我们已经开始了一个新的阶段,这个阶段的开始并不顺利,因为我遇到了一个原来并不是很常见的问题,我竟然找不到合适的API供我使用,而且是我们系统的基础服务的API,原因不是别的,就是因为命名规范,第一是方法名,原来的很多API的方法名就是开发人员随意取的(我们没有编码规范或者说命名规范),一个公共的Session Bean的Proxy的方法名竟然叫getAll,而它仅仅是返回一个特定的对象的集合,一般...2007-04-03 03:52:33 · 147 阅读 · 0 评论 -
如何替换\
以前也经常遇到这个问题,但是没有找到解决方案,今天再次遇到这个问题,搜索了下没有什么头绪,很多答案试验了下都是错误的,不得已,自己试吧,最终的结果是:replaceAll("\\\\", "\\\\\\\\")就是把字符串中的\替换成两个\,呵呵,变态吧。...2007-04-03 06:06:55 · 254 阅读 · 0 评论 -
如何设计API?
每个人设计API的思路可能都不一样,而我们公司的一些代码的API的设计很有意思,一个例子: public AppGroupConfigValueObj get(UserSession _userSession, AppGroupConfigValueObj invo) throws DataException { long start = System.curren...2007-04-03 09:38:35 · 120 阅读 · 0 评论 -
软件开发的最大困难其实在于消除重复代码
这个并不是我一时兴起的胡言乱语,而是我的肺腑之言。如果你仔细的审视一下你所在的项目的代码,你可能会发现其中60%以上的代码是何其的类似,充斥其中的都是类似的判断和循环,在项目的框架或者架构稳定下来以后,项目的工作就是每天重复类似的工作,然后就是这些类似的代码的比例越来越大。如果项目的架构或者框架代码不够好,而某一天有一个需求导致这些代码都要进行某种简单或者复杂的更新,那么你的噩梦就来了。软件开发...2007-04-03 10:06:06 · 366 阅读 · 0 评论 -
Google面试题解说性能之一:字符串运算VS数字运算
看到JavaEye上的几个人在讨论算法问题,其中一个就是Google的一个面试题,我也试了一下,而且可能比一般人试得程度更深一些,借这个题目简单的说说几个性能问题。这个是第一个,后面还会继续几个其它的讨论。讨论只是提点一下,主要还是要你自己读源代码并比较不同的实现为什么会有这么大的差别。注意,程序的运行结果是在JDK1.4.2上的,其它版本的JDK的运行结果可能稍有不同。先看代码:publi...2007-04-06 06:55:16 · 148 阅读 · 0 评论 -
Google面试题解说性能之二:分析问题
前面我们已经说了字符串运算和数学运算对性能的巨大影响,接下来我们看看分析程序,多思考给我们带来的好处。如果我们做一个简单的分析就可以知道,在尾数从0到9的连续十个数字中,只有尾数为1的数字的1的个数比其它的数字多,那么我们可以以10个数为单位进行分隔,计算尾数为0的数字包含1的个数,其它的9个值就以此为基础计算:public class GoogleFn { private stati...2007-04-06 07:24:02 · 131 阅读 · 0 评论 -
Google面试题解说性能之三:不要小看循环中的任何一个语句
对于任何语言来讲,循环永远是非分布式系统的性能的最大杀手,循环中的任何一个简单的语句对性能都是有影响的,只是影响的大小不同而已。第一个例子中的影响是比较大的,不同的实现方法的时间开销不同,然后这个微小的差异被循环次数放大后就非常的明显(3倍),而第二个例子,其本质是减少了循环执行的次数,虽然总的循环次数是一样的,但是最耗时的操作的执行次数被减少到1/10,所以产生的差异是非常巨大的(8倍)。我们再...2007-04-06 08:01:43 · 90 阅读 · 0 评论 -
Google面试题解说性能之三:不要小看循环中的任何一个语句
对于任何语言来讲,循环永远是非分布式系统的性能的最大杀手,循环中的任何一个简单的语句对性能都是有影响的,只是影响的大小不同而已。第一个例子中的影响是比较大的,不同的实现方法的时间开销不同,然后这个微小的差异被循环次数放大后就非常的明显(3倍),而第二个例子,其本质是减少了循环执行的次数,虽然总的循环次数是一样的,但是最耗时的操作的执行次数被减少到1/10,所以产生的差异是非常巨大的(8倍)。我们再...2007-04-06 08:01:43 · 88 阅读 · 0 评论 -
Google面试题解说性能之四:优化无止境
其实在例子二的基础上,我们进一步的分析,可以把缓存10个结果换成缓存100个结果,性能可以得到进一步提升:public class GoogleFn { private static int MAX = 13200000; private static int MAX2 = MAX / 10; private static int MAX3 = MAX2 / 10; privat...2007-04-06 08:30:55 · 118 阅读 · 0 评论 -
Google面试题解说性能之总结
呵呵,说了这么多,到底怎么优化性能还是没有说多少,而且一个产品的代码比这个例子复杂得多,怎么才能优化产品代码呢?很简单,找到性能瓶颈,而大部分的性能瓶颈都有一个特点:被执行的次数太多。一个耗时2分钟的操作,如果系统运行一天才需要运行一次,那么我们根本就不要去理会它,如果一个操作耗时2秒,但是一般运行一天它要被执行几千亿次,那么你就要小心了。如何才能知道系统中的哪些代码被执行的次数最多呢?有很多...2007-04-06 08:44:16 · 111 阅读 · 0 评论 -
Google面试题解说性能之五:人比电脑聪明
在例子四的基础上,我们可以进行更加深入的分析,我们还是以100为例,我们其实在大部分情况下可以省略循环,如果数字的百位数以上包含1的个数为0,而十位数不为1,那么当个位数大于1以后,我们可以中断底层的循环,这样我们又节省了很多的运算:public class GoogleFn { private static int MAX = 1320000000; private static in...2007-04-07 01:34:56 · 152 阅读 · 0 评论 -
Google面试题解说性能之六:数学显神威
其实很多问题一旦涉及到数学问题或者数据处理密集型问题,那么最终显现神威的就是数学公式,这个面试题也是这类问题,所以如果我们能够推导出一个数学公式就是最理想的,在前面的例子中,我们进行了一些深入的分析,根据前面的例子,你可能会尝试把步长从100扩展到1000或者10000,但是实际上这个方法遇到了瓶颈,因为循环嵌套的层次太多,计算公式太复杂也会导致问题。如果我们最开始尝试的时候把全部的f(n)的结果...2007-04-09 00:44:21 · 101 阅读 · 0 评论 -
Google面试题解说性能之七:缓存中间结果
上次已经说了fn的实现不能用来查找符合条件的n,因为这样做比前面的第一个例子中的性能比较差的那个还要差,原因就是有太多的重复计算,如果只是计算一个指定的数的结果,那么那个实现是无与匹敌的。但是我们是讲的性能优化,所以,我们就用它来做,放慢速度,然后使用其它的技巧来提高性能,这次的方法就是简单的使用缓存:public class GoogleFn { private static fina...2007-04-09 02:59:05 · 125 阅读 · 0 评论 -
Google面试题解说性能之八:工欲善其事必先利其器
按照原先的计划,这个系列只应该有四篇,但是后来打算多写一些,把这个问题研究透彻,所以出现了总结篇先于其它篇的情况。这次我们按照总结篇中提到的方法实际演示下代码覆盖工具如何帮助我们优化程序提高性能,先给出我们未经好好优化的程序:package com.jiehoo.util;public class GoogleFn { private static final int MAX = 2...2007-04-09 07:29:43 · 202 阅读 · 0 评论 -
也谈Java基础的重要性
呵呵,看到JDon上正在讨论j2se基础的重要性,忍不住也来说两句,可以这么说,我是完全反对banq的说法的。我不知道banq的功底到底如何,但是对于指导初学者,我觉得他完全不合格。编程,在大多数情况下是简单的,这个可以从印度大量使用高中生编程照样可以开发出稳定大型的系统可以看出来,而且以我的经验来看,做对日外包也是一样,因为他们的设计文档已经写得足够的详细,他们提供的底层框架已经足够傻瓜(和...2007-04-10 07:33:32 · 303 阅读 · 0 评论 -
JDK5中没被重视的重要特性:instrumentation
我们的产品中使用到这个特性了,主要是加载Jboss的AOP,另外Oneal的单元测试使用到了这个特性,使用的是jmockit,然后在Javaeye看到一个文章谈到性能优化,使用的是jamon,developerworks上也有两篇文章( Java 5 特性 Instrumentation 实践和 Java SE 6 新特性: Instrumentation 新功能 ),需要好好关注下。 ...2007-09-05 07:42:29 · 258 阅读 · 0 评论