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

 @Test
public void test() throws IOException {
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\yhzh\\Desktop\\zh_20160913")));
String tmp=null;
List<String> nos=new ArrayList<String>();
while((tmp=reader.readLine()) !=null)
nos.add(tmp); Connection con = null;// 创建一个数据库连接
PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
PreparedStatement pre2 = null;
ResultSet result = null;// 创建一个结果集对象
BufferedWriter csvWriter=null;
try
{
String tag=(new SimpleDateFormat("hhmmss")).format(new Date());
csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\yhzh\\Desktop\\贷后还款计划_"+tag+".csv")), "utf-8")); Class.forName("oracle.jdbc.driver.OracleDriver");
//:6006/hotfix
String url = "jdbc:oracle:thin:@//*.*.*.*:16030/zcgl",user = "*",password = "*";
con = DriverManager.getConnection(url, user, password);// 获取连接
String sql="select max(lr_id) from t_loan_request where LR_REQUESTSTATUS ='2' and lr_applyid=?";
/*String sql = "select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY,\n" +
"(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,\n" +
"PERIOD_REPAY_AMOUNT \n" +
"from(\n" +
" select lr_id,LR_APPLYID from t_loan_request t \n" +
" where t.LR_REQUESTSTATUS ='2' and t.creater='PostLoanOuterAction'\n" +
" order by lr_id desc)req\n" +
"left join t_repay_plan rp\n" +
"on req.lr_id=rp.lr_id\n" +
"order by req.lr_id,CURR_PERIODS ";// 预编译语句,“?”代表参数*/
pre = con.prepareStatement(sql);
pre2=con.prepareStatement("select CURR_PERIODS,REPAY_DAY,\n" +
"(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,\n" +
"PERIOD_REPAY_AMOUNT \n" +
"from t_repay_plan\n" +
"where lr_id=? " +
"order by CURR_PERIODS");
for(String no:nos){
pre.setString(1,no);
result = pre.executeQuery();
if(result.next()) {
long lrId=result.getLong(1);
pre2.setLong(1,lrId);
result = pre2.executeQuery();
while (result.next()) {
csvWriter.write(no);
csvWriter.write(",");
csvWriter.write(result.getString(1));
csvWriter.write(",");
csvWriter.write(result.getString(2));
csvWriter.write(",");
csvWriter.write(result.getString(3));
csvWriter.write(",");
csvWriter.write(result.getString(4));
csvWriter.newLine();
}
}
} csvWriter.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(csvWriter !=null)
csvWriter.close();
if (result != null)
result.close();
if (pre != null)
pre.close();
if (con != null)
con.close();
System.out.println("数据库连接已关闭!");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}

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

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

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

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

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

sql改为读取全部

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

设置PreparedStatement:

 pre = con.prepareStatement(sql);
pre.setFetchSize(100000);
result = pre.executeQuery();
//result.setFetchSize(100000);

主要是PreparedStatement的 setFetchSize 方法,

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

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

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

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

    1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计: create table picture( pic_id number not null, pic_name )not nu ...

  2. Hive 如何快速拉取大批量数据

    用hive来做数仓类操作,或者大数据的运算,是没有疑问的,至少在你没有更多选择之前. 当我们要hive来做类似于大批量数据的select时,也许问题就会发生了变化. 1. 通用解决方案之分页 首先,我 ...

  3. Java 爬取 51job 数据 WebMagic实现

    Java 爬取 51job 数据 一.项目Maven环境配置 相关依赖 jar 包配置 <parent> <groupId>org.springframework.boot&l ...

  4. 使用logstash拉取MySQL数据存储到es中的再次操作

    使用情况说明: 已经使用logstash拉取MySQL数据存储到es中,es中也创建了相应的索引,也存储了数据.假若把这个索引给删除了,再次进行同步操作的话要咋做,从最开始的数据进行同步,而不是新增的 ...

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

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...

  6. Charles 如何抓取https数据包

    Charles可以正常抓取http数据包,但是如果没有经过进一步设置的话,无法正常抓取https的数据包,通常会出现乱码.举个例子,如果没有做更多设置,Charles抓取https://www.bai ...

  7. row_number和partition by分组取top数据

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  8. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  9. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  10. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

随机推荐

  1. Android 架构:Android Jetpack 架构组件的学习和分析

    参考:https://mp.weixin.qq.com/s/n-AzV7Ke8wxVhmC6ruUIUA 参考:https://jekton.github.io/2018/06/30/android- ...

  2. 明天软软onsite

    现在在飞机上,还有1.5小时到达.买了网络包,速度不错.今年上半年第三次飞西雅图,过几天也许还有第四次... 今天群主FB加面系统设计非常顺利,祝他拿到大包裹,也希望拿到以后发大红包,这回我一定不能错 ...

  3. SecureCRT自动上传文件python脚本

    本人在ubuntu下使用SecureCRT,上传文件习惯用rz命令.每次上传都弹对话框选择文件按确定后才上传,感觉很费力.最后自己摸索整理出一个脚本. 使用方法是,在[Script]菜单点[Run.. ...

  4. android studio设置imageview显示图片

    拖动imageview 选择图片 .png 代码引用: private Imageview pay; pay = (ImageView)findViewById(R.id.imageView2); p ...

  5. 【Zookeeper系列】zookeeper面试题(转)

    原文链接:https://segmentfault.com/a/1190000014479433 1.ZooKeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是 ...

  6. 后渗透神器Empire的简单使用

    1.安装 1.1.系统环境: Debian系Linux:例如Ubuntu和Kali(本文使用Kali作为环境) 1.2.安装命令: 安装最后需要输入用户名.密码 wget https://raw.gi ...

  7. postgresql修改数据库编码

    update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'your_database'; 先用 \e ...

  8. windows 安装mongodb

    1.mongodb官网下载:http://www.mongodb.org/downloads 2.将下载的mongodb压缩包解压到对应文件夹,我的是:D:\pc\mongodb,请注意,我的bin目 ...

  9. Jquery 获取 radio选中值,select选中值

    随着Jquery的作用越来越大,使用的朋友也越来越多.在Web中,由于CheckBox.Radiobutton .DropDownList等控件使用的频率比较高,就关系到这些控件在Jquery中的操作 ...

  10. 21、bootstrap框架

    http://www.bootcss.com/ Bootstrap 插件==全部依赖 jQuery== 请注意,Bootstrap 的所有 JavaScript 插件都依赖 jQuery,因此 jQu ...