如何使用Spring数据快速地以多对多关系添加/删除对象

时间:2018-08-09 17:54:02

标签: java mysql spring spring-data-jpa spring-data

我的问题是这个。我有2个名为SeedRecordAffiliateLink的对象。两者彼此之间具有ManyToMany关系。会员链接基于用户可用来表征会员链接产品的一组关键字与种子记录链接。例如。如果会员链接产品对tomatocucumberbellpepperClimbing plant有用。然后,在创建AffiliateLink对象的过程中,将其链接到所有具有这些关键字之一作为特征的种子记录。因此,例如,如果特定种子记录的列CropName的值是tomato,则会将同盟链接添加到其集合中。

如果数据集很小,这很好,但是如果有超过2000个种子记录,其中200个具有特征tomato,则在正确的种子记录上添加关联链接可能会变得很漫长。我的JpaRepository必须做200次保存,才能使affiliatelink与所有正确的seedrecords链接起来。这可能需要几分钟!

我认为如果不将200个小型保存查询发送到一个大型查询中,那么事情就会更快地分配,而不是向数据库发送200个小型保存查询。但是我不知道Spring Data是否可行。删除动作与保存动作一样迟钝。有谁知道一种更有效的方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

当我使用所有不同的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插入可连接对象