解惑

解己之惑,解人之惑

分类:Java (第6页共20页)

Java技术

突然发现误解了EJB很多年

本来感觉是很理所当然的事情,那就是Bean要实现Remote或者Local借口,但是EJB规范里面并没有这个要求,只要Bean里面实现了Remote和Local里面定义的方法,方法签名完全一致,我所经历的所有的项目都是这样的。现在为另外一个项目做东西,在检查一些代码调用的时候发现跟踪不到,结果发现就是因为Bean没有实现接口,开始还笑话他们,后来google了下,发现原来是自己错了。不过实现接口也有好处,可以进行编译期检查约束。

Simple-JNDI

这个东东其实以前就想到要找的,但是那个时候使用了比较重量级的解决方案:JBoss的Embedded container,主要用于单元测试,我们的代码难于单元测试,原因就是对JNDI的严重依赖,以及JNDI Server必须启动,而JNDI服务是JBoss提供的。
现在找到的这个东东就是轻量级的JNDI Server,而且提供In Memory的工作方式,单元测试代码可以修改name对应的返回对象是什么,这样单元测试代码就可以很容易测试了。
网址:
http://osjava.org/simple-jndi/

Java的一些不易碰到的限制

这段时间在公司听到的,我想大部分的人都不会遇到,有次可见糟糕的代码风格会导致什么问题。

第一个是JSP太复杂了,包含了很多的JSP,最后为了修改一个BUG,增加了另外一个小JSP,结果发现JSP编译出错,出错原因是方法体超过64K,不可思意吧。

第二个是方法参数太多,也是一个人为了修正一个BUG,需要增加两个参数,结果加了以后发现编译不过,原因是JAVA只能允许255个参数,而那个方法原来就定义了254个参数,后来的方法是把要增加的两个方法丢到一个Collection。

呵呵,天下之大,无奇不有。

Jboss下查看数据库连接泄露的方法

发现连接池泄露后,使用JMX-Console,搜索服务CacheConnectionManager,调用

listInUseConnections

这样我们就可以得到当前使用的连接池的线程堆栈,很容易就可以知道哪个地方存在数据库连接泄露了。

JConsole

这个好像是JDK1.6里面新推出的,和JBoss的JMX-Console的功能类似,只是这个是GUI的,而且需要远程的服务器启动一些服务,在应用服务器的启动中修改以下配置(就是修改JAVA_OPTS):

-Djboss.platform.mbeanserver -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

SAXParseException: Document root element is missing

Google了下,发现很多人遇到这个问题,但是和我的都不太一样,我是启动Jboss里面运行的代码没有问题,但是写的单元测试的代码会遇到这个问题,后来想起来我们启动Jboss的时候自定义了XML的解析器,把运行单元测试的那个东东如法炮制,问题解决

The method getXxx() is undefined for the type Yyy

今天遇到这个问题都快崩溃了,那个方法明明定义了,在JSP中用反射拿到类声明的全部方法并打印出来都可以看到的,但是修改回来后就是编译不过。
Google了下,也是很多人遇到,但是没有人解决,有人说是tomcat的问题,不太相信。
突然想到我的工程是hot deploy的,那个class有两份,一份新的一份旧的,jboss的tomcat在编译那个JSP时用的是旧的类,运行时用的是我Hot deploy的新的类定义。
重新编译发布整个工程,问题解决。

List的问题

今天遇到一个奇怪的问题,从一个List取一个SubList,然后对从SubList删除某些元素,然后再从List里面删除SubList里面剩余的元素,但是所有的删除都没有找到匹配的东西,并没有删除成功,但是原来的List出问题了,它的内容出现不规则的变化,有时候变成0,但是有时候不重新取数据的话还能恢复成原来的状态。
呵呵,怀疑这个是JDK的bug,但是没有时间验证了,做个记号。
现在的解决方法是拿到subList后再创建一个新的List,把SubList的内容加进去,这样就没有问题了。
从JDK的API看,从List得到SubList只是得到了原来的List的一个view,所以进行这些操作的时候原来的List和View之间在进行处理的时候可能有问题。

控制Message Driven Bean的实例数

EJB2和EJB3的不一样,而且好像和容器提供商也有关,这里给出的是适用于EJB3和JBoss4的:
@MessageDriven(activationConfig = {
        @ActivationConfigProperty(
                propertyName = "destinationType",
                propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(
                propertyName = "destination",
                propertyValue = "queue/email"),
        @ActivationConfigProperty(
                propertyName = "maxSession",
                propertyValue = "1")})

关键的就是那个maxSession,它控制实例的最大个数。

真的是NoClassDefFoundError吗

前两天碰到一个奇怪的问题,异常的信息就是NoClassDefFoundError,但是需要加载的类肯定是可以找得到的,最后问题的根源在于内存不足,由于产品需要加载的类非常的多,到现在我们的maxPermSize已经需要设置为128m了,而那个错误就是由于内存不足,类初始化的时候内存不足无法初始化成功导致出现NoClassDefFoundError,这个就让我联想到原来经常遇到的类实例初始化的异常,最终报的错也是NoClassDefFoundError,呵呵,所以,以后遇到这个异常要仔细看看后面的详细异常信息,如果是<clinit>抛出的,基本上就是初始化失败而不是真正的找不到类定义了。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑