传智播客学习之tomcat诡异异常

来源:互联网 发布:cnc编程工资高吗 编辑:程序博客网 时间:2024/05/16 11:34

今天在运行tomcat时,程序报了一个超诡异异常,折腾了我近两个小时,气的半死,最后决定放弃,先看看视频吧,也许上天在眷顾我,在看张老师视频的时候,张老师居然分析了这个异常,兴奋之余,也和大家一起共享一下吧。

今天在写一个struts程序的时候,我的tomcat居然报了如下错误:

org.apache.catalina.session.StandardManager start

Exception loading sessions from persistent storage

java.io.WriteAbortedException:writing aborted;java.io,NotSerializableException

当看到第一行的时候,我就有点懵了,以为是tomcat崩溃了,所以赶紧将tomcat删除,重新解压了一份,可是错误并没有消失,然后我接着往下看,第二行,看到了session,有点崩溃,程序代码看了无数遍,感觉就是没问题,然后看到第三行说序列化异常,我就有些崩溃了,然后一遍遍测试程序,没有任何问题,看到序列化,又去看actionform,也是实现了序列化接口,折腾了近两个小时,最后由于没有任何头绪,决定暂时放弃,然后再接下来看张老师视频,居然发现视频讲解了这个异常,原来问题就出现在序列化这块,由于我的formbean中有一个对象属性,这个对象属性没有序列化而导致的异常,当我把这个对象的类也实现了序列化接口,问题迎刃而解。

原理分析:

Tomcat在内部实现的时候,会有一个机制,那就是当Tomcat服务器停止后,tomcat会将内存中的信息写到硬盘上,当我们重启服务器的时候,他会将硬盘上序列化文件重新读入内存中,以此来保证session的共享,在集群系统中经常要使用。而在此,我们实际就是将session中存储的一个个对象序列化到硬盘,但是对象中如果有对象属性,我们也将这个对象序列化到硬盘,tomcat序列化一般在work目录下。但是不是所有的对象都可以被序列化的,他必须实现Serializable接口,也就是序列化,然后java虚拟机在加载这个类的时候,对字节码会进行特殊处理,生成的二进制代码可以通过ObjectOutputStream.writeIbject(obj)方法写到硬盘上。而虽然我们FormBean实现了序列化接口,而对象属性对应得类没有实现序列化接口,不能被序列化,最后导致以上异常。

注:

1)如果是对象类型的属性,那么我们如何在页面上显示呢?

我们可以采用在设置name属性的时候对象.属性名显示

2)在struts1内部我们会先get属性得到一个对象,然后填充好,再调用set方法,所以对象属性一定先初始化。否则会出现问题,struts2 则不用,因为他直接在外面new一个新的对象,然后直接调用set方法填充。

3)Session共享

当我们在集群的时候,由于有负载均衡,我们这次访问和另一次请求可能分布在不同的服务器上,但是无论我们去访问哪一个服务器上,我们都希望一次回话信息能够跟踪,即回话跟踪,即session需要共享,这时我们需要序列化,所以session作用域中的也需要实现序列化接口

原创粉丝点击