java将大规模数据批量写入SQL数据库

java将大规模数据批量写入SQL数据库

程序背景

将大规模数据数据存储到SQL数据库,如面临上万、十万、百万条数据存储,如果按照一般思路一条条存,必然会耗费大量时间,使得效率低下,本文利用java实现对数据的批量存储。

数据输入

本文示例数据结构如下,其中每一行代表一个车型的竞争关系,其中第一个数字为这款车型(如:车型82),后面所跟数子表示与该车型有竞争关系的其他车型,竞争关系按照从前到后递减(如车型82的竞争车型为:871、18、65、496等十款)。
在这里插入图片描述
任务是将这些车型的竞争关系存入SQL数据库,数据库中数据表结构如下:

其中,car_id为前文文本数据中第一列所示,targetcar_id为后面有竞争关系的车型,weight是将排序标准化的结果,表示竞争强弱。本例中需要存储的数据条数已经上万,所需采用批量存储的方式,具体实现如下。

程序代码

package JDBC;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;
public class DataSavceBatch {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement  prepstmt = null;
		final String DB_DRIVER = "com.mysql.jdbc.Driver";
		final String DB_URL = "jdbc:mysql://114.213.252.89:3306/liangruicheng";
		final String DB_USER = "root";
		final String DB_PASSWORD = "112233";
		File result = new File("data"+File.separator+"carCompetitor.txt");
		String resultLine;
		String[] resultSplitLine;
		String car_id;
		String targetcar_id = null;
		double targetcar_weight = 0;
		int batchSize = 0;   //批处理的数量计数	
		try {
			BufferedReader bfr = new BufferedReader( new InputStreamReader( new FileInputStream(result),"UTF-8")); //读取本地文件
			//加载驱动类
			Class.forName(DB_DRIVER);
			//建立连接
			conn = DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD);
			//关闭事务提交,这一行必须加上
			conn.setAutoCommit(false);  	
			while((resultLine = bfr.readLine()) != null) {
				int count = 0;
				resultSplitLine = resultLine.split("\\s+");	
				for(int i = 1;i<resultSplitLine.length;i++) {
					count += i;
				}				
				car_id = resultSplitLine[0];	
				for(int i = 1; i<resultSplitLine.length;i++) {
					batchSize ++;				
					targetcar_id = resultSplitLine[i];
					//根据排序,将权重标准化处理
					targetcar_weight = (double)(resultSplitLine.length - i)/count;	
					//接下来批量存储数据
					if(batchSize%5000 != 0) {  //计数是否到达5000,不到5000先放入PreparedStatement中
						prepstmt.setString(1,car_id);
						prepstmt.setString(2,targetcar_id);
						prepstmt.setDouble(3,targetcar_weight);	
						prepstmt.addBatch();
					}else {                   //到达5000后,执行操作将数批量存入数据库
						//进行事务提交
						prepstmt.executeBatch();  
						conn.commit();
						//初始化batchSize计数
						batchSize = 0;
					}			
				}
				//此处较为重要,最后需要再执行一次,将不满5000条的结果提交上去,否则将漏存数据
				prepstmt.executeBatch();  
				conn.commit();
			}	
			 		
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e2) {
			e2.printStackTrace();
		} catch (IOException e3) {
			e3.printStackTrace();
		}finally {
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}	
	}
}

上面的代码中,通过PreparedStatement实现对数据的批量存储,能过大大减少数据存储的时间,提高效率。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的pandas库和pyodbc库来实现将Excel数据批量导入SQL Server数据库。 首先需要安装pandas库和pyodbc库,可以使用以下命令进行安装: ``` pip install pandas pip install pyodbc ``` 然后可以按照以下步骤进行操作: 1. 使用pandas库读取Excel数据,可以使用以下代码: ``` import pandas as pd df = pd.read_excel('data.xlsx') ``` 其中,`data.xlsx`是要导入的Excel文件名,可以根据实际情况修改。 2. 连接SQL Server数据库,可以使用以下代码: ``` import pyodbc conn = pyodbc.connect('Driver={SQL Server};' 'Server=server_name;' 'Database=database_name;' 'Trusted_Connection=yes;') ``` 其中,`server_name`和`database_name`分别是SQL Server服务器名称和数据库名称,可以根据实际情况修改。 3. 将数据导入SQL Server数据库,可以使用以下代码: ``` cursor = conn.cursor() for index, row in df.iterrows(): cursor.execute("INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?)", row['column1'], row['column2'], row['column3']) conn.commit() ``` 其中,`table_name`是要导入数据的表格名称,`column1`、`column2`和`column3`分别是表格中要导入的列名,可以根据实际情况修改。 4. 关闭数据库连接: ``` conn.close() ``` 完整代码示例: ``` import pandas as pd import pyodbc df = pd.read_excel('data.xlsx') conn = pyodbc.connect('Driver={SQL Server};' 'Server=server_name;' 'Database=database_name;' 'Trusted_Connection=yes;') cursor = conn.cursor() for index, row in df.iterrows(): cursor.execute("INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?)", row['column1'], row['column2'], row['column3']) conn.commit() conn.close() ``` 注意:在实际操作中,需要根据实际情况修改代码中的参数,例如Excel文件名、SQL Server服务器名称、数据库名称、表格名称和列名等。同时,在执行INSERT语句时,需要根据实际情况修改VALUES后面的参数个数和顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值