jdbc--取大量数据

最近使用jdbc方式查询数据,保存为csv文件中。当然你可以在pl/sql中直接查出来,copy to excel就好了。但我想通过程序实现

 1 @Test
 2     public void test() throws IOException {
 3         BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\yhzh\\Desktop\\zh_20160913")));
 4         String tmp=null;
 5         List<String> nos=new ArrayList<String>();
 6         while((tmp=reader.readLine()) !=null)
 7             nos.add(tmp);
 8
 9         Connection con = null;// 创建一个数据库连接
10         PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
11         PreparedStatement pre2 = null;
12         ResultSet result = null;// 创建一个结果集对象
13         BufferedWriter csvWriter=null;
14         try
15         {
16             String tag=(new SimpleDateFormat("hhmmss")).format(new Date());
17             csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\yhzh\\Desktop\\贷后还款计划_"+tag+".csv")), "utf-8"));
18
19             Class.forName("oracle.jdbc.driver.OracleDriver");
20             //:6006/hotfix
21             String url = "jdbc:oracle:thin:@//*.*.*.*:16030/zcgl",user = "*",password = "*";
22             con = DriverManager.getConnection(url, user, password);// 获取连接
23             String sql="select max(lr_id) from t_loan_request where LR_REQUESTSTATUS =‘2‘ and lr_applyid=?";
24             /*String sql = 27                     "select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY,\n" +
28                     "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,\n" +
29                     "PERIOD_REPAY_AMOUNT \n" +
30                     "from(\n" +
31                     "  select lr_id,LR_APPLYID from t_loan_request t \n" +
32                     "  where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘\n" +
33                     "  order by lr_id desc)req\n" +
34                     "left join t_repay_plan rp\n" +
35                     "on req.lr_id=rp.lr_id\n" +
36                     "order by req.lr_id,CURR_PERIODS ";// 预编译语句,“?”代表参数*/
37             pre = con.prepareStatement(sql);
38             pre2=con.prepareStatement("select CURR_PERIODS,REPAY_DAY,\n" +
39                     "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,\n" +
40                     "PERIOD_REPAY_AMOUNT \n" +
41                     "from t_repay_plan\n" +
42                     "where lr_id=? " +
43                     "order by CURR_PERIODS");
44             for(String no:nos){
45                 pre.setString(1,no);
46                 result = pre.executeQuery();
47                 if(result.next()) {
48                     long lrId=result.getLong(1);
49                     pre2.setLong(1,lrId);
50                     result = pre2.executeQuery();
51                     while (result.next()) {
52                         csvWriter.write(no);
53                         csvWriter.write(",");
54                         csvWriter.write(result.getString(1));
55                         csvWriter.write(",");
56                         csvWriter.write(result.getString(2));
57                         csvWriter.write(",");
58                         csvWriter.write(result.getString(3));
59                         csvWriter.write(",");
60                         csvWriter.write(result.getString(4));
61                         csvWriter.newLine();
62                     }
63                 }
64             }
65
66             csvWriter.flush();
67         }
68         catch (Exception e)
69         {
70             e.printStackTrace();
71         }
72         finally
73         {
74             try
75             {
76                 if(csvWriter !=null)
77                     csvWriter.close();
78                 if (result != null)
79                     result.close();
80                 if (pre != null)
81                     pre.close();
82                 if (con != null)
83                     con.close();
84                 System.out.println("数据库连接已关闭!");
85             }
86             catch (Exception e)
87             {
88                 e.printStackTrace();
89             }
90         }
91     }

先读取所有编号形成List,后遍历这个List,先查出id再查详细数据。这样的数据csv文件中大约8万多条

一条条的来肯定慢,如果不按照编号,直接一次查出,数据是9万多条。速度都很慢!!!

后来想提高下,至少要有个明显的提升呀。写文件这块基本排除了,剩下的疑问就是ResultSet是否拿到了所有结果呢?

根据网上查到的资料和实际调试,得出答案:ResultSet默认一次取10条数据,怪不得要慢,如果一次全部读入内存再写入文件就一定很快了。

怎样一次读取所有数据呢?

sql改为读取全部

 1 String sql="select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY,\n" +
 2     "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,\n" +
 3     "PERIOD_REPAY_AMOUNT \n" +
 4     "from(\n" +
 5     "  select lr_id,LR_APPLYID from t_loan_request t \n" +
 6     "  where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘\n" +
 7     "  order by lr_id desc)req\n" +
 8     "left join t_repay_plan rp\n" +
 9     "on req.lr_id=rp.lr_id\n" +
10     "order by req.lr_id,CURR_PERIODS";

设置PreparedStatement:

1 pre = con.prepareStatement(sql);
2 pre.setFetchSize(100000);
3 result = pre.executeQuery();
4 //result.setFetchSize(100000);

主要是PreparedStatement的 setFetchSize 方法,

后来发现ResultSet也有个setFetchSize 方法,也是可行的,只是这个时候resultset中已经有了10条记录直到循环10次后,再次使用result.next()才去取100000,fetchSize才起作用

这样设置后速度飞快!!!

时间: 2024-11-04 13:16:59

jdbc--取大量数据的相关文章

Java语言实现通过Ajax抓取后台数据及图片

1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计 create table picture( pic_id number not null, pic_name varchar(200)not null, pic_url varchar2(200) not null, pic_descp varchar2(200) not null, pic_price varchar2(200) not null ) insert into picture values(1 ,'小米5s

数据库取的数据打包成json然后传值到前端

后端用get或者post从数据库取的数据如何打包成json: 需要下载json的jar包,这里有:http://download.csdn.net/detail/zhangy0329/607838 Connection ct = null; Statement sm = null; ResultSet rs = null; try{ Class.forName("com.mysql.jdbc.Driver"); //连接mysql数据库 ct = DriverManager.getCo

Asp.net 使用正则和网络编程抓取网页数据(有用)

Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </summary> /// <param name="strUrl">採集地址</param> /// <param name="Begin">開始字符</param> /// <param name="End">结束字符</param&g

sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单.下面是一个简单示例: --1.创建测试

爬虫再探实战(五)———爬取APP数据——超级课程表【一】

关于爬虫,开始以为只能爬取网页数据,后来知道APP也能抓取.于是,在学校利用空闲时间,耗时两周实现了数据的抓取和简单的数据分析. 目标,抓取超级课程表XX大学(其实是我们大学啦...)学生20000条发帖信息.思路如下: STEP1:为我们的爬虫找到入口 APP请求数据,也是通过网络协议,这样,我们就抓包来定位入口,这里我用的是fiddler.关于设置手机和fiddler的关联,请参考这篇文章. 找到登陆入口为:http://120.55.151.61/V2/StudentSkip/loginC

利用linux curl爬取网站数据

看到一个看球网站的以下截图红色框数据,想爬取下来,通常爬取网站数据一般都会从java或者python爬取,但本人这两个都不会,只会shell脚本,于是硬着头皮试一下用shell爬取,方法很笨重,但旨在结果嘛,呵呵. 2.首先利用curl工具后者wget工具把整个网站数据爬取下来 curl 网址 >wangzhan.txt 3.查看wangzhan.txt文件,找出规则,看到数据是存放在哪个地方,本人是把txt文件拷到本机上用UE打开方便查看.通过查看文件,我发现数据是存储在"var aut

JDBC之 大数据内容的传输

JDBC之 大数据内容的传输 什么是大数据内容? 在数据库中,有一条一条的记录,记录中很多字段都是几个字符就够的,假如现在要把一部小说存入数据库,这本小说当然不是几个字符组成,而是由几万字组成,这本小说的数据我们就可以说是大数据,生活中当然有各种各样的大数据:电影,音乐,图片等等... 大字符数据内容操作 大字符内容:通常是指很长的字符类型的文件,例如小说,故事等等,内容有字符组成. 下面说明一下MySQL与Oracle中的大数据类型 数据种类 数据大小 MySQL Oracle 字符 小 ch

java抓取网页数据,登录之后抓取数据。

最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一个jsoup的jar包,我用的1.6.0..下载地址为:http://pan.baidu.com/s/1mgqOuHa 1,获取网页内容(核心代码,技术有限没封装). 2,登录之后抓取网页数据(如何在请求中携带cookie). 3,获取网站的ajax请求方法(返回json). 以上这三点我就用一个类

Asp.net 使用正则和网络编程抓取网页数据(实用)

Asp.net 使用正则和网络编程抓取网页数据(实用) /// <summary> /// 抓取网页相应内容 /// </summary> /// <param name="strUrl">采集地址</param> /// <param name="Begin">开始字符</param> /// <param name="End">结束字符</param&g

java对象转JSON JS取JSON数据

JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter(new PropertyFilter() { @Override public boolean apply(Object arg0, String arg1, Object arg2) { // 过滤掉对象里的包含自己的属性(自己关联自己) if (arg1.equals("wareTypes") || arg1.equals("skillS&