Mam coś takiego:
List<Data> dataList = stepts.stream()
.flatMap(step -> step.getPartialDataList().stream())
.collect(Collectors.toList());
Więc łączę w dataList wiele list z każdego kroku.
Mój problem polega na tym, że dataList może napotkać OutOfMemoryError . Jakieś sugestie, jak mogę wsadować dataList i zapisać partie w bazie danych?
Moim prymitywnym pomysłem jest:
for (Step step : steps) {
List<Data> partialDataList = step.getPartialDataList();
if (dataList.size() + partialDataList.size() <= MAXIMUM_SIZE) {
dataList.addAll(partialDataList);
} else {
saveIntoDb(dataList);
dataList = new ArrayList<>();
}
}
PS: Wiem, że jest ten post, ale różnica polega na tym, że mogę nie być w stanie przechowywać w pamięci całych danych.
LE: getPartialDataList bardziej przypomina createPartialDataList ()
1 odpowiedź
Jeśli Twoim problemem jest OutOfMemoryError
, prawdopodobnie nie powinieneś tworzyć dodatkowych pośrednich struktur danych, takich jak listy lub strumienie, przed zapisaniem w bazie danych.
Ponieważ Step.getPartialDataList()
już zwraca List<Data>
, dane są już w pamięci, chyba że masz własną implementację List
. Wystarczy użyć wstawiania wsadowego JDBC:
PreparedStatement ps = c.prepareStatement("INSERT INTO data VALUES (?, ?, ...)");
for (Step step : steps) {
for (Data data : step.getPartialDataList()) {
ps.setString(1, ...);
ps.setString(2, ...);
...
ps.addBatch();
}
}
ps.executeBatch();
Nie ma potrzeby wcześniejszego dzielenia na mniejsze partie dzięki dataList
. Najpierw sprawdź, co obsługuje Twoja baza danych i sterownik JDBC, zanim dokonasz przedwczesnych optymalizacji.
Należy pamiętać, że w przypadku większości baz danych właściwym sposobem wstawiania dużej ilości danych jest zewnętrzne narzędzie, a nie JDBC, np. JDBC. PostgreSQL ma COPY
.
getPartialDataList()
getPartialDataList()
Podobne pytania
Powiązane pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].
List<Data>
? Jak jest zaimplementowanygetPartialDataList
? Czy trzyma kursor nad odczytami z danych?