我需要从每日CSV文件中消耗大量数据.CSV包含大约120K条记录.使用hibernate时,这会慢慢爬行.基本上,当使用saveOrUpdate()时,似乎hibernate在每个INSERT(或UPDATE)之前都在执行SELECT; 对于使用saveOrUpdate()持久化的每个实例,在实际INSERT或UPDATE之前发出SELECT.我可以理解它为什么会这样做,但它对于进行批量处理非常低效,而且我正在寻找替代方案
我确信性能问题在于我使用hibernate的方式,因为我有另一个版本使用本机SQL(以相同的方式解析CSV)以及围绕这个新版本的字面运行圈子)
那么,对于实际问题,是否存在一个hibernate替代mysqls"INSERT ... ON DUPLICATE"语法?
或者,如果我选择为此执行本机SQL,我可以在hibernate事务中执行本机SQL吗?意思是,它会支持提交/回滚吗?
我有一些执行UPSERT的代码,也称为Merge。我想清理这段代码,具体地说,我想摆脱异常处理,并为这种简单的操作降低代码的整体冗长性和纯粹的复杂性。要求是插入每个项目,除非它已经存在:
public void batchInsert(IncomingItem[] items) {
try(Session session = sessionFactory.openSession()) {
batchInsert(session, items);
}
catch(PersistenceException e) {
if(e.getCause() instanceof ConstraintViolationException) {
logger.warn("attempting to recover from constraint violation");
DateTimeFormatter dbFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
items = Arrays.stream(items).filter(item -> {
int n = db.queryForObject("select count(*) from rets where source = ? and systemid = ? and updtdate = ?::timestamp",
Integer.class,
item.getSource().name(), item.getSystemID(),
dbFormat.format(item.getUpdtDateObj()));
if(n != 0) {
logger.warn("REMOVED DUPLICATE: " +
item.getSource() + " " + item.getSystemID() + " " + …Run Code Online (Sandbox Code Playgroud)