如果导入的数据在万条以上,项目中生成的导入功能数据在万条以上会变得非常慢,然后优化了一下,经测试,几万的数据在10秒内成功导入。感觉还是有需要优化的地方,时间精力有限,有优化的希望多交流交流。上代码:
- package com.jh5bframework.test.testdemo;
- /**
- * 批量导入功能优化(万条以上)
- */
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import org.apache.commons.lang3.StringUtils;
- import org.junit.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.jdbc.core.JdbcTemplate;
- public class TestDemo {
- @Autowired
- private JdbcTemplate jt;
- @Test
- public void test1() {
- String sql = "INSERT INTO test_import(id,name) VALUES";// 假设表test_import中有两个字段id和name
- List<String[]> liststr = new ArrayList<String[]>();
- int listSize = 12;// 定义要插入数据的总条数
- String[] str = null;
- for (int i = 0; i < listSize; i++) {
- str = new String[2];// 假设有两个字段
- str[0] = i + "";// 对第一个字段赋值
- str[1] = "name" + i;// 对第二个字段赋值
- liststr.add(str);
- }
- System.out.println("liststr:" + liststr);
- System.out.println("开始时间:" + new Date());
- dataBatchInsertToMysqlDao(sql, liststr);
- System.out.println("结束时间:" + new Date());
- }
- /**
- * 数据批量插入Mysql
- */
- public int dataBatchInsertToMysqlDao(String sql, List<String[]> list) {
- try {
- int x = list.size() / 10000;
- int y = 0;
- String strb;
- StringBuffer strb1 = null;
- if (x < 2) {
- strb1 = new StringBuffer(sql);
- for (int i = 0; i < list.size(); i++) {
- String[] str = list.get(i);
- strb = "('" + StringUtils.join(str, "','") + "',";
- strb1.append(strb.substring(0, strb.length() - 1) + "),");
- }
- System.out.println("sql:"+strb1.substring(0, strb1.length() - 1));
- return jt.update(strb1.substring(0, strb1.length() - 1));
- } else {
- for (int k = 0; k < x; k++) {// 2万条以上的数据先插入整数万条
- strb1 = new StringBuffer(sql);
- for (int i = k * 10000; i < (k + 1) * 10000; i++) {
- String[] str = list.get(i);
- strb = "('" + StringUtils.join(str, "','") + "',";
- strb1.append(strb.substring(0, strb.length() - 1)
- + "),");
- }
- System.out.println("sql:"
- + strb1.substring(0, strb1.length() - 1));
- y += jt.update(strb1.substring(0, strb1.length() - 1));
- }
- if (list.size() > y) {// 对整万剩下的数据进行插入
- strb1 = new StringBuffer(sql);
- for (int k = y; k < list.size(); k++) {
- String[] str = list.get(k);
- strb = "('" + StringUtils.join(str, "','") + "',";
- strb1.append(strb.substring(0, strb.length() - 1)
- + "),");
- }
- y += jt.update(strb1.substring(0, strb1.length() - 1));
- }
- return y;
- }
- } catch (Exception e) {
- return 0;
- }
- }
- }
配置文件中修改:
- <!-- 数据源配置, 使用应用服务器的数据库连接池
- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/jh5bframework" />-->
- <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
- <property name="dataSource" ref="dataSource">
- </property>
- </bean>
代码中调用StringUtils.join()方法需要使用commons-lang3-3.3.2.jar这个包。这个实际上是导入Excel表格,读取其中的数据,并将数据插入到Mysql数据库中代码的一部分,这里我省略了读取excel表格中的数据这部分。
转载地址:http://blog.csdn.net/qq_16497617/article/details/52462051