|
问题描述:
1、dubbo在进行hibernate级联操作时会报session已关闭的错误。这错误平时开启opensessioninviewfilter解决。 在通过dubbo调用接口时,dubbo只会走自己的一套filter,需要实现com.alibaba.dubbo.rpc.Filter。普通filter不生效。 所以我想到的办法是把spring包里的opensessioninviewfilter拿出来改一改。 但是同样遇到问题: 2、javax.servlet.Filter需要实现的是 public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException; 而com.alibaba.dubbo.rpc.Filter public Result invoke(Invoker<?> invoker, Invocation invocation)throws RpcException 我不知道在实现dubbo的filter时再哪里能拿到 HttpServletRequest ! 百度, @Context和RpcContext.getContext().getRequest() (出自《在Dubbo中开发REST风格的远程调用(RESTful Remoting)》http://dangdangdotcom.github.io/dubbox/rest.html ) 感觉并不是正式版的dubbo.(是否是dubbox?), 无法实现(注解注入为null,第二个我去git上看了没有这个方法)! 上面两个问题解决哪个都可以。 甚至可以和我说一说hibernate级联操作特别坑的地方,然后说服我让我不使用级联。 如果觉得我这个思路哪里有问题欢迎指出! 麻烦各位大牛了! |
|
|
|
当然麻烦不要说什么把lazy改成true就行了。。。
那样我宁可不用级联,然后按使用时需求开两个接口,一个查单表一个查本表加全部的关联。 当然如果实在没人回复我只能这么做了。 |
|
|
主要有四种办法吧
1.lazy=ture 2.OpenSessionInViewFilter 3.抓取策略join 4.在session没有关闭时hibernate.initialize |
|
|
首先感谢回复,但是请再耐心一点看问题,谢谢! 1.这样做在我只需要查单表时,会把所有关联的结果都查到。 2.我也想知道这个filter怎么写。这就是我的第二个问题啊。 3.理由同1 4.第四个我不是很清楚,如果您觉得可以解决我的问题,请详细一点讲。 最后再次感谢回复! |
|
|
自己捞一波~
有没有用过dubbo的大牛~ |
|
|
自己捞一波~
有没有用过dubbo的大牛~ |
|
|
在事务里边,把该获取到的东西,都先获取到呢。
|
|
|
mark。。。。
|
|
|
我的疑问 dubbo 会管理 或者影响服务端的 hibernate 或者mybatis吗?
|
|
|
因为我这里使用的是懒加载的级联查询。 我们先回忆一下正常操作。 1.执行完查询时,这时只查到主表全部信息,没有关联表的信息。 2.这时候在代码中使用到了关联表的集合,无论是后台或者jsp中,此时会一条一条的发出sql,来查询根据主表外键查询关联表。 这种功能正常情况下是可以使用的。“可以在查询之后,在根据具体使用情况再进行查询关联表。”但是这依赖于spring的opensessioninviewfilter。 但是在dubbo下我不知道怎样才能达到这种效果。 |
|
|
您的意思是在session里面吧?就是返回主表的时候。 大概只能这么用了吧。但是感觉hibernate的功能被阉割了一些。会多查询很多“不一定”用得到的数据。之前是在需要的时候才执行查询。 |
|
|
请看一下我最上面的问题描述前两句!dubbo不会管hibernate具体操作。但是两个在一起使用时会有问题。(我觉得很大可能是我不会用。。) |
|
|
楼主 请问你现在解决这个问题了吗?
|
|
|
首先session在框架层你是不便去控制的,一个框架为了实现所谓的懒加载而超时的占用session是个非常sb的行为,为什么?因为设计者只考虑到自己懒加载的方便而没从大局去考虑session的占用及释放,你以为数据分批加载看上去是减少了数据库负载,但是实际呢?你能控制懒加载的这段时间没有其他耗时的事务在抢夺资源?互联网思维是快准狠的解决数据交互,你却使用着自以为高大上的臃肿框架。一句话这种集群互联网应用你就要抛弃这些陈旧臃肿的框架,对说的就是hibernate。
|
|
|
楼主解决了吗?
我的情况和你一样:org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed |
|
|
假设有两个系统(人力资源系统和OA系统),两个系统之间需要做接口,如人力资源系统调用OA系统的接口推送人员信息。
财务系统发布了一个服务供人力系统调用。人力系统应只关注这个接口的协议、如何调用,而不关注这个接口是如何实现的。具体这个接口如何实现是财务系统的事情,财务系统可以用Hibernate实现,也可以用MyBatis实现,甚至用的不是Java语言,这都和人力系统没有关系。 财务系统只需要将服务注册到DUBBO的服务注册中心(如ZooKeeper)上,而人力系统只需要知道服务注册中心的存在。 两个系统甚至彼此都不知道对方的存在,他们只知道有DUBBO这样一个东西。 在这样的设想下,财务系统没有理由要求人力系统也使用Hibernate。因此财务系统的服务被调用一次后,再要求人力系统使用Hibernate的懒加载再调用一次是不合适的。 如果只要求一次调用,那么一次把所有的数据全部返回;如果可以两次调用,那么第二次调用依然通过DUBBO,而不是Hibernate的懒加载。 当然,有人说财务系统提供接口给人力调用,完全可以要求人力资源系统按照指定的方式开发(如使用Hibernate,使用Java),但我们用DUBBO的目的是希望对服务进行治理,降低系统间的耦合度。两个系统之间应尽可能的透明。彼此不知道对方的存在是最好的。 因此,建议楼主一次返回需要的数据,或者多次返回数据但每次都通过DUBBO的方式。 |
|
|
另外,再补充一下,DUBBO的消费者和生产者往往是跨网络、跨服务器、跨进程的,是远程过程调用(RPC)。(当然,你在一个Tomcat里跑也可以)。
在两台服务器上,消费者使用Hibernate调用生产者的服务,涉及到网络通信、序列化和反序列化的问题,而我们使用Hibernate的懒加载是在同一个进程内的。 |
|
|
楼主 请问你现在解决这个问题了吗?
|
|
|
learning~
|
|
|
ennnnnnn
|
|
|
6666666666666666666666
|
|
|
learning~
|
|
|
水一水066666
|
|
learning~
|
|
同问?楼主解决了吗~~~
|
|
learning~
|
|
这种功能正常情况下是可以使用的。“可以在查询之后,在根据具体使用情况再进行查询关联表。”但是这依赖于spring的opensessioninviewfilter。
DUBBO的消费者和生产者往往是跨网络、跨服务器、跨进程的,是远程过程调用(RPC)。(当然,你在一个Tomcat里跑也可以)。医用固定带厂家 |
|
顶顶顶顶顶 说的不错 谢谢分享 感谢
|
|
mark。。。。
|
|
牛啊,厉害!
|
|
mark一下先。。。
|
|
learning~
|
|
|
|
learning~
|
|
mark。。。。
|
|
learning~
|
|
主要有四种办法吧
1.lazy=ture 2.OpenSessionInViewFilter 3.抓取策略join 4.在session没有关闭时hibernate.initialize |
|
![]() |
|
learning~
|
|
learning~
|
|
learning~
|
|
learning~
|
|
learning~
|
|
楼主 请问你现在解决这个问题了吗?
|
|
|
|
learning~
|
|
你使用了 rest风格的 dubbo ? 依据我所查件的资料,只有 dubbox才支持rest , dubbo是不支持rest的;
dubbox就是 当当网维护的那个版本,你从这里找资料吧。 |
|
怎么还不行呢
|
|
|
|
|
|
|