我用的是PreparedStatement来发送提交,并且数据量非常庞大。
一次需要执行8900多条更新语句,也就是Update语句。
我试过分开,一部分一部分来执行提交,但还是一样的速度慢,而且越执行越慢。实在是没有什么好的办法了,请教各位高手。
一次需要执行8900多条更新语句,也就是Update语句。
我试过分开,一部分一部分来执行提交,但还是一样的速度慢,而且越执行越慢。实在是没有什么好的办法了,请教各位高手。
解决方案 »
- oracle安装后,plsql访问的时候提示‘ORA-12154:TNS:无法解析指定的连接标志符’
- 亚信联创BI产品部做开发需要哪些技术
- Oracle 的储存过程的问题
- 请问大家应怎样写这条sql语句?
- 如何将一个表中检索的值作为另一个表的字段列表?
- VC6调用存储过程
- 数据库连接串的奇怪问题(Connect Timeout一加就异常)
- oracle、sql2000、delphi运算符的问题
- ORACLE DBA请进:监听进程不能解析在连接描述符中的service-name!
- 急!!!在中ORACLE+VB中使用ADO的EXECUTE的问题。在线等待
- 触发器update时候不起作用,怎么办!
- PRO*C中,如何将select到的数据放到自定义结构体中?
@SuppressWarnings("unchecked")
public void updateHistory(Map map, Measure measure) throws Exception {
String sql = " update history" + measure.getH_tableid() + " set field"
+ measure.getH_fieldid() + "=? where id =?";
System.out.println("map=" + map.size());
frame.getJTextArea1().append("map=" + map.size() + "\n");
frame.getInfoArea().append(sql + "\r\n");
PreparedStatement pstm = null;
int count = 0;
try {
conn.setAutoCommit(false);
pstm = conn.prepareStatement(sql);
Set set = map.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
count++;
long sttime = System.currentTimeMillis();
Map.Entry entry = (Map.Entry) it.next();
List values = (List) entry.getValue();
for (int j = 1; j <= 12; j++) {
String value = StringUtil.valueTranser(values.get(j - 1)
+ "");
String id = DateUtil.calculateTime((Date) entry.getKey(),
j * 5);
pstm.setString(1, value);
pstm.setString(2, id);
pstm.addBatch();
}
System.out.println("耗时:"
+ (System.currentTimeMillis() - sttime) + "count="
+ count);
pstm.executeBatch();
}
conn.commit();
conn.setAutoCommit(true);
this.frame.getInfoArea()
.append(
"测点" + measure.getName() + "成功执行操作!count=" + count
+ "\r\n");
System.out.println("测点" + measure.getName() + "成功执行操作!");
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
} finally {
pstm.close();
}
}
String sql = " update history" + measure.getH_tableid() + " set field"
+ measure.getH_fieldid() + "=? where id =?";
//System.out.println("map=" + map.size());
frame.getJTextArea1().append("map=" + map.size() + "\n");
frame.getInfoArea().append(sql + "\r\n");
PreparedStatement pstm = null;
int count = 0;
try {
conn.setAutoCommit(false);
pstm = conn.prepareStatement(sql);
Set set = map.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
count++;
long sttime = System.currentTimeMillis();
Map.Entry entry = (Map.Entry) it.next();
List values = (List) entry.getValue();
for (int j = 1; j <= 12; j++) {
//String value = StringUtil.valueTranser(values.get(j - 1) + "");
//String id = DateUtil.calculateTime((Date) entry.getKey(), j * 5);
pstm.setString(1, StringUtil.valueTranser(values.get(j - 1) + ""));
pstm.setString(2, DateUtil.calculateTime((Date) entry.getKey(), j * 5));
pstm.addBatch();
}
//System.out.println("耗时:" + (System.currentTimeMillis() - sttime) + "count=" + count);
//pstm.executeBatch();
}
pstm.executeBatch();
conn.commit();
conn.setAutoCommit(true);
this.frame.getInfoArea().append("测点" + measure.getName() + "成功执行操作!count=" + count + "\r\n");
System.out.println("测点" + measure.getName() + "成功执行操作!");
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
} finally {
pstm.close();
}
}StringUtil和DateUtil两个类也可以改进或者弃用。
移到外面去了吗?
换一个oracle driver试试,最好是最新的,14的那个jar,别用class12.jar了。
查了下OraclePreparedStatement,没法知道里面executeBatch方法的具体实现。
是啊,我也用过OraclePreparedStatement效果一样。
这个问题真是蹊跷啊,都好长时间了,一直没找到什么好方法。
谢谢你了啊。
是不是可能是oracle的数据库缓存已经超支了?
ORACLE 更新大表确实有问题!