建议不要用EJB来做查询,效率会很低,低的会让你无法想象:)

解决方案 »

  1.   

    to yeshucheng呵呵,你用的是EntityBean吧,我用的是stateless Session Bean,性能相当不错的,只是对查询结果生成后VO后放在内存里是个问题!!EJB本身的设计思想还是挺不错的!!,只是因为SUN 的EntityBean这样将所有查询到的数据都缓存到了内存中,才导致了内在out 的问题!!
    我提出这个想法,就在要解决这种问题!
      

  2.   

    我两种都有:),即使你用stateless Session Bean还是会存在问题:)
    用hibernate可以
      

  3.   

    个人认为,dao方式为服务开始时缓存,服务结束后回收。适用于数据量不大、并发任务不重的情况。
    EntityBean生命周期由容器管理。多个服务可能共享同一缓存。感觉有点像dll,一次调入内存,引用计数,无引用释放,属于常驻内存的那种。适用于数据量大、并发任务重的情况。如果采用EntityBean,需要设置EntityBean Cache。个人提倡dao方式,原因是EntityBean修改时繁琐,各家供应商支持不一,特别是对EJB QL的支持。在应用发布上是很大的阻碍。
      

  4.   

    同意楼上意见,用无状态的sessionBean完成业务,用dao完成查询,查询后数据再组织成list返回.
      

  5.   

    你们提的意见都不错,我说的要用EJB,但并没用说用ENTITY BEAN,持久层也是用DAO或都hibrinate!
    你们讨论的问题与我提出的问题有所差别!我的意思是这样的:不论你用何种技术,通过数据库查询后,返回的都是VO List,试想,如果要查询的数据表有百万条数据,返回的数据可能有几十万条,而此时同时查询的人数多达几百人,大家想想,如果一次性返回到VO List中,你的服务器开销得起吗???请仔细看看我提的那种想法,!!我是要迭代返回的100万条数据,但又不能一次性返回到LIST,所以提出,分段式提取数据的框架,这种分段式提取要求不能影响视图层的代码!!也就是说:以前我们都是直接将VO List返回到了视图层,但现在不能这样做了,我们在视图层提取结果VO时,要通过一个HANDLER接口的getResult(i)的方式提取,视图层并不知道他要的数据是否已经被提取到内存,所有的控制由后端框架来控制!
      

  6.   

    to tanghuan 代理?差不多,但好像没有太多必要吧!我们是否可是考虑将在HANDLER上层定义这些基础性代码??再由各具体的业务实现类去继承并重载部分方法??
    请将你的方法讲讲?
      

  7.   

    delegate-->facade-->sessionBean-->entityBean
      

  8.   

    to yeshucheng
    你提出的框架层次挺不错的,但我们现在要解决的不是框架分层,而是对数据进行分段式读取的问题!
    举例说明:
        在CSDN上,每类文档库如果有3000份,此时,如果我们全部存放到VO list中,如果有几十个类别,同时很多人查询,服务器的负荷就会相当大!
        现在我们就要试着去解决这个问题,不能一次性将所有的数据都缓存到内存中,而是每只取某一段数据(比如每次最多取300条),当用户浏览的文章不在这300条内时,handler会自动再次查询数据库,取得下一段数据!!   这个过程是视图层不知道的,视图层只管自己伸手get(i)就行了!!我们现在就是探讨这一层如何来实现,而不是抽象的分层或模式的问题!
      

  9.   

    解决方法:
    方法一:JDBC+SQL,利用数据库的SQL特性,如Oracle,可以直接从数据库返回你要的数据数量,如10条。
    方法二:CMP Entity Bean,思路是先从数据库查询出一个主键集合(Collection),这是一个大的集合,也有几十万个元素,不过因为集合元素只是主键字段,所以占用内存也不大。然后根据集合中的主键使用findByPrimaryKey()查询出指定数量的记录并建立VO List,这样就可以实现分页。在这种情况下应该利用应用服务器(如WebLogic)的一些特性,如事务结束后更新等功能。这样的话,第一次分页是两次查询数据库,以后的分页就可以一次查询数据库(利用以前的集合),性能肯定不会差。DAO其实就是一种设计模式,并不与具体的技术相关联,DAO可以通过JDBC+SQL,Entity Bean以及其他技术实现。Business delegate-->facade-->sessionBean-->DAO-->entityBean
    Business delegate-->facade-->MDB-->DAO-->entityBean
    这些都是很常用的设计模式和技术。
    实在很羡慕楼主,可以用到EJB,不像我这样每天都陷在JavaScript的苦海中,简直就是折磨人啊。
      

  10.   

    <--------------高手看过来! 能不能搞定这个?
    http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.2961847
      

  11.   

    http://www.oracle.com/technology/global/cn/sample_code/tech/java/sqlj_jdbc/files/oracle10g/index.html
      

  12.   

    架构:Business delegate-->facade-->sessionBean-->BMP-->DAO
    分页处理:1)利用参数,进行筛选 2)利用数据库特性对SQL的支持 提取部分数据
    解决方案:可考虑每次取2-3页的数据放在ram中,在此范围不再取,不在此范围去取各位怎么看?
      

  13.   

    同意 ouhua(要坚强,不要懦弱) 的方法, 我打算用
      

  14.   

    分开来提取嘛
    一下子把几十万条记录堆到视图方是没意义的设计,客户端需要一下子得到这么多数据吗?
    这个类似于分页
    你可以在SESSION BEAN里面实现自己的分页
    也可以直接用SQL语句来分页(ORACLE和MYSQL的分页查询还是很好用的)
      

  15.   

    这么大的数据量,肯定是要自己做cache的,和你用slsb,hibernate都没有关系,可能不一样的是hibernate给你做了cache,但是绕过hibernate的对数据库的操作对你的cache是一种灾难(2.1,3.0版没有没改进不得而知,我估计改进的可能性不大)。至于ejb,entitybean肯定是有pool的,但是做查询效率就太低了,sfsb的只会管理bean的状态,效率同样不高。至于slsb的状态管理,恕我见识浅薄,不知道。即使某个vendor提供了,也是不可靠的。当然自己做cache,内存的要求高不说,起码会考量你的算法。当然,万一不行你可以尝试着使用相关的开源。btw:
    如果是用oracle的话,恰当的查询语句的设计能让你的查询效率高很多倍(基于它的高速缓存池的原理,事实上也是一个cache).
      

  16.   

    jdbc+sql, 利用dao模式,返回查询的的vo list,当然查询返回的不是全部,可以利用sql来控制你所要返回的记录数,传入页码,返回要得到的记录,这样不用每次都查询,只有等到用户点击要查询的页码范围的时候才查询一次,而且查询的时候出来的结果也不大.
      

  17.   

    恰头去尾法来做。以下是oracle 的,如果是支持top的,可以直接替换
    public CachedRowSet getRecord(String sql, int curpage, int perpage) {
    CachedRowSet rs = null;
    DB mydb = new DB();
    try {
    int i = curPage - 1;
    String query = null;
    query =
    "SELECT * FROM     (     SELECT A.*, rownum r     FROM          ("
    + sql
    + ") A     WHERE rownum <= "
    + perpage * curpage
    + "     ) B WHERE r > "
    + perpage * (curpage - 1);
    System.out.println(query);
    rs = mydb.executeQuery(query);
    } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    return rs;
    }
      

  18.   

    其实就是分页查询的问题,不过楼主说到ejb,就带出一堆ejb的问题来。当然在ejb的处理方式上,楼主的说法我赞成,最终都是无状态sessionbean,调用dao或者hibernate.对分页的查询,我认为可能hibernate做的已经相当好了,他主要是三种,数据库支持分页就用数据库分页,jdbc支持游标定义就用jdbc分页,否则自己对resultset的next()来定位取数据。上面的方法,可能很多时候用的是第三种方法,这样的话就有数据量的问题,比如100万条记录一个表,查最后一页,可真要累死人了。我的看法是定位和查询的结合,比如针对这种大数据量的表,专门提供对数据索引的排序字段,比如有个order字段,记录了这条记录的位置,在分页的时候通过这个字段,直接找到开始查询的数据记录,在定位一个数据页的数据量,进行处理。
      

  19.   

    楼主,我不知道你和数据库如何联机的,我用的是ejb+jdbc,然后在处理的时候你可以模仿
    gks_cn(981530)然后把结果变为list,这样传到客户端的时候是list,这样你就可以处理了,gks_cn(981530)用的就是oracle本身自带的一个分页查询,其实hiberater用的分页查询也是这个。
      

  20.   

    怎么能把查询结果一下都显示出来呢,那分页还有什么用呢。
    用sql语句显示多少,取出多少。
    有谁见过几十万条数据在一页显示的?!