一个Request里面一般会多次访问数据库,还是先取出一大堆数据,然后自己进行相关的计算?

问题描述

一个Request里面一般会多次访问数据库吗?如果业务稍微复杂一点的话,比如,要取的数据很多。现在有一下场景,根据一个accountId,会查询出很多的clientId,然后对每个clientId进行统计(比如sum,avg。。。group by)。这样就导致我一条SQL 语句不满足需求;我现在是这样做的,先根据accountId查出需要的clientIds,然后循环每个clientid,对每一个clientid,再去数据库查询统计相关的数据。我还有第二种想法,先把所有的数据都取出来,然后自己再进行一些统计,统计这一块用java代码去实现。不知道一般做法是怎么样的?欢迎指教。 问题补充:SELECT A.* FROM (SELECT F84PLANID, F81COLDAT, SUM(F84DEALAMT) R1FROM D03PRO/F81, D03PRO/F84WHERE F81COLLID = F84COLLID AND F81MCID = '000036' AND F84MCID = '000036' AND F84PLANID IN ('0000022289', '0000025222', '0000025554', '0000022346') AND F84CANCYN = 'N'GROUP BY F81COLLID, F81COLDAT, F84PLANIDORDER BY F84PLANID, F81COLDAT DESC) A , (SELECT B.F84PLANID, MAX(B.F81COLDAT) R2 FROM (SELECT F84PLANID, F81COLDAT, SUM(F84DEALAMT) R1FROM D03PRO/F81, D03PRO/F84WHERE F81COLLID = F84COLLID AND F81MCID = '000036' AND F84MCID = '000036' AND F84PLANID IN ('0000022289', '0000025222', '0000025554', '0000022346') AND F84CANCYN = 'N'GROUP BY F81COLLID, F81COLDAT,F84PLANIDORDER BY F84PLANID, F81COLDAT DESC ) BGROUP BY B.F84PLANID ) CWHERE A.F84PLANID = C.F84PLANID AND A.F81COLDAT = C.R2ORDER BY A.F84PLANID这条SQL的效率如何。。。总感觉挺怪的。。。在DB2环境下,执行下要2秒。。。

解决方案

你可以用sql子查询来完成,应该可以满足你说的需求。如果通过sql子查询无法满足的话,可以分多次去访问数据库,没有问题的。最好不要自己用java代码去实现,这样不但效率底,而且还增加了代码的复杂度。最好的原则是:1.首先考虑用一个sql去实现,除非因为复杂的sql文,导致执行效率低。2.如果一个sql无法实现,或者执行效率太低,可以写成多个sql文,分多次去访问数据库3.当然如果用java实现比较简单的话,也可以考虑,因为这样可以降低数据库的负载。
解决方案二:
我觉得像这种取大量数据的统计数据比较好的办法就是后台定时先将需求的数据统计好放到静态表里,前台直接取这个表里的数据就行了。不过牺牲了实时性!如果数据量不是很大,实时统计数据的时间能在接受范围内可考虑写存储过程直接调用; 你说的两种做法如果数据量很小的情况下都是可选的,但是数据量大就不要考虑了!
解决方案三:
中庸一下:多次访问+分页查询(一次可以得到多条数据):优点:减少了数据库访问次数,又得一次得到多条数据
解决方案四:
sum,avg。。。group by,可以做成一个一个的视图,然后用sql直接全部调用,一次性去取出来,但是这样的话,数据库的压力会大一点.
解决方案五:
从数据库里读数据,如果可以的话,尽可能一次就把数据读出来。这是一种好习惯。不管有没有连接池的存在。
解决方案六:
因为有数据库连接池的存在,多次访问开销没有想想的那么大对于你的第一想法,目前来看是可以根据一条 SQL 统计出的,囧...或者可以在数据库里建立一个视图,简化 SQL .第二个想法,不推荐,原因1: 那这样还不如直接在内存里缓存了,何必一次次的读.原因2: 基于原因1,太吃内存....而且又要维护内存里的数据和数据库中的数据,代码复杂了.
解决方案七:
(1)如果Request频率不高的话可以考虑使用sql或者java代码去实时统计;(2)但如果访问频率较高的话,最好就采用后台服务进行单独统计后写入静态表,访问时直接读取静态表(@zw的回答)

时间: 2024-09-21 22:53:34

一个Request里面一般会多次访问数据库,还是先取出一大堆数据,然后自己进行相关的计算?的相关文章

request参数-jsonp跨域访问Struts2后台,获取到的数据没有用callback参数包裹是怎么回事啊?

问题描述 jsonp跨域访问Struts2后台,获取到的数据没有用callback参数包裹是怎么回事啊? 前端代码: $.ajax({ url:'http://localhost:8080/OA/json/json.action?orgid=aaa&code=00002', dataType:'jsonp', type:"GET", dataFilter:function(json,me){ alert("dataFiter:"+json); }, cont

另类:ASP不用DSN访问数据库

访问|数据|数据库 一个DSN连接需要服务器的系统管理员在服务器上用控制面板中的ODBC工具设置一个DSN,或者使用一个第三方的服务器组件,让你的ASP脚本在需要时通过修改注册表建立DSN. 一个DSN连接通常需要的参数有:DSN名,用户名,口令,例如我们用用户名"student",口令"magic",通过DSN"student"建立连接: 1. set conntemp=server.createobject("adodb.conne

jsp基础语法 六 jsp+jdbc访问数据库

学习过了jsp基础语法以及HTML和javascript的用法之后,jsp+jdbc连接数据库开发动态WEB网页就可以实现了. 对于学过java SE的同学来说,数据库的操作并不陌生,如果有忘记的或者不会的可以到http://zhaoyuqiang.blog.51cto.com/6328846/1127658  学习. jsp中的数据库连接又是如何呢? 怎样才能利用上我们学过的HTML和javascript的知识呢? 这就是我们这一篇文章的学习内容----jsp+jdbc访问数据库. 我们就以一

ado.net-求一个无参数 调用存储过程的方法,我调用的是列转行的存储过程 但是访问数据库的方法不知道怎么写

问题描述 求一个无参数 调用存储过程的方法,我调用的是列转行的存储过程 但是访问数据库的方法不知道怎么写 访问数据不知道写 存储过程已经写好 解决方案 prepareCall()方法调用存储过程 解决方案二: use 数据库名称 这不是方法 解决方案三: use 数据库名称 用这个语句就能指向数据库 解决方案四: exec 存储过程名称

SQL数据库上面显示一个绿色向上的小箭头是怎么回事?也无法访问数据库了,有什么办法吗?

问题描述 SQL数据库上面显示一个绿色向上的小箭头是怎么回事?也无法访问数据库了,有什么办法吗? 解决方案 sql 有一个browser服务 这个是1434端口的 解决方案二: 你那里是sqlserver客户端吗 你看看sqlservernetmanager里的网络配置1433开了吗 解决方案三: 数据库服务是否启动,端口是否在侦听,防火墙是否拦截请求

linq-asp.net中如何通过LINQ访问数据库某字段相应元组的的另一个字段

问题描述 asp.net中如何通过LINQ访问数据库某字段相应元组的的另一个字段 asp.net中如何通过LINQ访问数据库某字段相应元组的的另一个字段,比如有一个数据库,里面有学号,姓名,还有密码. 如果我知道一个学号,但是我想知道这个学号对应的姓名时,我应该怎么做?还有如何把这个匹配的姓名赋值到一个Lable上.求大神指点.做作业用的 解决方案 (1) var query = db.table.First(x => x.学号 == 1).姓名; (2) label1.Text = query

实现一个移动端访问数据库的webservice接口的流程

问题描述 实现一个移动端访问数据库的webservice接口的流程,过程中要用到哪些东东,最好有实例... 解决方案 解决方案二:用C#这个语言解决方案三:提供一个例子:Android客户端调用C#WebService.http://blog.csdn.net/chinacsharper/article/details/38386779 解决方案四:没移动端部分,只有服务端部分解决方案五:这不就是webservice么..VS新建网站添加一个web服务写方法就搞定了啊..至于客户端(调用者)是c

求助 需要写一个WCF的服务接口用来访问数据库,报文用XML的结果,哪位能给个例程或者提供个思路呢,不甚感激,我原来的应该程序时用delphi写的。

问题描述 求助需要写一个WCF的服务接口用来访问数据库,报文用XML的结果,哪位能给个例程或者提供个思路呢,不甚感激,我原来的应该程序时用delphi写的,现在需要写一个接口给第三方查询数据库用,请各位大虾帮帮忙 解决方案 解决方案二:在线等待中,谢谢各位解决方案三:请问你做什么系统的?我做税控需要这东东,正想研究wcf呢!

java web工程中一个dao只有一个实例访问数据库对性能的影响

问题描述 就是同一个dao实现只会实例化一个,每次访问数据库的时候都是用的同一个实例,这样对性能会不会有什么影响,不考虑线程安全. 解决方案 解决方案二:每一次访问都new了一个新的dao,对性能会不会有影响解决方案三:dao一般不会有带状态的成员变量不会引发线程安全问题.解决方案四:该回复于2010-05-15 14:14:18被版主删除