2013-06-21 17 views
5

Mamy aplikację napisaną w języku C i Pro * C, która wstawia dane z plików dziennika do bazy danych Oracle 11.2 za pomocą macierzy hostów i wstawiania zbiorczego. Korzysta z podpowiedzi APPEND i NOLOGGING, aby skorzystać z bezpośredniego wstawiania ścieżek i zredukować ilość generowanych powtórzeń. NOLOGGING ma sens, ponieważ jest to tymczasowa tabela pomostowa, a dane można odzyskać z plików dziennika w razie potrzeby.Czy można używać bezpośredniego wstawiania ścieżek za pomocą JDBC/Java?

Próbujemy powielić tę funkcję w Javie, ale nie możemy użyć bezpośredniego wstawiania ścieżek dużej liczby rekordów. Czy to możliwe z Java/JDBC?

Rzeczy, które próbowałem i badane są:

  • JDBC jednostkowe (zarówno standardowe dozowanie i Oracle's extensions). Takie podejście pozwala zaoszczędzić czas podróży w obie strony, ale jest to nieistotne, ponieważ aplikacja znajduje się na tym samym komputerze co baza danych. Nie używa również bezpośredniej ścieżki.
  • Podpowiedź APPEND_VALUES. Brzmi to obiecująco, ale nie ma większego sensu, ponieważ grupowanie JDBC nie wydaje się faktycznie wykonywać wstawki "tablicowej" wielu rekordów.

Z tego co rozumiem, bezpośrednie wstawianie ścieżek obsługuje tylko the subquery syntax and not the VALUES clause. Nie można tego użyć, ponieważ dane do wstawienia nie istnieją jeszcze w bazie danych.

Nie mogę znaleźć żadnego odniesienia do Javy, która może używać ładowania w stylu tablicy hosta używanej przez Pro * C.

Odkładając na bok, sprawdzamy obciążenie zewnętrznego stołu lub programu ładującego SQL * i doceniamy, że narzędzia te umożliwiają bezpośrednie ładowanie ścieżek, ale to pytanie polega na uzyskaniu ostatecznej odpowiedzi na pytanie, czy bezpośrednie wstawianie ścieżek jest możliwe nawet z Javy . Zrozumienie ograniczeń Java API jest przydatne nie tylko dla tego projektu, ale także dla przyszłych projektów.

Aby powtórzyć pytanie, czy istnieje sposób, w jaki mogę skorzystać z bezpośredniego wstawiania ścieżek z Java?

Powiązane pytanie:

+0

Znalazłeś sposób bezpośredniego wstawiania przez jdbc? – Denis

+0

Nie, nie wygląda na to, że jest to możliwe. ładowanie ścieżki i jej równoległość. Nadal mam nadzieję, że ktoś przyjdzie i wskaże coś, co przeoczyłem. –

+0

Widzę, że smb był w stanie go przetestować, jednak nie przydałoby się to w jego przypadku: http://asanga-pradeep.blogspot.com/2014/10/appendvalues-hint-and-jdbc.html – Denis

Odpowiedz

0

dokumentacji Oracle jasno stwierdza to:

If you are performing an INSERT with the VALUES clause, specify the APPEND_VALUES hint in 
each INSERT statement immediately after the INSERT keyword. Direct-path INSERT with the VALUES 
clause is best used when there are hundreds of thousands or millions of rows to load. The 
    typical usage scenario is for array inserts using OCI. Another usage scenario might be inserts in a FORALL statement in PL/SQL 

.

Więc odpowiedź na twoje pytanie jest wskazówka APPEND_VALUES. W twoim poście widzę, że próbowałeś, ale nie potrafisz rozpoznać, z czym masz do czynienia.

Również to stwierdzenie w twoim poście jest nieprawidłowe "Z tego co rozumiem, bezpośrednie wstawianie ścieżek obsługuje tylko składnię podkwerendy, a nie klauzulę VALUES."Dokumentacja Oracle daje ten przykład:

Poniższy kod PL/SQL fragment jest przykładem stosując APPEND_VALUES Podpowiedź:

FORALL i IN 1..numrecords 
    INSERT /*+ APPEND_VALUES */ INTO orderdata 
    VALUES(ordernum(i), custid(i), orderdate(i),shipmode(i), paymentid(i)); 
COMMIT; 

link do dokumentacji Wyrocznia: kod http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables004.htm#i1009100

próbki:

dbConnection.setAutoCommit(false);//commit trasaction manually 

String insertTableSQL = "INSERT /*+ APPEND_VALUES */ INTO DBUSER" 
      + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES" 
      + "(?,?,?,?)";    
PreparedStatement = dbConnection.prepareStatement(insertTableSQL); 

preparedStatement.setInt(1, 101); 
preparedStatement.setString(2, "test1"); 
preparedStatement.setString(3, "system"); 
preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
preparedStatement.addBatch(); 

preparedStatement.setInt(1, 102); 
preparedStatement.setString(2, "test2"); 
preparedStatement.setString(3, "system"); 
preparedStatement.setTimestamp(4, getCurrentTimeStamp()); 
preparedStatement.addBatch(); 
preparedStatement.executeBatch(); 

dbConnection.commit(); 
+1

Próbowałem to i nie wywołuje wstawiania ścieżki bezpośredniej, ponieważ wciąż wstawiasz tylko jeden rekord na raz, a nie tablicę (jak wspomniano w OP i jak pokazano w przykładzie PL/SQL). –

Powiązane problemy