SQL:使用绑定变量批处理语句

时间:2009-03-04 13:42:33

标签: java jdbc

我希望减少应用程序中的往返次数以提高性能。我想使用PreparedStatement来获得众多好处。

这是我提出的一个例子......概括了详细信息......

  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();
  }

(同样,这不是实际的代码,只是一个简化的例子)

通常,我尝试在单个语句中执行多个insert / update语句以减少往返流量。这是一种有效的方法吗?还是有一种更为公认的方法?

我可以为一笔交易提供数千条报表。我可能会将语句分段为合理大小的块,以防止单个语句的执行超时。

我将支持多个数据库供应商,但将使用ANSI SQL,因此应该没有问题。如果需要,我可以利用我的DAL智能。所以,这不是问题。

任何提示/建议?

3 个答案:

答案 0 :(得分: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 :(得分:1)

顺便说一下,如果你关注性能,你应该考虑使用像dbcp这样的连接池包,它也支持PreparedStatement池。 c3p0也很受欢迎,但我对此没有任何经验。

答案 2 :(得分:0)

PreparedStatement支持使用addBatchexecutebatch批量提交具有不同参数的同一语句。我认为没有一种以跨数据库平台方式执行多个参数化语句的好方法。传统上,这将由[evil]存储过程处理。