问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

JDBC编程怎么把大量的数据从一个表复制到另一个表

发布网友 发布时间:2022-04-09 08:07

我来回答

2个回答

懂视网 时间:2022-04-09 12:28

@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, " + 28 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 29 "PERIOD_REPAY_AMOUNT " + 30 "from( " + 31 " select lr_id,LR_APPLYID from t_loan_request t " + 32 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘ " + 33 " order by lr_id desc)req " + 34 "left join t_repay_plan rp " + 35 "on req.lr_id=rp.lr_id " + 36 "order by req.lr_id,CURR_PERIODS ";// 预编译语句,“?”代表参数*/ 37 pre = con.prepareStatement(sql); 38 pre2=con.prepareStatement("select CURR_PERIODS,REPAY_DAY, " + 39 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 40 "PERIOD_REPAY_AMOUNT " + 41 "from t_repay_plan " + 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,
" +
 2 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,
" +
 3 "PERIOD_REPAY_AMOUNT 
" +
 4 "from(
" +
 5 " select lr_id,LR_APPLYID from t_loan_request t 
" +
 6 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘
" +
 7 " order by lr_id desc)req
" +
 8 "left join t_repay_plan rp
" +
 9 "on req.lr_id=rp.lr_id
" +
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--取大量数据

标签:

热心网友 时间:2022-04-09 09:36

可以通过以下sql实现
sql:insert into tablename1(filename3,filename4) as select filename1, filename2 from tablename2;
解释:从tablename2表中读取出filename1和filename2字段插入到tablename1表中的
filename3和filename4字段中。
备注:插入表的字段顺序和查询表的字段顺序必须保持一致。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
燃气热水器声音轰轰的响正常吗 燃气热水器点火后滋滋响,就不加热了 男属蛇女属龙的姻缘 张学友那第几届最佳男配角 17岁时的爱情会长久的机率有多大? 17岁的爱情能长久吗 17岁的爱情可以长久么? 17岁的爱可以永远吗 “坎水逆流朝丙户”的出处是哪里 ...急 急 若懂这方面知识的兄弟指点小的我一下 比如背压怎么调... 打雷时看电视会烧坏电视吗? 鸡蛋羹盐放多少 蒸4个鸡蛋要放多少盐 如果我要炒3个鸡蛋放多少盐啊?急急 鸿业兴园一区到昌平西口站怎么座与? 【鸿业兴园一区】小区总共面积有多大?分布是怎么样的? 北京金百原餐饮管理有限公司怎么样? 鸿业兴园周边环境怎么样?生活便利吗? 鸿业兴园一区怎么样?好不好?值不值得买? 方庄桥西到北京市丰台区康辛路鸿业兴园3号楼怎么坐车 北京鸿业兴园一区属于哪个街道 鸿业兴园两限房和鸿基花园是一回事吗?? 怎样能租到北京丰台鸿业兴园二区的停车位 【鸿业兴园二区】二手房可以用公积金贷款吗?住房公积金的余额能够用来做购房首付吗? 北京鸿基世业房地产开发有限公司怎么样? 鸿业兴园两限房(限价房)周边环境怎么样?生活便利吗? 鸿业兴园两限房(限价房)交通方便吗?应该怎么过去? 【鸿业兴园二区】这个小区的都是二手房吗?和一手房比,到底买二手房好还是一手房好? 鸿业兴园二期怎么样?好不好?值不值得买? 鸿业兴园二期周边环境怎么样?生活便利吗? 打雷,看电视可以吗?会不会烧掉 请问,为什么打雷天电视会被打坏 为什么以前的电视,一旦打雷就很容易被烧坏? 为什么以前的电视一打雷就容易烧坏,现在的电视就不那么怕雷? 在打雷的傍晚,看电视,电视为什么会被击坏 打雷时,看电视电视会炸吗? 设计采访提问的过程中+你会怎么样考虑采访对象的感受和进入敏感话题_百度问一问 采访妈妈小时候爱做什么后写100字感受? 超过法定退休年龄劳动关系法律怎么规定的 超过法定退休年龄如何办理退休手续? 超过法定退休年龄能否确定劳动关系 过了退休年龄还可以办理退休吗 超过法定退休年龄的劳动者能申请劳动仲裁吗 详细? 超过法定退休年龄劳动关系确定规定是什么 超过法定退休年龄,公司现在辞退我我可以要求补偿吗 超过退休年龄认定工伤 达到法定退休年龄,但没开始享受养老金可以继续领取失业保险金吗? 超过法定退休年龄的工伤认定 公司准备办理社会保险,但是有超过法定退休年龄的员工,怎么办 超出退休年龄,办理退休
  • 焦点

热门图文

猜你喜欢