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

5f0d552i  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(264)

我的问题是这个。我有两个物体叫做 SeedRecord 以及 AffiliateLink . 两者之间有着千丝万缕的联系。affiliatelinks基于一组关键字与seedrecords链接,用户可以使用这些关键字来描述affiliatelink产品的特征。例如。如果affiliatelink产品对 tomato , cucumber , bellpepper 以及 Climbing plant . 然后在创建affiliatelink对象的过程中,它链接到所有以这些关键字之一为特征的seedrecords。例如,如果列的值 CropName 一个特定的种子记录是 tomato 然后,affiliatelink将被添加到其集合中。
如果数据集很小,这一切都可以,但是如果有超过2000个seedrecords(其中200个具有此特征),则向右侧seedrecords添加affiliatelink可能会变得非常滞后 tomato . 我的 JpaRepository 将不得不做200保存只是为了得到与所有适当的种子记录链接的附属链接。这可能需要几分钟!
我想,如果我能将所有的保存操作放在一个大查询中,那么分配的速度会更快,而不是向数据库发送200个小的保存查询。但我不知道用spring数据是否可能。删除操作和保存操作一样滞后。有人知道更有效的方法吗?
谢谢您。

f1tvaqid

f1tvaqid1#

我已经成功地将使用所有不同的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;
}

编辑:我只在jointable中插入seedrecords的id和affiliate id

相关问题