在Java中快速将数据导入到MySQL
在Java中快速将数据导入到MySQL
使用Java代码将大约500,000条记录从CSV文件插入到MySQL数据库需要多长时间?数据库托管在本地主机上。
表结构:AI id,| varchar(8) | datetime | int | varchar(2)
。我的代码需要在40分钟内插入70,000条记录。有没有更快的方法?
以下是我的代码的主要部分:
CsvReader pro ducts = new CsvReader(path); products.readHeaders(); stmt = con.createStatement(); String updateString = "INSERT INTO table (T_V1, date, T_V2, T_V3) VALUES (?,?,?,?)"; PreparedStatement preparedStatement = con.prepareStatement(updateString); while (products.readRecord()) { v1= products.get("V1"); date = format.parse(products.get("Date") + " " + products.get("Hour")); java.sql.Date dateDB = new java.sql.Date(data.getTime()); v2 = products.get("V2"); v3 = products.get("V3"); preparedStatement.setString(1, v1); preparedStatement.setDate(2,dateDB); preparedStatement.setInt(3, Integer.parseInt(v2)); preparedStatement.setString(4, v3); preparedStatement.executeUpdate(); }
根据您的建议,我将语句的创建移到了循环外。现在每秒有33个记录,之前只有29个记录。
问题的原因是用户需要将大量数据快速导入到MySQL中,并且要求使用Java进行操作。解决方法是通过使用MySQL的LOAD DATA
语句来实现快速导入数据,同时使用Java来执行该语句。
下面是整理后的文章:
用户需要将大量数据快速导入到MySQL中,并要求使用Java进行操作。有一种方法可以实现这个目标,即使用MySQL的LOAD DATA
语句。这个语句可以避免目前的许多繁琐操作,假设在将数据插入MySQL之前需要对每一行进行处理。
在Java中,可以使用原始的JDBC来执行LOAD DATA
语句。但是,有人明确要求通过Java来实现导入数据的解决方案。
有人可能会认为,如果不需要改变文件结构,这种方法就没有用处。确实如此,如果需要对原始数据进行处理,那么使用Java可能是最好的方法。
用户在评论中确认需要使用Java来解决问题。
结果证明,这种方法是可行的!加载47万条记录只用了17秒!
很高兴能够帮上忙。需要注意的是,在某些情况下,您可能需要在导入数据之前对数据进行处理,其他周到的答案可能在这种情况下有用。
快速将数据导入到MySQL中的Java问题的出现是因为单个插入和批量插入的效率问题。解决方法是使用批量插入。
批量插入是指将多个数据一次性插入到数据库中,而不是每次插入一条数据。这样可以减少与数据库的交互次数,从而提高插入数据的效率。
在Java中,可以使用PreparedStatement的addBatch()方法和executeBatch()方法来实现批量插入。首先,创建PreparedStatement对象,并设置插入语句和参数。然后,调用addBatch()方法将参数添加到批处理中。接着,可以继续设置下一组参数并调用addBatch()方法。最后,调用executeBatch()方法执行批处理,并返回一个int数组,表示每个批处理的插入结果。
以下是示例代码:
PreparedStatement prepStmt = con.prepareStatement("Insert query"); prepStmt.setString(1, parameter1); prepStmt.addBatch(); // for next set of parameter prepStmt.setString(1, parameter2); prepStmt.addBatch(); int[] numUpdates = prepStmt.executeBatch();
通过上述方法,可以快速将数据批量插入到MySQL中。
如果想了解更多关于批量插入的信息,可以参考以下链接:
- [Which is faster: multiple single INSERTs or one multiple-row INSERT?](https://stackoverflow.com/questions/1793169)
- [How to do a batch insert in MySQL](https://stackoverflow.com/questions/5526917)
批量插入是提高数据导入效率的常用方法,特别适用于大规模数据导入的场景。通过使用批量插入,可以减少与数据库的交互次数,从而显著提高数据导入的速度。
问题的原因是在while循环中创建PreparedStatement,导致每次循环都会创建一个新的PreparedStatement,造成了性能上的损耗。解决方法是在循环外部创建PreparedStatement,并在循环中设置参数值。
此外,还需要在一定数量的行插入后进行提交操作,以避免内存溢出的问题。另外,如果插入速度较慢,可能是网络连接速度较慢导致的。
文章内容如下:
为了在Java中快速将数据导入到MySQL数据库中,可以通过在循环之外创建PreparedStatement,并在循环中设置参数值来提高性能。具体代码如下:
String updateString = "INSERT INTO table (T_V1, date, T_V2, T_V3) VALUES (?,?,?,?)"; PreparedStatement preparedStatement = con.prepareStatement(updateString); while (products.readRecord()) { v1 = products.get("V1"); date = format.parse(products.get("Date") + " " + products.get("Hour")); java.sql.Date dateDB = new java.sql.Date(data.getTime()); v2 = products.get("V2"); v3 = products.get("V3"); preparedStatement.setString(1, v1); preparedStatement.setDate(2, dateDB); preparedStatement.setInt(3, Integer.parseInt(v2)); preparedStatement.setString(4, v3); preparedStatement.executeUpdate(); }
此外,为了避免内存溢出问题,需要在插入一定数量的行后进行提交操作。另外,如果插入速度较慢,可能是由于网络连接速度较慢导致的。如果数据库是本地的,可以排除网络连接问题。否则,需要检查网络连接速度。
通过将PreparedStatement对象的创建移到循环之外并在循环中设置参数值,可以显著提高数据导入的性能。另外,适时进行提交操作和检查网络连接速度也是保证数据导入效率的关键。