2010-08-08 14 views
5

Jaki jest najlepszy/najbardziej efektywny czasowo sposób na wstawienie 1000 wierszy do jednej tabeli (baza danych jdbc/connector-mysql)? (jest to bufor i należy go zrzucać do bazy danych za każdym razem, gdy jest pełny)Wydajne wielokrotne wstawianie SQL

1- Jedna generowana automatycznie/skonkursowana instrukcja SQL?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3- procedury przechowywanej?

4- masowe wprowadzanie danych za pośrednictwem pliku?

5- (rozwiązanie)

Odpowiedz

2

The LOAD DATA INFILE statement to prawdopodobnie najlepszy wybór dla wydajności. (# 4 z powyższej listy opcji) Chociaż prawdopodobnie zajmie więcej kodu, aby wykonać swoje zadanie, ponieważ musisz utworzyć plik pośredni, pobierz go na serwer, a następnie wywołaj DANE LOADOWE, aby pobrać je do bazy danych.

stron MySql Pomoc zacytować:

oświadczenie LOAD DATA plik_we czyta wiersze z pliku tekstowego do tabeli w bardzo dużą prędkością.

+0

Używaj tego podejścia z rozwagą. Widziałem systemy, które zrobiły to w przeszłości, a koszt utworzenia pliku pośredniego i wysłania go na serwer przewyższył możliwości związane z wydajnością korzystania z operacji szybkiego ładowania plików. –

+0

Wygląda to bardzo niebezpiecznie, ponieważ mamy dwa serwery aplikacji jednocześnie uzyskujące dostęp do tej samej bazy danych. Naprawdę obawiałem się tej odpowiedzi. Dziękuję wszystkim za odpowiedź. –

0

JDBC można używać wkładek wsadowych.

PreparedStatement ps = cn.prepareStatement("INSERT INTO...."); 

for (int i = 0; i < 1000; i++) { 
    ps.setString(1, "value-" + i); // Set values 
    ps.addBatch();     // Add this to the batch 
    ps.clearParameters();   // Reset the parameters 
} 

ps.executeBatch(); 

Jednak MySQL nie obsługuje funkcji insert partia natywnie, tak, aby uzyskać wystarczającą wydajność, trzeba będzie dodać rewriteBatchedStatements=true do konfiguracji mysql JDBC.

Istnieje również specyficzna dla MySQL składnia wsadowa wsadowa, której można użyć, jeśli chcesz utworzyć duży ciąg SQL. Chciałbym wypróbować oba i przetestować wydajność.

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

Zachowaj ostrożność przy obu podejściach, ponieważ możesz przekroczyć maksymalny rozmiar pakietu dla pojedynczego żądania. Może być konieczne ustawienie rozmiaru wsadu, który różni się od liczby wpisów w buforze. Na przykład. może być konieczne podzielenie 1000 wpisów na 10 partiach po 100.

0

Należy pamiętać, że JDBC automatycznie zatwierdza po każdym wyciągu, chyba że wyraźnie powiesz, że nie. Robiąc to i uruchamiając wstawki X przed uruchomieniem zatwierdzenia, powinno się poprawić nieco wydajność.

+0

Zapomniałem napisać, że używałem c3p0. więc muszę zobowiązać się na końcu. –

Powiązane problemy