`

解决dubbo中hessian序列化时Hibernate的延迟加载,以及Set,Map,List集合的解决方案

 
阅读更多
一、问题:
hibernate的延迟加载,导致序列化的时候会抛出Hibernate的LazyInitializationException.
还有就是hibernate的Map、List等会被转换为PersistentCollection对象,一般序列化框架没有针对此类的序列化方案。

二、主要应用场景
1、hibernate对象在缓存的时候,进行序列化操作
2、hibernate对象在使用hessian的RPC操作的时候进行序列化。
3、hibernate对象在进行json对象转换的时候。

三、一班的解决方案
使用DTO/VO对象对hibernate对象进行转换,但是缺点也很明显,代码冗余非常大,DTO/VO对象泛滥。

三、现象以及二班的解决方法
1、对于场景1的解决方案(hibernate对象的缓存)
1)将需要延迟加载的对象,都改成非延迟加载。这个其实也很正常,既然需要缓存对象,又何必延迟加载呢?所以这种方案无可厚非。

2、对于场景2的解决方案(RPC的序列化)
RPC的序列化跟转换成json有个最大的不同点,就是此序列化不会调用get方法获取值,就是IO操作,所以3的方案不可用。

本人是在dubbo中用hessian进行序列化的时候碰到的问题,所以就针对此框架来说吧。
其实在上面的问题中已经描述,就是PersistentCollection对象无法识别,那么就增加对此序列化的方法呗。

public class HibernateSerializerFactory extends SerializerFactory {

    private HibernateListSerializer listSerializer = new HibernateListSerializer();
    private HibernateMapSerializer mapSerializer = new HibernateMapSerializer();
    private HibernateBeanSerializer hibernateBeanSerializer = new HibernateBeanSerializer();

    @SuppressWarnings("rawtypes")
    public Serializer getSerializer(Class cl) throws HessianProtocolException {
        if (PersistentMap.class.isAssignableFrom(cl)) {
            return mapSerializer;
        } else if (AbstractPersistentCollection.class.isAssignableFrom(cl)) {
            return listSerializer;
        } else if (cl.getSimpleName().contains("_$$_javassist_")) {
            return hibernateBeanSerializer;
        }
        return super.getSerializer(cl);
    }

    private static class HibernateBeanSerializer implements Serializer {
        @Override
        public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
            boolean init = Hibernate.isInitialized(obj);

            out.writeObject(init ? obj : null);
            out.flush();
            return;
        }
    }

    private static class HibernateListSerializer implements Serializer {
        private CollectionSerializer delegate = new CollectionSerializer();

        @SuppressWarnings({"unchecked", "rawtypes"})
        public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
            if (Hibernate.isInitialized(obj)) {
                delegate.writeObject(new ArrayList((Collection) obj), out);
            } else {
                delegate.writeObject(new ArrayList(), out);
            }
        }

    }

    private static class HibernateMapSerializer implements Serializer {
        private MapSerializer delegate = new MapSerializer();

        @SuppressWarnings({"unchecked", "rawtypes"})
        public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
            if (Hibernate.isInitialized(obj)) {
                delegate.writeObject(new HashMap((Map) obj), out);
            } else {
                delegate.writeObject(new HashMap(), out);
            }
        }

    }
}


dubbo中通过添加配置文件,可以增加自己的序列化工厂。






3、对于场景3的现象与方案(hibernate进行json对象转换)
1) Hibernate碰到延迟加载的属性访问时如果session被关闭则抛出LazyInitializationException
2) Hibernate中的one-to-many等关联关系在序列化时如果没有控制,则将整个 数据库都有可能被全部序列化
3) 过多的使用DTO/ValueObject解决这个问题。

解决办法:

1、可以使用阿里巴巴的fastjson,对这种一对多或多对一的对象序列化做到了可控性,通过在序列化的时候添加SerializerFeature中的DisableCircularReferenceDetect即可。至于延迟加载可以用OpenSessionInView,这个也只局限于web才可以。

2、对Entity对象生成一个动态代理,拦截getXXXX()方法,如果访问的是延迟加载的属性,则return null,而不抛出LazyInitializationException,递归生成属性的代理,只要碰到未延迟加载的属性,而序列化会自动停止.避免将整个Entity序 列化传播,导致可能序列化整个数据库的问题。

  • 大小: 6.3 KB
分享到:
评论
2 楼 wzalong 2017-06-19  
MyTiny 写道
配置文件中该怎么写的?

hessian2=com.xxxx.xxxx.util.hessian.HibernateSerialization
1 楼 MyTiny 2017-06-07  
配置文件中该怎么写的?

相关推荐

    dubbo-hessian协议http请求demo(java)

    在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...

    dubbo-hessian-lite

    Dubbo 提供了多种序列化方式,其中之一就是 Hessian 序列化,而 hessian-lite 是 Dubbo 在编译时依赖的一个轻量级 Hessian 实现。在实际开发过程中,可能会遇到由于阿里的网络限制导致无法直接获取 hessian-lite 这...

    dubbo源码依赖hessian_lite.jar

    在Dubbo中,Hessian Lite被用作服务调用的序列化/反序列化工具,使得服务间通信更加高效和便捷。 描述中提到的 "可以使用mvn install命令将jar包安装到本地的maven仓库" 是一个常见的Maven操作。Maven是一个项目...

    DuBBo(rmi+Hessian).zip

    在Dubbo中,Hessian协议同样可以被用于服务的远程调用,它提供了比RMI更快的序列化和反序列化速度,特别适合于需要高效率通信的场景。 要使用Dubbo与RMI或Hessian集成,我们需要进行以下步骤: 1. **配置服务提供...

    dubbo-hessian-lite:适用于Apache Dubbo的Hessian Lite

    Hessian Lite(Apache Dubbo专用版) Hessian-lite最初是的Apache dubbo嵌入版本。 然后,此模块与Dubbo分离。 所有分支:2.5.x,2.6.x(自2.6.3起)和2.7.x都依赖于它,请查看详细信息: 现在,我们正在尝试建立一...

    Dubbo + SpringMVC 4.3.1 + Hessian 注解方式Demo工程源码

    整合 Dubbo + SpringMvc 4.3.1 的服务器maven工程样例,使用注解方式定义服务及IOC装配,采用Hessian协议传输 三个工程,在 cnetAdmin 和 cnetBlu 中,要引用 cnetCommon 工程。

    dubbo注意的问题,注入问题,接口中的bo应该实现序列化,否则服务注册失败

    当服务接口中的BO(Business Object,业务对象)未实现序列化时,服务注册时可能会遇到问题,因为Dubbo在传输过程中通常需要将对象转换为字节流,这就涉及到了对象的序列化。 对象序列化是Java中一个重要的概念,它...

    Dubbo 序列化协议 5 连问,你接得住不.PDF

    默认就是⾛ dubbo 协议,单⼀⻓连接,进⾏的是 NIO 异步通信,基于 hessian 作为序列化协议。使⽤的场景是:传输数据量⼩ (每次请求在 100kb 以内),但是并发量很⾼。 为了要⽀持⾼并发场景,⼀般是服务提供者就⼏...

    34_dubbo都支持哪些通信协议以及序列化协议?.zip

    标题 "34_dubbo都支持哪些通信协议以及序列化协议?" 暗示了我们即将探讨的是关于Dubbo框架在网络通信和数据序列化方面的内容。Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它为分布式应用提供了...

    Dubbo序列化协议5连问,你接得住不?.docx

    在Dubbo中,序列化协议是实现RPC通信的关键部分,因为它涉及到数据的转换和网络传输。 1. **Dubbo支持的通信协议**: - **Dubbo协议**:默认协议,采用单个长连接和NIO异步通信,基于Hessian进行序列化。适用于大...

    基于dubbo和hibernate的例子

    在IT行业中,分布式服务框架Dubbo与持久层框架Hibernate是两个非常重要的技术组件。本示例结合了两者,提供了一个完整的分层架构,用于展示如何在实际开发中使用它们。Dubbo作为一个高性能、轻量级的RPC(远程过程...

    dubbo-dubbo-2.5.3(包含依赖hessian-lite、opensesame)

    虽然阿里已经给我们打包好了核心框架的jar包,但在实际开发过程中,核心框架、管理控制台、简易监控中心、简易注册中心可能我们都需要用到,而且业务需求可能要修改dubbo源码,再次打包。基于以上原因我们需要构建...

    dubbo-exp:Dubbo反序列化一键快速攻击测试工具,支持dubbo协议和http协议,支持hessian反序列化和java原生反序列化

    工具仅用于安全研究以及内部自查,禁止使用工具发起非法攻击,造成的后果使用者负责Dubbo反序列化测试工具使用帮助usage: java -jar exp.jar [OPTION]-h --help 帮助信息-l --list 输出所有gadget信息-g --gadget ...

    dubbo admin dubbo可视化工具

    dubbo可视化工具

    系统稳定性——Dubbo 常见错误及解决方法1

    总结,Dubbo的稳定运行需要关注服务发布、注册中心状态、网络环境、线程池配置、序列化过程以及启动配置等多个方面。通过细致的排查和优化,可以有效地提高系统的稳定性和可靠性。在面对问题时,开发者应具备清晰的...

    dubbo配置文件报红叉错误解决方案-dubbo.xsd

    总之,解决`dubbo.xsd`报红叉的问题需要从多个方面进行排查,包括检查XML语法、确认xsd引用、匹配版本、修正IDE配置、处理编码问题以及解决网络问题。通过以上步骤,一般能够成功消除红叉错误,恢复正常的工作流程。

    nodejs使用原生的dubbo协议打通了dubbo的rpc方法调用.

    描述进一步提到,“nodejs 使用原生的 dubbo (dubbo head hessian body) 协议”,这表明在Node.js中,开发者不仅实现了Dubbo的协议头(head),还处理了Hessian二进制序列化协议作为消息体(body)。Hessian是一种...

    dubbo最新全面深度解读

    序列化是远程调用中必不可少的一环,Dubbo支持多种序列化方式,如Java自带的序列化、Hessian2、FastJson等。选择合适的序列化方式可以影响到系统的性能和兼容性。 8. **容错机制** Dubbo提供了多种容错策略,如...

Global site tag (gtag.js) - Google Analytics