建议不要用EJB来做查询,效率会很低,低的会让你无法想象:)
解决方案 »
- 想在网页中实现图片的拖拽和整合用javascript可以实现么?
- web service开发,用xfire好还是用axis好?
- ClassNotFoundException该怎么解决?
- javamail的问题:不能用163的邮箱发送,大家帮我啊
- 为什么运行时老是出现Tomcat提示页面
- 新手,求助!~~!
- struts+spring+hibernate的问题,请高手指点。急急。。。。。。。。。。。。
- 招聘java人员
- 同样BMP,为何一台老出错??
- 怎么用JDOM输出<?xml:stylesheet ....?>这样的处理指令?
- 怎样在struts action中获得servletConfig?
- web应用中的 classes 目录有什么特殊处理?
我提出这个想法,就在要解决这种问题!
用hibernate可以
EntityBean生命周期由容器管理。多个服务可能共享同一缓存。感觉有点像dll,一次调入内存,引用计数,无引用释放,属于常驻内存的那种。适用于数据量大、并发任务重的情况。如果采用EntityBean,需要设置EntityBean Cache。个人提倡dao方式,原因是EntityBean修改时繁琐,各家供应商支持不一,特别是对EJB QL的支持。在应用发布上是很大的阻碍。
你们讨论的问题与我提出的问题有所差别!我的意思是这样的:不论你用何种技术,通过数据库查询后,返回的都是VO List,试想,如果要查询的数据表有百万条数据,返回的数据可能有几十万条,而此时同时查询的人数多达几百人,大家想想,如果一次性返回到VO List中,你的服务器开销得起吗???请仔细看看我提的那种想法,!!我是要迭代返回的100万条数据,但又不能一次性返回到LIST,所以提出,分段式提取数据的框架,这种分段式提取要求不能影响视图层的代码!!也就是说:以前我们都是直接将VO List返回到了视图层,但现在不能这样做了,我们在视图层提取结果VO时,要通过一个HANDLER接口的getResult(i)的方式提取,视图层并不知道他要的数据是否已经被提取到内存,所有的控制由后端框架来控制!
请将你的方法讲讲?
你提出的框架层次挺不错的,但我们现在要解决的不是框架分层,而是对数据进行分段式读取的问题!
举例说明:
在CSDN上,每类文档库如果有3000份,此时,如果我们全部存放到VO list中,如果有几十个类别,同时很多人查询,服务器的负荷就会相当大!
现在我们就要试着去解决这个问题,不能一次性将所有的数据都缓存到内存中,而是每只取某一段数据(比如每次最多取300条),当用户浏览的文章不在这300条内时,handler会自动再次查询数据库,取得下一段数据!! 这个过程是视图层不知道的,视图层只管自己伸手get(i)就行了!!我们现在就是探讨这一层如何来实现,而不是抽象的分层或模式的问题!
方法一: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的苦海中,简直就是折磨人啊。
http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.2961847
分页处理:1)利用参数,进行筛选 2)利用数据库特性对SQL的支持 提取部分数据
解决方案:可考虑每次取2-3页的数据放在ram中,在此范围不再取,不在此范围去取各位怎么看?
一下子把几十万条记录堆到视图方是没意义的设计,客户端需要一下子得到这么多数据吗?
这个类似于分页
你可以在SESSION BEAN里面实现自己的分页
也可以直接用SQL语句来分页(ORACLE和MYSQL的分页查询还是很好用的)
如果是用oracle的话,恰当的查询语句的设计能让你的查询效率高很多倍(基于它的高速缓存池的原理,事实上也是一个cache).
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;
}
gks_cn(981530)然后把结果变为list,这样传到客户端的时候是list,这样你就可以处理了,gks_cn(981530)用的就是oracle本身自带的一个分页查询,其实hiberater用的分页查询也是这个。
用sql语句显示多少,取出多少。
有谁见过几十万条数据在一页显示的?!