最近使用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才起作用

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

jdbc 块提取方式的更多相关文章

  1. 浅析jdbc建立连接方式与背后的java类加载

    关于jdbc的连接方式#1Connection conn;Class.forName("com.mysql.jdbc.Driver"); //2conn=DriverManager ...

  2. MySQL JDBC/MyBatis Stream方式读取SELECT超大结果集

    情景: 遍历并处理一个大表中的所有数据, 这个表中的数据可能会是千万条或者上亿条, 很多人可能会说用分页limit……但需求本身一次性遍历更加方便, 且Oracle/DB2都有方便的游标机制. 对DB ...

  3. JDBC编程的方式

    JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...

  4. 各种数据库使用JDBC连接的方式

    Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...

  5. spring实例化dataSource使用jndi和jdbc两种方式

    一.使用jndi的方式 这种方式方便测试人员不需要改代码,直接改变tomcat的server.xml就可以更改数据库连接 spring创建bean <bean id="dataSour ...

  6. ipv6下jdbc的连接数据库方式

    ipv6下jdbc的连接数据库方式 MySQL: ipv4 Driver URL:           jdbc:mysql://127.0.0.1:3306/database   ipv6 Driv ...

  7. 按“块”的方式写dom以及代码注释

    前言 首先这个文档中主要记述了自己在编写html代码时如何构建良好的dom结构的一些所思所想,在这一部分主要说明按“块”构建dom结构的思路.同时在这篇文档中也记述了自己对代码注释的理解,在这一部分主 ...

  8. JDBC纯驱动方式连接MySQL

    1 新建一个名为MysqlDemo的JavaProject 2 从http://dev.mysql.com/downloads/connector/j/中下载最新的驱动包. 这里有.tar.gz和.z ...

  9. Java笔记4:JDBC纯驱动方式连接Oracle

    JDBC纯驱动方式连接Oracle 1 下载Oracle提供的驱动程序包 下载地址: http://www.oracle.com/technetwork/database/enterprise-edi ...

随机推荐

  1. Restful API学习笔记

    之前关于这个概念在网上看了一些,看完似懂非懂,模模糊糊,发现专业术语或者说书面表达的形式对于理解这种十分抽象的概念还是低效了点. 书面文档方面看了以下几个: 理解本真的REST架构风格 1. 要深入理 ...

  2. idea validation code

    K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5FIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  3. 20164324王启元 Exp4恶意代码分析

    一.实验要求 1.系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果. 安装配置sysinternals里的sys ...

  4. 那些H5用到的技术(5)——视差滚动效果

    前言原理使用方式结合swiper.js 前言 视差滚动(Parallax Scrolling)是指让多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验. 目前最火热的视差开源库为pa ...

  5. JavaScript 刷题一

    最近读<JavaScirpt编程精解>,想把里面的三个大的程序实现,现在记录下来. 问题一: 从下面这封信中,emily奶奶每封信的结尾都会用同样的格式注明哪只猫出生了,哪只猫死去了.现要 ...

  6. jquery colsest的用法

    如果有class,就是他自己,没有就在父级去找 e=e||window.event; var target=e.srcElement?e.srcElement:e.target; var parent ...

  7. DateTime.Now与DateTime.Today的区别

    区别如下图: DateTime.Now: 不仅显示日期 还显示当前时间: DateTime.Today: 只显示当前日期,没有时间

  8. 暗示net core

    using (var scope = ServiceProvider.CreateScope()){ var aSubscriber = Activator.CreateInstance(aSubsc ...

  9. iframe适应屏幕大小,隐藏滚动条,移动端

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  10. Centos7 linux 安装 redis 遇到的几个问题

    环境:centos7 + redis 5.0  解决方案仅供参考,如不能解决问题,请查找请他方案.     1.不能编译没有GCC 编译工具 make报错: make[1]: [persist-set ...