gpt4 book ai didi

Java-多线程以提高将数据插入数据库的性能

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:41 30 4
gpt4 key购买 nike

我正在MYSQL中的一个表上建立一个索引表(倒排文件)。它的工作方式是从文件中提取所有单词并将它们存储到哈希集,然后将单词一个一个地插入到我的数据库表中。

它工作得很好,我知道倒排文件确实需要一些时间来建立索引表。我正在尝试优化表的索引时间,并且正在考虑使用多线程。它会加快性能吗?

但是,我不太确定如何将它与我当前的程序集成,因为我是多线程的新手。

代码:

public static void main(String[] args) throws Exception {

StopWatch stopwatch = new StopWatch();
stopwatch.start();



File folder = new File("D:\\PDF1");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
if (file.isFile()) {
HashSet<String> uniqueWords = new HashSet<>();
String path = "D:\\PDF1\\" + file.getName();
try (PDDocument document = PDDocument.load(new File(path))) {

if (!document.isEncrypted()) {

PDFTextStripper tStripper = new PDFTextStripper();
String pdfFileInText = tStripper.getText(document);
String lines[] = pdfFileInText.split("\\r?\\n");
for (String line : lines) {
String[] words = line.split(" ");

for (String word : words) {
uniqueWords.add(word)
;

}

}
// System.out.println(uniqueWords);

}
} catch (IOException e) {
System.err.println("Exception while trying to read pdf document - " + e);
}
Object[] words = uniqueWords.toArray();



MysqlAccessIndex connection = new MysqlAccessIndex();

for(int i = 1 ; i <= words.length - 1 ; i++ ) {

connection.readDataBase(path, words[i].toString());

}

System.out.println("Completed");

}
}

MySQL 连接:

public class MysqlAccessIndex {
public Connection connect = null;
public Statement statement = null;
public PreparedStatement preparedStatement = null;
public ResultSet resultSet = null;

public void connect() throws Exception {
// This will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
connect = DriverManager
.getConnection("jdbc:mysql://126.32.3.20/fulltext_ltat?"
+ "user=root&password=root");

// Statements allow to issue SQL queries to the database
statement = connect.createStatement();
System.out.print("Connected");

}
public MysqlAccessIndex() throws Exception {

connect();
}


public void readDataBase(String path,String word) throws Exception {
try {

// Result set get the result of the SQL query


// This will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
connect = DriverManager
.getConnection("jdbc:mysql://126.32.3.20/fulltext_ltat?"
+ "user=root&password=root");

// Statements allow to issue SQL queries to the database
statement = connect.createStatement();
System.out.print("Connected");
// Result set get the result of the SQL query

preparedStatement = connect
.prepareStatement("insert IGNORE into fulltext_ltat.indextable values (default,?, ?) ");

preparedStatement.setString( 1, path);
preparedStatement.setString(2, word);
preparedStatement.executeUpdate();
// resultSet = statement
//.executeQuery("select * from fulltext_ltat.index_detail");



// writeResultSet(resultSet);
} catch (Exception e) {
throw e;
} finally {
close();
}

}

如有任何指点,我将不胜感激。

最佳答案

不,将数据推送到具有多个线程的数据库通常不会加快任何速度。

请尝试以下操作:

[1] 批量添加数据时,请使用您的数据库引擎提供的批量添加数据原语。我不知道 mysql 是否支持这个,以及如何从 java 中做到这一点。例如,在 postgres 中,您将使用 COPY 而不是 INSERT。

[2] 特别是如果您不能使用 COPY 或类似功能,请关闭所有索引(删除它们),然后执行所有插入,然后添加索引,这比先创建索引然后插入要快。

[3] 使用事务,每大约 100 次插入就提交一次事务。在大多数情况下,这比每次插入后提交更快,也比数十万次后提交更快。

[4] 开始得更早。在您的示例代码中,您可以立即开始插入,而不是先将所有数据填充到哈希集中,然后再添加。

[5] 不要一直做准备好的陈述;重复使用同一个。

[6] 你做了一个声明,两次,什么都不做。不;你在浪费资源。

[7] preparedstatements 需要关闭。你没有关闭它们。这可能会大大减慢速度。不要做那么多(应该做一个),用完就关掉。搜索“ARM”,这是一个 java 构造,可以轻松正确地关闭资源。到现在已经 10 多年了。

关于Java-多线程以提高将数据插入数据库的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53000725/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com