SQL: пакетные операторы со связанными переменными - PullRequest
1 голос
/ 04 марта 2009

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

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

  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. Так что это не проблема.

Какие-либо советы / предложения?

Ответы [ 3 ]

2 голосов
/ 04 марта 2009

Вот пример из руководства JDBC для Oracle. Это описывается как «стандартный» (не специфичный для 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 голос
/ 05 марта 2009

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

0 голосов
/ 04 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...