技术开发 频道

YL电厂WAS系统错误诊断日志分析

 错误:不能绑定JNDI

    解决办法:

    可以通过log看到应用中使用了hibernate数据持久化技术、结合Startserver.log、Stopserver.log、Systemerr.log、Systemout.log此错误是配置文件的问题,如果hibernate配置文件有session_factory_name这个变量,<session-factory name="foo"> 会试图将一个SessionFactory实例以foo为名bind到jndi上,而有的application container不支持jndi绑定。把这个变量去掉即可。把引用代码也要修改:

    大致改成这样:

    SessionFactory sf = new Configuration().configure()

    .buildSessionFactory();

    Session session = sf.openSession();

    Transaction tx = session.beginTransaction();

    WAS确实可以不需要自己写程序来进行绑定,也可以由Hibernate自己在运行期进行动态绑定。但是如果使用Hibernate自己的运行期绑定的话,有一个悖论,就是只有在Hibernate被初次调用进行初始化的时候,才会将SessionFactory的实例绑定到JNDI上去,那么意味着,在首次调用Hibernate之前,JNDI上是没有SessionFactory实例的,所以你必须在所有的其它程序通过JNDI获得SessionFactory实例之前,运行某个程序对Hibernate进行初始化,把SessionFactory实例绑定到JNDI上。如果是纯Servlet/JSP应用的话,可以配置一个load-up=1的servlet进行Hibernate的初始化,如果是混合EJB,Servlet/JSP的应用,就无法保证在程序被调用前对Hibernate进行初始化,因此对于WebSphere来说,最保险的解决办法就是建立一个StartUp类,确保WAS一启动,就对Hibernate进行初始化。

    错误:java:env命名异常,报错误TRAS0014Ijava.lang.ClassNotFoundException: cn.com.info21.power.runlog.action.TestAction

    解决办法:

    查看class情况,该错误可能由以上错误引起。

    分析日志system.out_07.04.19_09.51.59.log

    [07-4-19 9:29:49:422 CST]

    7ac9d17d Helpers       W NMSV0610I:

    从 javax.naming.Context 实现中抛出 NamingException。详细信息如下:

    上下文实现:com.ibm.ws.naming.java.javaURLContext

    上下文方法:createSubcontext(String)

    上下文名称:java:comp/env

    目标名称:hibernate

    其它数据:

    异常堆栈跟踪:javax.naming.OperationNotSupportedException: The operation on the context "java:env" cannot be completed

    错误NMSV0610I

    依然是env的原因,如果报该错误号,但上下文com.ibm.ws.naming.jndicos.CNContextImpl 的话,那么需要注意J2C问题了。一般这样的问题是应用是EJB 1.1规范进行开发的,而部署到WAS5上面的时候,连接遵从J2C的数据源就会出现这样的错误,解决办法看我以前写的一个EJB移植问题文档。

    [07-4-18 9:19:57:031 CST] 1f7a20d0 SystemErr     R java.net.SocketException: Connection reset by peer: socket closed

    [07-4-19 9:32:23:328 CST] 7e02d14f WebGroup      E SRVE0026E: [Servlet 错误]-[Connection reset by peer: socket write error]:java.net.SocketException: Connection reset by peer: socket write error

    错误:SRVE0026E,servlet错误,Socket写入错误

    类似这种错误,我以前解决了一个更加怪异的。WAS5+SQLSERVER2000SP4采用ODBC数据源连接时,不出现这种错误,而采用JDBC则出现这种错误.解决办法:不使用SP4,使用SQL SERVER SP3A即可解决。

    SRVE0026E错误,请升级WAS补丁到5.1即可解决数据库访问并发释放连接、socket写入错误等问题

    错误:在本地事务边界中使用资源连接分享,报错误J2CA0086W

    解决办法:

    系统报告“J2CA0086W”是为了警告用户,应用程序正在一个本地交易(而不是全局交易)中使用共享连结,例如按照如下的方式使用了数据库的连接:

    get con1; //建立一个新的连接con1

    use con1; //使用con1

    get con2; // 一个新的连接con2被建立。

    // 再此处我们不能使用con1,因为它还没有被关闭

    use con2;

    close con1;

    close con2;

    解决这个问题的方法是打补丁PQ80044,打完这个补丁以后,“J2CA0086W”的警告将不会对于每一次连接都在日志中产生,而是对于每一个连接池产生一次。这个补丁已经被添加到WAS fix 5.0.2.3中,所以,也可以通过打补丁包WAS fix 5.0.2.3解决该问题。

    注释:我的思路:

    1、 由于配置的是Oracle JDBC Thin Driver,所以只能开一个连接,启动一个事务,关闭事务.但是由于应用中统计等功能比较多,出现打开一个连接,启动一个事务,又打开一个连接(报错),关闭事务的情况,所以想把JDBC改成Oracle JDBC Thin Driver (XA)可以实现打开一个连接,启动事务,又打开一个连接,启动事务,关闭事务,关闭事务的机制.

    2、 WAS5默认是2步事务提交、也就是在insert以后需要COMMIT才能提交

    3、 还有就是在组装时,注意下要配置资源引用(名称jdbc/cceaoa3ds类型javax.sql.DataSource认证container,IBM扩展中的隔离级别:可提交事务读).Oracle JDBC Thin Driver (XA) 是用作分布式事务的,对于这个CASE,由于都部署在一台机器上,用Oracle JDBC Thin Driver 即可

    4、 websphere 5.x 对事物管理有个 bug,如果用 struts 需要在 action 与 jsp 之间 close transaction.
 

0
相关文章