精华内容
下载资源
问答
  • 引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪。经过我的排查...

    引言:这几天工作这边同事遇到了一个问题,对十五万条数据进行计算,插入数据库的时候耗时很严重,使用了批量插入对十五万条数据插入仍然耗费了30秒,前面计算也耗费了二十多秒,系统流畅度因此很难堪。经过我的排查发现主要是两个点需要优化。

    1)计算的算法冗余,优化前23秒计算完成,优化后0.8秒完成计算(由于业务特殊、保密不方便透露)

    2)十五万条数据批量插入数据库时耗费了30秒,优化后3秒。(已达到业务要求范围内,所以不再继续其他细节优化)

    批量插入基于的是mybatisplus 的service的insertBatch方法

    优化思路:

    使用线程池+任务分派器将15万条数据平均分派给线程池中16个线程去处理

    存储所有数据的集合为list

    线程池使用的FixedThreadPool,因为机器是四核8线程,所以我线程池里放的16个线程。

    1、创建线程池

    ExecutorService es = Executors.newFixedThreadPool(16);

    2、任务分派器

    其实就是一个函数,负责分派要插入的数据集合,遍历0到(线程数-1),然后将集合中所有数据平均分配到每一个线程(数据数量%线程数=余数,余下的几个数据的插入工作直接分配给最后一个线程去)

    经过分配后每个线程负责1万条数据的插入

    16个线程同时跑,由原来的30秒跑完,变成了3秒钟。

    如果还需要优化,可以在线程内将自己受到的1万条数据,分10次批量插入或者每1000条批量插入一次

     

     

    展开全文
  • 在 sa.Update((DataTable)bs.DataSource); 之前添加 SqlCommandBuilderbu = new SqlCommandBuilder( sa);试一下。 我不知道你写那么多代码是要解决什么问题,如果是要dataGridView中所作的变更都体...
    在  sa.Update((DataTable)bs.DataSource); 之前添加
    
    SqlCommandBuilderbu = new SqlCommandBuilder( sa);试一下。 
    
    我不知道你写那么多代码是要解决什么问题,如果是要将dataGridView中所作的变更都体现到DB中的话那么你可以尝试以下操作
    1、用 SqlDataAdapter的 Fill方法填充一个 DataSet
    2、将这个 DataSet 绑定到 dataGridView.DataSource
    3、对 dataGridView 中的数据进行修改
    4、用 SqlCommandBuilderbu  生成用于协调 DataSet 的更改与关联数据库的单表命令。
    5、用 SqlDataAdapter的 Update 方法更新这个 DataSet
    
    参考代码:
    1、绑定 dataGridView
    string ConnectionString 
    = "Data Source=TEST;Persist Security Info=True;User ID=my_new;Password=test";
      
    DataSet ds = new DataSet();
    OracleConnection conn;
    OracleDataAdapter da;
    
    da = new OracleDataAdapter( "select t.* from cm_general_case_info_t t", conn );
    ds.Clear(); 
    da.Fill( ds, "UserInfo" );
    conn.Close();
    this.dataGridView1.DataSource = ds.Tables["UserInfo"];
    
    2、更新dataGridView
    DataTable dt = ( DataTable )dataGridView1.DataSource;
    OracleCommandBuilder bu = new OracleCommandBuilder( da );
    da.Update( ds.Tables["UserInfo"] );
    
    我给的代码是用 ADO.NET System.Data.OracleClient 命名空间 下的类,你只要改成对应的 System.Data.SqlClient 命名空间中的类即可。

    转载于:https://my.oschina.net/arthurdu/blog/79048

    展开全文
  • 大量数据数据库导入Excel文档

    热门讨论 2012-09-21 22:21:33
    这是我在公司实习的时候研究的课题,主要大量数据数据库导出Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...
  • excel数据批量插入到数据库表中

    万次阅读 2017-05-23 01:37:58
    项目实例结构:   ... throw new Exception("添加数据失败!...//获得Connection对象所消耗资源会占整个jdbc操作的85%以上 ...4.数据库配置文件db....通过执行AddToData.java即可excel数据插入到数据库表中。

    项目实例结构:

     

    1.model实体类

     

    package com.model;
    
    public class Test {
    	private int num1;
    	private String num2;
    	private String num3;
    	private String num4;
    	
    	
    	public int getNum1() {
    		return num1;
    	}
    	public void setNum1(int num1) {
    		this.num1 = num1;
    	}
    	public String getNum2() {
    		return num2;
    	}
    	public void setNum2(String num2) {
    		this.num2 = num2;
    	}
    	public String getNum3() {
    		return num3;
    	}
    	public void setNum3(String num3) {
    		this.num3 = num3;
    	}
    	public String getNum4() {
    		return num4;
    	}
    	public void setNum4(String num4) {
    		this.num4 = num4;
    	}
    
    }
    


    2.dao及daoimpl

     

     

    package com.dao;
    
    import com.model.Test;
    
    public interface TestDao {
    	public void add(Test test)throws Exception;
    
    }
    

     

     

     

    package com.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    
    import com.model.Test;
    import com.util.JdbcUtils;
    
    
    public class TestDaoImpl implements TestDao{
    
    	public void add(Test test) throws Exception {
    		Connection conn=null;
    		try {
    			conn=JdbcUtils.getConnection();
    			String sql="insert into test(num2,num3,num4) values (?,?,?)";
    			PreparedStatement pst=conn.prepareStatement(sql);
    			pst.setString(1,test.getNum2());
    			pst.setString(2,test.getNum3());
    			pst.setString(3,test.getNum4());
    			pst.executeUpdate();
    		} catch (Exception e) {
    			e.printStackTrace();
    			throw new Exception("添加数据失败!");
    		}finally{
    			conn.close();
    		}
    		
    	}
    
    }
    

     

     

     

    3.util工具类

     

    package com.util;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    
    public class JdbcUtils {
    	private static String driverClass;
    
    	private static String url;
    
    	private static String user;
    
    	private static String password;
    
    	static {
    		try {
    
    			Properties props = new Properties();
    
    			// 加载属性文件,注意属性文件的路径写法
    			InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream(
    			    "com/util/db.properties");
    
    			props.load(is);
    
    			driverClass = props.getProperty("driverClass");
    			url = props.getProperty("url");
    			user = props.getProperty("user");
    			password = props.getProperty("password");
    
    			Class.forName(driverClass);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    //获得Connection对象所消耗资源会占到整个jdbc操作的85%以上
    //批处理除外
    //尽量减少获得Connection对象	
    	public static Connection getConnection() throws SQLException {
    		return DriverManager.getConnection(url, user, password);
    	}
    
    	public static void main(String[] args) throws Exception {
    //		Properties props = new Properties();
    //		FileInputStream fis = new FileInputStream("d:/db.properties");
    //		props.load(fis);
    //		System.out.println(props.getProperty("driverClass"));
    //		System.out.println(props.getProperty("user"));
    		System.out.println(getConnection());
    	}
    
    }
    

     

     

     

    4.数据库配置文件db.properties

    driverClass=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test
    user=root
    password=root

     

    5.测试类AddToData.java

     

    package com.service;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    import com.dao.TestDao;
    import com.dao.TestDaoImpl;
    import com.model.Test;
    import com.sun.org.apache.commons.logging.Log;
    import com.sun.org.apache.commons.logging.LogFactory;
    
    public class AddToData {
    	// 记录类的输出信息
    	//static Log log = LogFactory.getLog(AddToData.class);
    	
    	// 获取Excel文档的路径
    	public static String filePath = "E://upload2/excel.xls";
    	
    	public static void main(String[] args) throws Exception {
    		try {
    			// 创建对Excel工作簿文件的引用
    			HSSFWorkbook wookbook = new HSSFWorkbook(new FileInputStream(
    					filePath));
    			// 在Excel文档中,第一张工作表的缺省索引是0
    			// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
    			HSSFSheet sheet = wookbook.getSheet("Sheet1");
    			// 获取到Excel文件中的所有行数
    			int rows = sheet.getPhysicalNumberOfRows();
    			// 遍历行
    			for (int i = 1; i < rows; i++) {
    				// 读取左上端单元格
    				HSSFRow row = sheet.getRow(i);
    				// 行不为空
    				if (row != null) {
    					// 获取到Excel文件中的所有的列
    					int cells = row.getPhysicalNumberOfCells();
    					String value = "";
    					// 遍历列
    					for (int j = 0; j < cells; j++) {
    						// 获取到列的值
    						HSSFCell cell = row.getCell(j);
    						if (cell != null) {
    							switch (cell.getCellType()) {
    							case HSSFCell.CELL_TYPE_FORMULA:
    								break;
    							case HSSFCell.CELL_TYPE_NUMERIC:
    								value += cell.getNumericCellValue() + ",";
    								break;
    							case HSSFCell.CELL_TYPE_STRING:
    								value += cell.getStringCellValue() + ",";
    								break;
    							default:
    								value += "0";
    								break;
    							}
    						}
    					}
    					
    					// 将数据插入到mysql数据库中
    					String[] val = value.split(",");
    					Test entity = new Test();
    					entity.setNum2(val[0]);
    					entity.setNum3(val[1]);
    					entity.setNum4(val[2]);
    					TestDao method = new TestDaoImpl();
    					method.add(entity);
    				}
    			}
    			System.out.println("插入成功!");
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    	}
    
    }
    

     

     

     

    5.excel.xls的数据结构

     

     

     

    通过执行AddToData.java即可将excel数据插入到数据库表中。

    展开全文
  • c# datatable数据批量添加到数据库

    千次阅读 2016-12-18 21:59:10
    Class1 c1 = new Class1(); public void pldr1(DataTable dt1,string s1) ... //dt1导入指定表,s1为要目标表名,dt1为要导入的数据  if (c1.sqlcon1.State.ToString().Trim() == "Open")

    Class1 c1 = new Class1();


    public void pldr1(DataTable dt1,string s1)

            {
                //将dt1导入到指定表,s1为要目标表名,dt1为要导入的数据


                if (c1.sqlcon1.State.ToString().Trim() == "Open")
                {
                }
                else
                {
                    c1.sqlcon1.Open();
                }


                try
                {
                    using (SqlBulkCopy sqlBC = new SqlBulkCopy(c1.sqlcon1))
                    {
                        sqlBC.BulkCopyTimeout = 300;
                        sqlBC.DestinationTableName = s1;
                        sqlBC.ColumnMappings.Add("dev_id", "dev_id");
                        sqlBC.ColumnMappings.Add("sj", "sj");
                        sqlBC.ColumnMappings.Add("time1", "time1");
                        sqlBC.ColumnMappings.Add("y1", "y1");
                        sqlBC.ColumnMappings.Add("workNumber", "workNumber");
                        sqlBC.WriteToServer(dt1);


                    }
                }
                catch (Exception e1)
                {
                    string s2 = e1.Message;
                }
                if (c1.sqlcon1.State.ToString().Trim() == "Open")
                {
                    c1.sqlcon1.Close();
                }
                else
                {
                    
                }


            }
    展开全文
  • c# 快速 大量数据插入数据库

    千次阅读 2018-10-03 17:08:22
    主要思想是通过在客户端把数据都缓存在Table中,然后利用SqlBulkCopy一次性把Table中的数据插入到数据库 public static void BulkToDB(DataTable dt) { SqlConnection sqlConn = new SqlConnection( ...
  • 1.新建小程序,建立云开发快速启动模板 这里和普通小程序的区别有三点 一是 project.config.json写上云函数所在目录"cloudfunctionRoot": "cloudfunctions/", 二是app.json写上“cloud”:true 三是 app.js ...
  • 工作中,有时候需要excel中的数据
  • DataGridView中数据存入数据库方法
  • 可以使用数据库管理工具 Navicat for MySQL 进行数据导入。选择表格所对应的数据库,在表名上右键选择“导入向导”。 点击“下一步”,选择数据源“Excel表”根据提示进行一步步操作即可。 ...
  • 数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ①数据库数据特点 永久存储、有组织、可共享。 (数据的最小存取...
  • 如何数组插入到数据库

    千次阅读 2020-03-19 12:46:19
    } 大家请看,我现在要从前端获取的两个数据传递服务器,然后再由服务器这两个数据插进数据库中,只需用这个循环遍历一遍即可。 ps:我所获取的数组中默认首位各有一个0,例如我获取的数据是3,2则传递...
  • 数据库面试

    千次阅读 多人点赞 2019-02-13 09:03:42
    一、数据库问答题 1. SQL语言包括哪些类型? 数据定义DDL:Create Table,Alter Table,Drop Table, Create/Drop Index等 数据操纵DML:Select ,insert,update,delete, 数据控制DCL:grant,revoke 2. 内联接,外联接...
  • 如何快速数据库加入10万条数据

    万次阅读 2018-08-23 23:05:47
    1、程序连接数据库,使用c3p0线程池;...直接贴代码,代码举例中,近用小规模数据模拟大数据下的数据库批量插入操作。 1、数据库连接池 package com.example.jdbcConnection; import com.mchange...
  • 3、打开cmd命令行,进入mysql,创建两个表,一个是内存表,一个是新表,在内存表中添加数据(内存表中添加数据速度快2分50秒左右),然后将数据迁移新表(迁移速度也较快16秒左右): 代码如下: CREATE ...
  • 写给初学者,高手请忽略:有时我们需要Excel中的数据导入到数据库对应的表中,若是挨个编写SQL会非常繁琐,下面介绍如何一次性导入成千上万,乃至数十万条数据> Step1: 首先我们需要excel中的数据按照对应的...
  • pythonexcel表格数据写入数据库

    千次阅读 2019-05-27 18:48:42
    python3 + xlrd 话不多说,直接上代码 import xlrd import pymysql ...db = pymysql.connect('你的ip', 'root', '数据库密码', '数据库名', charset='utf8') cur = db.cursor() ex = xlrd.open...
  • 数据库如何快速插入百万条数据

    千次阅读 2019-07-18 22:45:18
    数据库如何快速插入百万条数据 ①在内存中创建一个表 CREATE TABLE `vote_record_memory` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NOT NULL, `vote_id` INT (11) NOT NULL, `...
  • 一批Txt的文本数据插入数据库数据量特别大,单个txt文件都有300多M,数据约200w多条,放在ssd盘上通过Notepad++打开都得加载将近5分钟左右(可能我的ssd硬盘比较烂)。 相关资料参考链接: 1.java连接mysql数据库...
  • 上一节介绍了Java将数据库表中数据导出至Excel表格,那么本节来介绍它的逆过程,也就是Excel表格中的数据逐行导入数据库中的表中,依然需要使用Apache的POI,上一节已经说过也附了这个jar包的下载地址,这一节就不...
  • 一、前言应本次数据库压力测试的要求,测试数据记录至少为千万级,所以,问题来了,如何快速插入大量数据.二、解决方法一第一种解决方法是在MySQL终端中实现的,具体方法如下. a.打开MySQl数据库;mysql -u root -pb...
  • 使用IDEA快速插入数据库数据的方法

    千次阅读 2019-09-25 14:02:51
    如上图所示:数据库创建表主键使用了自增列自增因此忽略,只有后两列非主键得数据,在数据较多得时候使用IDEA快捷键Ctrl+R键,快速查找替换。 转载于:https://www.cnblogs.com/zeussbook/p/8734335.html...
  • 下面为大家分享如何在数据库里面从一张表里面快速创建上万条数据,我使用的是Sql serve数据库,现在在数据库里面创建一个表。(随便建的) create table Info ( Id int primary key identity(1,1), Names nvarchar...
  • VB.NET+Access数据库实现数据的修改添加删除及数据库运算,帮助初学用户快速入门数据库开发 VB.NET+Access数据库实现数据的修改添加删除及数据库运算,帮助初学用户快速入门数据库开发
  • java把excel数据批量导入到数据库

    千次阅读 2015-05-25 15:12:52
    java把excel数据批量导入到数据库中,java导入excel数据代码如下 1. public List GetFromXls(String xlsname){ 2.  3. List choices = new ArrayList();  4. Choice choice=null; 5. try
  • 表备份之后,就是大量数据再重新导入到数据库中,由于我们用的是Oracle数据库,在此之前我曾查过好多方法去将数据导入到数据库,结果都失败,总是容易出现字段列和行对应不上,导致数据出错。 所以在excel...
  • 数据库索引

    千次阅读 多人点赞 2019-08-20 22:49:54
    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照...
  • 如何快速的向数据库中插入已知的1000万条数据 假设这1000W条数据在同一个集合里,那么这个集合进行遍历,循环1000W次,结合数据库编程技术,如JDBC,就可以插入数据库,这么简单的操作,显然不是正确答案..........
  • 主要方法是excel 单元格数据拼接,用你需要连接的符号用双引号引起来,然后再用&amp;把符号和数据拼接, 看如下图: ...然后直接复制到数据库,去掉最后一个的逗号,就可以在where语句中使用 ...
  • 数据库插入多条测试数据

    千次阅读 2019-05-14 18:08:15
    数据库插入多条测试数据 1.创建数据库 创建表 CREATE TABLE `device` ( `id` VARCHAR(32) DEFAULT NULL, `name` VARCHAR(32) DEFAULT NULL, `indexs` INT(11) DEFAULT NULL, `mac` VARCHAR(32) DEFAULT NULL,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 293,200
精华内容 117,280
关键字:

怎么快速将数据添加到数据库