目前我遇到了一个问题,我需要提高对 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();
}
}