gpt4 book ai didi

java - 如何使用 Spring 数据快速添加/删除多对多关系中的对象

转载 作者:行者123 更新时间:2023-11-29 17:13:19 25 4
gpt4 key购买 nike

我的问题是这样的。我有 2 个名为 SeedRecordAffiliateLink 的对象。两者之间存在多对多关系。联属链接根据​​一组关键字与种子记录链接,用户可以使用这些关键字来描述联属链接产品的特征。例如。如果附属链接产品对番茄 cucumber 甜椒攀缘植物有用。然后,在创建 AffiliateLink 对象期间,它将链接到以这些关键字之一作为特征的所有种子记录。例如,如果特定种子记录的 CropName 列的值为 tomato,则附属链接将添加到其集合中。

如果数据集很小,这一切都很好,但如果有超过 2000 个种子记录,其中 200 个具有 tomato 特征,则向正确的种子记录添加附属链接可能会变得非常滞后。我的 JpaRepository 必须进行 200 次保存才能将附属链接与所有正确的种子记录链接起来。这可能需要几分钟!

我认为,如果我可以将所有保存操作放在一个大查询中,而不是向数据库发送 200 个小型保存查询,事情会分配得更快。但我不知道 Spring Data 是否可以做到这一点。删除操作与保存操作一样缓慢。有谁知道更有效的方法吗?

谢谢。

最佳答案

嗯,我已经成功地将使用所有不同的 jparepository 保存方法时的时间从 5 到 10 秒减少到使用 JDBC 批量插入的 1.5 到 2 秒!

这是我的代码,如果有人感兴趣的话:

@Autowired
private DataSource dataSource;

if (!affiliateLinkOwners.isEmpty()) {
Connection connection = null;
try {
connection = dataSource.getConnection();
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO seedrecord_affiliatelink (SEEDRECORD_ID, AFFILIATE_ID) VALUES (?,?)");
for(long id: affiliateLinkOwners)
{
preparedStatement.setLong(1,id);
preparedStatement.setLong(2,affiliateLink.getId());
preparedStatement.addBatch();
}

preparedStatement.executeBatch();
connection.commit();
preparedStatement.close();
connection.close();
log.info(affiliateLinkOwners +"");
log.info("the id is " + affiliateLink.getId());
} catch (SQLException e) {
e.printStackTrace();
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}

这是自动连接的数据源本身:

@Bean(destroyMethod = "close")
public DataSource seedDataSource(){
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(driver);
hikariConfig.setJdbcUrl(dataBaseUrl);
hikariConfig.setUsername(userName);
hikariConfig.setPassword(password);
hikariConfig.setMaximumPoolSize(5);
hikariConfig.setConnectionTestQuery("SELECT 1");
hikariConfig.setPoolName("springHikariCP");
hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}

编辑:我仅将种子记录的 ID 和联属 ID 插入可连接中

关于java - 如何使用 Spring 数据快速添加/删除多对多关系中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773194/

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