2009-03-04 7 views
1

Я хочу уменьшить круговые поездки в своем приложении, чтобы повысить производительность. Я хочу использовать PreparedStatement с их множеством преимуществ.SQL: Операторы пакетной обработки с привязанными переменными

Это пример того, что я придумал .. обобщается с деталями Опущенные ..

Class.forName("..Driver"); 
    Connection connection = DriverManager.getConnection(..);  
    PreparedStatement statement = connection.prepareStatement("UPDATE Table SET XmlData = ? WHERE SomeGUID = ?; INSERT INTO SomeTable (Col1,Col2) VALUES (?, ?)"); 

    try{ 
    statement.setString(1, "<XmlData></XmlData>"); 
    statement.setString(2, "32ABD5-438B0-.."); 
    statement.setString(3, "ABC"); 
    statement.setString(4, "XYZ"); 
    statement.execute(); 
    connection.commit(); 
    } 
    catch { 
    connection.rollback(); 
    } 
    finally { 
    statement.close(); 
    connection.close(); 
    } 

(Опять же, это не фактический код, только упрощенный пример)

В общем, я пытаюсь выполнить несколько операторов вставки/обновления в одном заявлении, чтобы уменьшить трафик в оба конца. Это эффективный способ сделать это или есть более приемлемый подход?

У меня могло быть несколько тысяч заявлений для одной транзакции. Я, скорее всего, сегментирую заявление в блоках разумного размера, чтобы предотвратить таймауты при выполнении одного оператора.

Я буду поддерживать нескольких поставщиков БД, но будет использовать ANSI SQL, поэтому не должно быть проблем. Если необходимо, я могу использовать интеллектуальные возможности DAL. Таким образом, это не проблема.

Любые советы/предложения?

ответ

0

PreparedStatement поддерживает партию, представляющую ту же инструкцию с различными аргументами, используя addBatch и executebatch. Я не думаю, что есть хороший способ выполнения нескольких параметризованных операторов в кросс-платформе базы данных. Традиционно это будет обрабатываться [злыми] хранимыми процессами.

2

Вот пример руководства Oracle JDBC. Это описано как «стандартный» (не-Oracle-специфический) метод.

PreparedStatement pstmt = 
      conn.prepareStatement("INSERT INTO employees VALUES(?, ?)"); 

pstmt.setInt(1, 2000); 
pstmt.setString(2, "Milo Mumford"); 
pstmt.addBatch(); 

pstmt.setInt(1, 3000); 
pstmt.setString(2, "Sulu Simpson"); 
pstmt.addBatch(); 
... 
int[] updateCounts = pstmt.executeBatch(); 
1

Кстати, если вы, повторно обеспокоены Peformance, вы должны рассмотреть вопрос об использовании пула соединений пакета как dbcp который будет также поддерживать PreparedStatement пулы. c3p0 также популярен, но у меня нет опыта с ним.

Смежные вопросы