这篇文章主要介绍如何使用Java实现大批量数据插入到MySQL数据库中,并给出了具体实现的教程和示例代码。下面是详细的攻略流程:
1. 数据准备
首先需要准备数据,可以是一组代表性数据样例集或随机生成的大规模数据,此处以随机生成数据为例。可以使用Java中的Random类来生成随机数据。
2. MySQL数据库连接
使用Java语言连接MySQL数据库,这里需要用到JDBC驱动程序和MySQL的JDBC连接URL。JDBC驱动程序可以从MySQL官网进行下载,而JDBC连接URL的格式为“jdbc:mysql://hostname:port/databaseName”。
3. 批量插入数据
使用JDBC的Statement或PreparedStatement类将生成的数据批量插入到MySQL数据库中。据介绍,使用PreparedStatement类相比Statement类的效率更高,所以建议优先使用后者。具体实现步骤如下:
- 创建连接mysql数据库的PreparedStatement对象。
Connection conn = DriverManager.getConnection(driverUrl, user, password);
PreparedStatement pst = conn.prepareStatement(sql);
- 设置insert语句的参数。
pst.setString(1, "name");
pst.setInt(2, 30);
pst.setDouble(3, 1000.0);
- 执行批量插入操作。
pst.addBatch();
pst.executeBatch();
4. 性能优化
在实际的批量插入操作中,可能遇到插入数据量过大、插入速度过慢的情况。为了提高效率,可以使用以下性能优化方法:
- 数据库开启事务,使用事务包裹批量插入操作,统一提交,可以减少事务提交的次数,提高处理效率。
- 对插入数据量很大的表使用分表技术,将表拆分成多个小表,减少单表的数据量,提高插入效率。
- 关闭数据库日志,防止在批量插入操作过程中由于频繁记录日志导致效率降低。
示例说明
示例1:批量生成数据并插入MySQL数据库
下面的示例演示了如何使用Java生成大批量的数据并插入到MySQL数据库中。
//准备数据
List<People> peopleList = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 100000; i++) {
People people = new People();
people.setName("name" + i);
people.setAge(random.nextInt(100));
people.setSalary(random.nextDouble() * 10000);
peopelList.add(people);
}
//创建连接和PreparedStatement对象
conn = DriverManager.getConnection(driverUrl, user, password);
String sql = "INSERT INTO people(name,age,salary) VALUES(?,?,?)";
PreparedStatement pst = conn.prepareStatement(sql);
//设置参数和执行批量插入操作
for (int i = 0; i < peopleList.size(); i++) {
People people = peopleList.get(i);
pst.setString(1, people.getName());
pst.setInt(2, people.getAge());
pst.setDouble(3, people.getSalary());
pst.addBatch();
if ((i + 1) % batchSize == 0) {
pst.executeBatch();
pst.clearBatch();
}
}
pst.executeBatch();
pst.clearBatch();
示例2:优化批量插入,提高效率
此示例是在示例1的基础上进行了性能优化的过程,主要通过设置事务回滚、关闭日志等方式提高插入效率。
conn = DriverManager.getConnection(driverUrl, user, password);
//设置自动提交为false,开启事务
conn.setAutoCommit(false);
//先做一些数据库的设置
Statement st = conn.createStatement();
st.execute("SET GLOBAL max_allowed_packet=1024*1024*100");
st.execute("SET unique_checks=0");
st.execute("SET foreign_key_checks=0");
st.execute("SET sql_log_bin=0");
st.execute("ALTER TABLE people DISABLE KEYS");
PreparedStatement pst = conn.prepareStatement(sql);
//设置参数和执行批量插入操作
for (int i = 0; i < peopleList.size(); i++) {
People people = peopleList.get(i);
pst.setString(1, people.getName());
pst.setInt(2, people.getAge());
pst.setDouble(3, people.getSalary());
pst.addBatch();
if ((i + 1) % batchSize == 0) {
pst.executeBatch();
pst.clearBatch();
}
}
pst.executeBatch();
pst.clearBatch();
//提交事务
conn.commit();
//恢复数据库的设置
st.execute("SET unique_checks=1");
st.execute("SET foreign_key_checks=1");
st.execute("SET sql_log_bin=1");
st.execute("ALTER TABLE people ENABLE KEYS");
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现几十万条数据插入实例教程(30万条数据插入MySQL仅需13秒) - Python技术站