gpt4 book ai didi

java - 使用 JDBC 优化 SQLite 数据库的插入

转载 作者:行者123 更新时间:2023-12-01 17:44:55 25 4
gpt4 key购买 nike

我正在为一个类项目编写 java http 服务器的后端,并且必须使用 jdbc 将一些记录插入到数据库中。目前,我一次的最大插入次数为 122,执行时间高达 18.7 秒,大约每秒 6.5 次插入。这是非常慢的,因为服务器需要能够在 5 秒之内响应插入记录的请求,而真正的服务器预计会快很多倍。我很确定这与代码或我的表模式声明有关,但我似乎无法在任何地方找到瓶颈。表架构如下所示:

CREATE TABLE Events (
ID varchar(38) primary key,
ownerName varchar(32) not null,
personID varchar(38) not null,
latitude float not null,
longitude float not null,
country varchar(64) not null,
city varchar(128) not null,
eventType varchar(8) not null,
year int not null,
foreign key (ownerName)
references Users (userName)
on delete cascade
on update cascade,
foreign key (ID)
references People (ID)
on delete cascade
on update cascade
);

执行插入的代码是以下函数

public class EventAccessor {
private Connection handle;
...

public void insert(Event event) throws DataInsertException {
String query = "insert into Events(ID,ownerName,personID,latitude,longitude,country,"
+ "city,eventType,year)\nvalues(?,?,?,?,?,?,?,?,?)";

try (PreparedStatement stmt = handle.prepareStatement(query)) {
stmt.setString(1, event.getID());
stmt.setString(2, event.getUsername());
stmt.setString(3, event.getPersonID());
stmt.setDouble(4, event.getLatitude());
stmt.setDouble(5, event.getLongitude());
stmt.setString(6, event.getCountry());
stmt.setString(7, event.getCity());
stmt.setString(8, event.getType());
stmt.setInt(9, event.getYear());

stmt.executeUpdate();
} catch (SQLException e) {
throw new DataInsertException(e.getMessage(), e);
}
}
}

其中,Event 是一个包含架构条目的类,DataInsertionException 是在 API 中其他位置定义的简单异常。我被指示使用 PreparedStatement 因为它显然比使用 Statement “更安全”,但我可以选择切换,所以如果它更快,我会很乐意更改代码。我用来插入 122 个条目的函数实际上是 Event 对象数组的包装器,如下所示

void insertEvents(Event[] events) throws DataInsertException {
for (Event e : events) {
insert(e);
}
}

此时我愿意尝试任何方法来提高性能。

最佳答案

我使用 connection.setAutoCommit(false) 禁用了 JDBC 连接上的自动提交,性能提高了 1000 倍以上。新的基准测试显示,插入 122 条记录仅用了 0.008265739 秒就完成了,速度约为每秒 14,000 次插入,这更接近我的预期。

关于java - 使用 JDBC 优化 SQLite 数据库的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60879538/

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