开发者社区> 问答> 正文

读取出错!文本为几百M,刚才搞了下,插入问题解决了!但问题又来了:报错

问题解决了,代码如下:求高性能的解决方案:

需求:

解决:

代码:

package com.records.info;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DBconn {
	
	ArrayList<String> column3string=new ArrayList<String>();
	ArrayList<String> column13string=new ArrayList<String>();
	
	ArrayList<String> test2col1=new ArrayList<String>();
	ArrayList<Integer> test2col2=new ArrayList<Integer>();
	ArrayList<String> test2col3=new ArrayList<String>();
	
	
   
   String driver = "com.mysql.jdbc.Driver";
   static   String dbName = "dyform";
   static   String password = "root";
   static   String userName = "root";
   static   String url = "jdbc:mysql://localhost:3307/" + dbName;
   static   String sql = "select * from workinfo";
   Connection conn=null;
	
	public static Connection getConnection(){ 
		String encoding="utf-8";
		Connection conn=null;
	         try { 
	                 Class.forName("com.mysql.jdbc.Driver"); 
	         } catch (ClassNotFoundException e) { 
	             e.printStackTrace(); 
	          } 
	         try { 
	                   conn = DriverManager.getConnection(url, userName, password); 
	         } catch (SQLException e) { 
	               e.printStackTrace(); 
	         }  
	               return conn; 
	         }
	
	public void readFile(String filename) throws SQLException{
	  
		            File file = new File(filename);   
		           if (file.isFile() && file.exists()) {   
		               InputStreamReader read = null;
					try {
						read = new InputStreamReader(  new FileInputStream(file),"utf-8");
					} catch (UnsupportedEncodingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}   
		               BufferedReader bufferedReader = new BufferedReader(read);   
		             String lineTXT = null;    
	              try {
					while ((lineTXT = bufferedReader.readLine()) != null) {   
						 
						  String str="";
						  str+=" "+ lineTXT;
						  List<String> info=new ArrayList<String>();
					      String[] temp = info.toArray(new String[info.size()]);  
					      if (temp!=null||temp.length!=0) {
					    	   temp = lineTXT.split("	");
							   String sql = "insert into workinfo(column3,column13) values(?,?)"; 
								 int count = 0;//计数器 
								
								 Connection conn =getConnection(); 
								 PreparedStatement pstmt = conn.prepareStatement(sql); 
								
							
								 conn.setAutoCommit(false);//设置数据手动提交,自己管理事务 
								 pstmt.setString(1, temp[0]); 
								 pstmt.setString(2, temp[1]); 
								 pstmt.addBatch();//用PreparedStatement的批量处理 

								 if(count%2000==0){//当增加了500个批处理的时候再提交 
								 pstmt.executeBatch();//执行批处理 
								 conn.commit();//提交 
								 conn.close();//关闭数据库 
								 conn =getConnection();//重新获取一次连接 
								 conn.setAutoCommit(false); 
								 pstmt = conn.prepareStatement(sql); 
								 
								 }
								 pstmt.executeBatch(); 
								 conn.commit(); 
								 
								
								 pstmt.close(); 
								 conn.close(); 
							   }
					    
					  }
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		           }
  	       
   }
	
	
	
	public void show(){
		System.out.println("This is string:");
		  for(int i=0;i<column3string.size();i++){
			  System.out.println(column3string.get(i));
		  }
		System.out.println("This is integer:");
		 for(int i=0;i<column13string.size();i++){
	        System.out.println(column13string.get(i));
		  }
	}
	
	
	
	
	public static void main(String[] args)  {
		
		DBconn test=new DBconn ();
		test.show();
		long timeTestStart=System.currentTimeMillis();//记录开始时间
	     try {
			test.readFile("D:\\ProgramFiles\\tomcat7\\webapps\\ExcelDemo1\\upload\\1_attlog.dat");
	    	
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	     System.out.println("succeed");
	 	long timeTestEnd=System.currentTimeMillis();//记录结束时间
		long time=timeTestEnd-timeTestStart;
		long secondTime=time/1000;
	     System.out.println("Time:"+secondTime+" seconds");
	}
}

展开
收起
kun坤 2020-06-06 16:23:52 490 0
1 条回答
写回答
取消 提交回答
  • 拜托,数据库自己有这个功能######这回复,怎一个拽字了得######是要插入数据库,看明白需求再讲######想快用python######

    shell脚本就搞定了

    cut -f1,2,3 -d" " 

    然后拼接SQL就了

    ######例子我写在后面了######有例子吗######

    不明白你为什么头上要加一个空格,split可以跟表示空白符的正则 split("\\\W");

    ######
    f = open("t.txt", "r")
    lines = f.readlines()
    for line in lines:
        words = line.split()
        if len(words) < 2:
            continue
        key1 = words[0]
        key2 = words[1]
    ######有问题就解决呗[20]######谢谢,思路是对的,按照你的思路,但新的问题来了,有空麻烦解决下######split()方法接收的是一个正则表达式,写成.split("\\W+")应该就ok了。######回复 @panfanglin : 大写的……######\\w根本就不可以######瓶颈的地方应该在插入数据库的地方,可以考虑用多线程分片插入数据库 ######回复 @cyb_beta : 额######回复 @panfanglin : 例子没有,可以考虑数据库连接池######兄台说的是,有例子吗######如果是Oracle可以尝试 sqlloader,Google一下吧!######是mysql######

    如果全是空格分隔,试试正则

    split(" +");

    不行用\\W

    ######

    数据库连接来回开关你不觉得很蛋疼

    初始化的时候开一次,最后一次关掉就可以了吧。

    我也没看懂你那个计数。

    你有没觉得你那每次都处理了一次

     

    2020-06-06 16:23:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载