0

目前我遇到了一个问题,我需要提高对 Oracle19c 数据库的插入性能(也需要批量插入)。在某些情况下,我可以预期 250,000 条记录(每条记录代表一个实体)。将我的数据保存到数据库中需要将近 15 分钟,而我的计数只有 9000 个。需要这么长时间是有原因的吗?以及如何提高它的性能?下面是我的持久性逻辑以及我的实体类,以及设置为尝试帮助提高批量插入性能的休眠属性:

在我的休眠配置类中:

Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.default_schema", SCHEMA);
        properties.setProperty("hibernate.dialect", "com.myproject.db.oracle.CustomAppOracleDialect");
        properties.setProperty("hibernate.jdbc.batch_size", "50");
        properties.put("hibernate.order_inserts", "true");
        return properties;
    }

实体类:

@Entity
@Table(name = "PROMO")
public class InsertPromoData {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE1")
    @SequenceGenerator(name="SEQUENCE1", sequenceName="SEQ_PROMO", allocationSize=1)
    @Column(name="SEQ_NUM")
    long id;

    @Column(name="BATCH_ID")
    int batchID;

    @Column(name="ITEM")
    String item;
    
    @Column(name="LOC")
    String loc;
    
    @Column(name="WK_START", columnDefinition = "DATE")
    LocalDate weekStart;
    
    @Column(name="TYPE")
    int type;
    
    @Column(name="FCSTID")
    String forecastId;
    
    @Column(name="U_TIMESTAMP", columnDefinition = "TIMESTAMP")
    LocalDateTime insertTS;
    
    @Column(name="NUMBER_OF_WEEKS")
    int numberOfWeeks;
    
    @Column(name="QTY")
    double qty;
    
    //getters and setters
}

使用EntityManager的方法:

private static EntityManagerFactory emf;

public static void persistPromoData(List <InsertPromoData> insertData) {
        logger.debug("Execution of method insertPromoData in Dao started");
        EntityManager em = emf.createEntityManager();
        
        try {
            em.getTransaction().begin();
            int count = 0;
            for (InsertPromoData promoData : insertData) {
                em.persist(promoData);
                ++count;
                
                if (count % 1000 == 0) {
                    em.getTransaction().commit();
                    em.clear();
                    em.getTransaction().begin();
                }
            }           
            em.getTransaction().commit();
        }
        catch(Exception e) {
              e.printStackTrace();
              em.getTransaction().rollback();
        }
        finally {
            em.clear();
            em.close();
        }
}
4

0 回答 0