我正在尝试将CSV文件中的一些数据加载到干净的数据库实例中。我通过使用Apache Camel创建ETL过程来完成此操作,它读取输入CSV将文件拆分为多行并使用每行一个事务并行处理每一行。
类ImportRouteBuilder扩展了RouteBuilder {
private final Importer importer
private final String endpoint
public ImportRouteBuilder(Importer importer, String endpoint) {
this.endpoint = endpoint
this.importer = importer
}
@Override
void configure() throws Exception {
from(endpoint)
.unmarshal(buildCsvDataFormat())
.split(body())
.parallelProcessing()
.bean(importer)
}
private static CsvDataFormat buildCsvDataFormat() {
CsvDataFormat csv = new CsvDataFormat();
csv.skipHeaderRecord = true
csv
}
}
@Slf4j
@Service
class CountryCsvImporter implements Importer {
@Autowired
private CountryRepository countryRepository
@Autowired
private Session session
@Override
void process(List record) {
Transaction tx = session.beginTransaction();
try {
importCountry(record)
tx.commit()
}catch (Throwable t) {
tx.rollback()
}
tx.close()
}
我之所以这样做,是因为在我的模型仍在不断发展时不想使用LOAD CSV cypher或Neo4j导入工具,因为在原型设计时使用OGM非常方便。但是现在我在流程的中间找到了一个墙,OGM生成了这个 TransactionManagerException ,看起来这是管理事务的一些线程问题。
在com.cartrawler.service.CountryImportSpecification.Should能够导入国家csv(CountryImportSpecification.groovy:9) 引起: org.neo4j.ogm.exception.TransactionManagerException:此线程的交易不是最新的 at org.neo4j.ogm.session.transaction.DefaultTransactionManager.rollback(DefaultTransactionManager.java:78) 在org.neo4j.ogm.transaction.AbstractTransaction.rollback(AbstractTransaction.java:65) at org.neo4j.ogm.drivers.embedded.transaction.EmbeddedTransaction.rollback(EmbeddedTransaction.java:60) 在com.cartrawler.service.CountryCsvImporter.process(CountryCsvImporter.groovy:28)
谢天谢地,谢天谢地 路易斯奥斯卡
答案 0 :(得分:1)
关闭并行处理,因为事务只是单线程。