最近使用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. 简单理解PHP-FPM

    php-fpm只是一个php-fastcgi的管理器,为php提供管理服务 1.为什么会出现php-fpm    fpm的出现全部因为php-fastcgi出现,为了很好的管理php-fastcgi而 ...

  2. Windows利用文件夹映射来同步文件

    在windows服务器上有时有这样的需求: 你的文件在f:\test中,但由于其它原因用户访问的是e:\test,如果又希望e:\test 中的文件与f:\test的保持同步,除了用同步软件来做外,可 ...

  3. FILESTREAM feature can't be enabled if you use cluster shared volumes

    Create a SQL Cluster instance. Create Cluster Shared Volume Please note. No Share storage is added i ...

  4. Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx  Aitit algo fix 算法系列补充.docx Atiitt 兼容性提示的艺术 attilax总结.docx Atitit 应用程序容器化总结 v2 s66.docx Atitit file cms api

    Atitit s2018.6 s6  doc list on com pc.docx Atitit s2018.6 s6  doc list on com pc.docx  Aitit algo fi ...

  5. Win10 15063 开始运行不保存历史记录原因和解决方法

    http://www.ampc8.com/thread-23421-1-1.html 在Win10 1703的时候你也许会发现开始运行以后,再次打开就没有任何历史记录了,常规方法是桌面-右键-个性化- ...

  6. shell md5sum

    md5sum  out.a echo "fd_limit=$(ulimit -n), fd_used=$(ll /proc/4741/fd | wc -l)"   需找句柄,及fd ...

  7. (笔记)一场由SD卡引发的灾难

    一场由SD卡引发的灾难   注:此文章转自“https://user.qzone.qq.com/63915185/blog/1512562541”.   Flash里面的数据在使用过程中莫名改变或不翼 ...

  8. python让实例作用于for循环并当做list来使用

    python如果想让一个类被用于for....in  循环,类型list和tuple那样,可以实现__iter__方法. 这个方法返回一个迭代对象,python的for循环就会不断调用该迭代对象的ne ...

  9. SDE表空间不足解决办法(ORA-01653)

    一.问题描述       在往空间数据库拷贝数据的时候,发生了ORA-01653的错误,提示信息如下: 这主要是因为表空间不足引起的,出现这种表空间不足的问题一般有两种情况:一种是表空间的自动扩展功能 ...

  10. 在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案

    eclipse在其POM文件的一处提示出错如下: Plugin execution not covered by lifecycle configuration: org.apache.maven.p ...