Java PreparedStatement与Oracle的效率?

Java PreparedStatement与Oracle的效率?,java,sql,oracle,sqlexception,Java,Sql,Oracle,Sqlexception,我正在开发一个应用程序,它将从远程Web服务中提取数据,然后将数据推送到Oracle数据库 现在,数据是基于事件的,因此可以是插入/更新或删除。为此,我创建了preparedStatement的单个对象&然后根据事件类型,代码创建一个字符串并将其分配给preparedStatement 现在,对于每个检索到的事件,oracle上的表名可能会改变&因此查询也会改变,因此在检索每个事件之后,将根据执行操作的表创建一个字符串,然后将其传递给preparedStatement对象并执行 但是,我有两个问

我正在开发一个应用程序,它将从远程Web服务中提取数据,然后将数据推送到Oracle数据库

现在,数据是基于事件的,因此可以是插入/更新或删除。为此,我创建了preparedStatement的单个对象&然后根据事件类型,代码创建一个字符串并将其分配给preparedStatement

现在,对于每个检索到的事件,oracle上的表名可能会改变&因此查询也会改变,因此在检索每个事件之后,将根据执行操作的表创建一个字符串,然后将其传递给preparedStatement对象并执行

但是,我有两个问题-

我想,我并没有有效地使用preparedStatement,因为每次查询更改时都不确定preparedStatement的Db缓存机制在这种情况下是否会有很大帮助

此外,我的所有语句都是INSERT、UPDATE或DELETE,因此我使用pstmt.executeUpdate,现在它返回受操作影响的行数。但是,我得到了最大的开放游标扩展错误。。。我读了很多线程&由于我的语句不返回resultset,在每次操作后关闭preparedstatement是没有效率的,我不确定该如何处理这个错误。我可以增加以DB为单位的打开游标计数,但这不会成为应用程序修复,因为这可能只会延迟错误,直到遇到错误场景

getEvents

for ( i = 0 -> lastevent)
{

  if (event == condition1)
  {
    Process.condition1(arg1, arg2)
  }
  else if (event == condition2)
  {
    Process.condition2(arg1, arg2)
  }
  .
  .
  .
}

pstmt.close();
connection.close();
过程类

{
  condition1(arg1, arg2)
  {
    sqlstatement = "INSERT INTO Table1 (column1, column2, column3,...) VALUES (?, ?, ?);"

pstmt = connection.prepareStatement(sqlstatement);

pstmt.setString(1, value1);

pstmt.setInt(2, value2);
.
.
.

pstmt.executeUpdate();

connection.commit();

return;

}

condition2(arg1, arg2)
  {
    sqlstatement = "INSERT INTO Table2 (column1, column2, column3,...) VALUES (?, ?, ?);"

pstmt = connection.prepareStatement(sqlstatement);

pstmt.setString(1, value1);

pstmt.setInt(2, value2);
.
.
.

pstmt.executeUpdate();

connection.commit();

return;    

}
}
对不起,我想,上面可能会给出一些关于整个过程是如何进行的想法。。。我没有把实际的代码放进去,因为它在很多类中分布&它从远程服务获取位置参数的数据。但以上是如何做的总结形式

另外,一种想法可能是在列表中获取类似类型的事件,然后对其进行处理,但我的业务需求是这样的,即远程服务提供数据的方式,它更容易出错


此外,oracle上的某些表中有130多个列&代码每15分钟将处理150多个事件。

不可能为准备好的语句分配查询字符串。准备好的语句是用查询字符串创建的,如代码所示:每次调用connection.prepareStatementsqlstatement都会创建一个新的准备好的语句。这也是为什么会出现打开游标过多的错误:以前创建的pstmt从未关闭

要重新使用准备好的语句,请实例化Process类并为其提供一个init方法和相应的close方法,该方法将被调用一次,以设置准备好的语句,这些语句可能会被使用,并在工作完成时关闭:

PreparedStatement insertTable1;
PreparedStatement insertTable2;

void init(Connection c) {
    insertTable1 = c.prepareStatement(INSERT_TABLE1_QUERY);
    insertTable2 = c.prepareStatement(INSERT_TABLE2_QUERY);
}
void close() {
    insertTable1.close();
    insertTable2.close();
}
void condition1(Connection c, arg1, arg2) {
    insertTable1.setString(1, value1);
    insertTable1.setInt(2, value2);
    insertTable1.executeUpdate();
    c.commit();
}
void condition2(Connection c, arg1, arg2) {
    insertTable2.setString(1, value1);
    insertTable2.setInt(2, value2);
    insertTable2.executeUpdate();
    c.commit();
}

演示如何使用PreparedStatements。我想请您提供代码。这个网站是为程序员设计的,你在代码/设计方面有问题,所以发布你的代码来查看你当前的设计。请不要以最终用户的身份询问有关代码的问题。简短回答:停止尝试重新发明轮子。使用myBatis iBatis或Hibernate。