查看: 4994|回复: 11

jdbc连接oracle的优化问题!(在线等,急~~)

[复制链接]
论坛徽章:
0
发表于 2010-8-10 12:45 | 显示全部楼层 |阅读模式
我有这样几个问题:
用jdbc连接oracle数据库查询表carInfo,carInfo表里会有几亿条数据(注:此carInfo表还没有创建)。
问题一:我怎样设计carInfo表,才能有最大的性能并节省系统资源??我有一个思路:创建分区表,然后用索引方式查询。但我不知道效率怎么样.
问题二:用jdbc连接数据库时,有时候需要查询几千万条的数据,怎样优化jdbc。
问题三:jdbc连接是ResultSet的next()方法,原理是什么样的,ResultSet rs = stmt.executeQuery(“select * from carInfo“);是已经将表中的所有数据都读出来了,还是只是建立了一个连接,每次调用next()方法,就从数据库里取一条??(我不太清楚他的原理,望大虾们解答一下。)

问题四:我说说我要做的需求把,我要做一个车辆流量统计图,就是用户可以查询某个时间段内车辆的流量统计情况:(比如1年内12月的流量情况;一个月内30天的流量情况;一天内24小时的流量情况;一个小时内60分钟的流量情况等),所以说有可能要知道几年的车辆信息(也就有可能上亿条的数据量),在查询的时候我只要知道其中的数量就可以了,开始我想用count(*)查询的,但是问题是
比如我要查询一个小时时间段内的车的数量,那就是说我需要这一小时内每分钟的车辆过往数量,也就是说我得查询数据库60次count(*),这样的话就太费资源了吧。还有一中是select time from carInfo where time between time1 and time2,查询出时间段的数据,再在外面用for循环,摘取出每分钟的车辆数量,这样是不是也很慢,for循环上亿条数据那可不是一般的慢啊。


小弟现在脑袋一片糨糊,希望大虾们能有什么更好的思路告诉小弟一下,不胜感激~

比如:有没有方法用一条sql语句从数据库里查询出某一时间段的数量,并可以直接查询出这一时间段内,每分钟的数量~~

小弟也接触oracle没多久,问题是不是有点白痴,希望大家见谅~

private static Connection conn;
private static PreparedStatement stmt;
private static ResultSet rs;
//连接参数
private final static String className = "oracle.jdbc.driver.OracleDriver";
private final static String url1 = "jdbcracleci:@orcl";
private final static String userName = "cardb";
private final static String passWord = "123”;

下面是jdbc代码:
public List findAllCarCharts(TiaoJian tiao){
                List list = null;
                try {
                //打开数据库
                     Class.forName(className);
                Properties pro = new Properties();
                pro.put("user",userName);
                pro.put("password",passWord);
                pro.put("defaultRowPrefectch","30";
                pro.put("dufaultBatchValue","5";
                conn = DriverManager.getConnection(url1,pro);

                        String sql = "select PASS_TIME from car_charts where 1=1";
                        //sql条件
                        if(tiao.getTime1()!=null && tiao.getTime1()!="" && tiao.getTime2()!=null && tiao.getTime2()!=""{
                                sql += " and PASS_TIME between '"+tiao.getTime1()+"' and '"+tiao.getTime2()+"'";
                        }
                       
                        stmt = conn.prepareStatement(sql);
                        rs = stmt.executeQuery();
                       
                        list = new ArrayList();
                        CAR_CHARTS charts = new CAR_CHARTS();
                        while(rs.next()){
                                charts.setPASS_TIME(rs.getString("PASS_TIME");
                                list.add(charts);
                        }
                }catch (SQLException ex) {
                        ex.printStackTrace();
                } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                }finally{
                        closeOracle();
                }
                return list;
}
论坛徽章:
0
 楼主| 发表于 2010-8-10 15:17 | 显示全部楼层
没人搭理???

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
发表于 2010-8-10 15:42 | 显示全部楼层
既然用了 PreparedStatement ,你为什么还拼常量进去呢?

使用道具 举报

回复
求职 : 系统架构师
认证徽章
论坛徽章:
184
现任管理团队成员
日期:2011-05-07 01:45:082015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有车
日期:2015-02-03 15:49:36马上加薪
日期:2014-11-14 21:57:36itpub13周年纪念徽章
日期:2014-09-27 21:15:55马上有钱
日期:2014-06-16 15:55:42马上有房
日期:2014-06-16 15:55:42问答徽章
日期:2014-04-19 09:26:09马上有房
日期:2014-04-01 21:27:12
发表于 2010-8-10 15:47 | 显示全部楼层
注意程序优化

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-10 16:52 | 显示全部楼层
select count(*),substr(time,取到分钟) from carInfo where time between time1 and time2 group by substr(time,取到分钟)

如果是时间型:
SQL> select to_char(created,'YYYY-MM-DD:HH24:MI'),count(*)
  2  from test_object
  3  --where
  4   group by to_char(created,'YYYY-MM-DD:HH24:MI');

TO_CHAR(CREATED,   COUNT(*)
---------------- ----------
2010-04-14:16:48      15624
2010-05-27:15:52          4
2010-05-27:18:55          4
2010-06-28:14:43          4
2010-04-14:16:51       1196
2010-04-14:16:53        960
2010-04-14:16:55       1880
2010-04-14:16:56       1652
2010-05-17:16:35          8
2010-06-09:09:01         76
2010-04-14:16:47        720

TO_CHAR(CREATED,   COUNT(*)
---------------- ----------
2010-04-18:19:55          8
2010-04-27:09:03          4
2010-04-14:16:50       6900
2010-04-14:16:57         96
2010-04-14:16:54       2240
2010-05-27:18:46          4
2010-04-14:16:52       5688
2010-05-16:09:12          4
2010-06-30:09:00        236
2010-06-29:17:50          4
2010-04-14:16:49      15220

TO_CHAR(CREATED,   COUNT(*)
---------------- ----------
2010-04-14:20:57          4
2010-04-16:08:31          4
2010-07-20:18:16          4

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-10 16:55 | 显示全部楼层
上面的结果可以物化存储起来
天的统计可以从上面小时的统计结果中查询并存储
月的用天的结果
年的用月的
总之,想办法不用明细的

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-10 17:05 | 显示全部楼层
不管你多少亿的数据
一年的分钟级数据量为:
SQL> select 365*24*60 from dual;

365*24*60
----------
    525600
但访问时一次永远只访问60条(一个小时内60分钟的流量情况)

小时数据:
SQL> select 365*24 from dual;

    365*24
----------
      8760
一天内24小时的流量情况,每次只访问24条

年数据都不用物化了,直接访问小时数据即可,不到1万的数据量而已

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-10 17:07 | 显示全部楼层
假设不做分级物化处理,假设一年1亿的数据
分钟级的流量分析大概需访问的数据量:
SQL> select 100000000/365/24 from dual;

100000000/365/24
----------------
      11415.5251
小时级的:
SQL> select 100000000/365 from dual;

100000000/365
-------------
   273972.603

你看着办吧

使用道具 举报

回复
论坛徽章:
15
生肖徽章2007版:羊
日期:2009-02-10 14:52:362013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2012-12-17 17:16:242011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-30 14:20:16ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522010年世界杯参赛球队:尼日利亚
日期:2010-07-15 14:53:432010年世界杯参赛球队:美国
日期:2010-04-29 22:55:002010新春纪念徽章
日期:2010-03-01 11:08:27生肖徽章2007版:龙
日期:2009-07-30 10:45:52
发表于 2010-8-10 17:11 | 显示全部楼层
就像Oracle的视图一样,车子的数量一直累加,你在程序里保留一分钟以前的值,再做差值。。

使用道具 举报

回复
招聘 : Java研发
认证徽章
论坛徽章:
71
马上加薪
日期:2014-02-19 11:55:14蜘蛛蛋
日期:2012-12-26 18:16:01茶鸡蛋
日期:2012-11-16 08:12:48ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07奥运会纪念徽章:网球
日期:2012-08-23 14:58:08奥运会纪念徽章:沙滩排球
日期:2012-07-19 17:28:14版主2段
日期:2012-07-07 02:21:02咸鸭蛋
日期:2012-03-23 18:17:482012新春纪念徽章
日期:2012-02-13 15:13:512012新春纪念徽章
日期:2012-02-13 15:13:51
发表于 2010-8-10 17:12 | 显示全部楼层
问题二:用jdbc连接数据库时,有时候需要查询几千万条的数据,怎样优化jdbc。
别想了,就是一个死
问题三:jdbc连接是ResultSet的next()方法,原理是什么样的,ResultSet rs = stmt.executeQuery(“select * from carInfo“);是已经将表中的所有数据都读出来了,还是只是建立了一个连接,每次调用next()方法,就从数据库里取一条??(我不太清楚他的原理,望大虾们解答一下。)
每次next去fetch,但不是一条,fetch_size可以调

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表