Я пытаюсь загрузить некоторые данные из файла CSV в чистый экземпляр БД. Я сделал это, создав процесс ETL с использованием Apache Camel, он читает входной 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, похоже, это была какая-то проблема с потоками, управляющая транзакциями.
at com.cartrawler.service.CountryImportSpecification. Должна иметь возможность импортировать csv страны (CountryImportSpecification.groovy:9) Причина: org.neo4j.ogm.exception.TransactionManagerException: транзакция не является текущей для этого потока< /em> на org.neo4j.ogm.session.transaction.DefaultTransactionManager.rollback(DefaultTransactionManager.java:78) на org.neo4j.ogm.transaction.AbstractTransaction.rollback(AbstractTransaction.java:65) на org. neo4j.ogm.drivers.embedded.transaction.EmbeddedTransaction.rollback(EmbeddedTransaction.java:60) в com.cartrawler.service.CountryCsvImporter.process(CountryCsvImporter.groovy:28)
Спасибо, любезно Луис Оскар