以下delete语句在SQL开发人员中运行正常,但在使用JDBC执行时,api执行更新.Update()无效。
删除where子句后,其工作正常。
@Test
public void testES() throws Exception {
String index = "test";
String type = "event";
String doc = "{\"Key0\":\"Val0\"}";
createIndex(index);
Semaphore sem = new Semaphore(0);
client().prepareIndex(index, type).setSource(doc).execute(handleOrError(postResp -> {
client().prepareGet(postResp.getIndex(), postResp.getType(), postResp.getId()).execute(handleOrError(getResp -> {
printGR(getResp);
client().prepareSearch(postResp.getIndex()).execute(handleOrError(searchResponse -> {
printSR(searchResponse);
client().prepareDelete(postResp.getIndex(), postResp.getType(), postResp.getId()).execute(handleOrError(resp -> {
printDR(resp);
client().prepareGet(postResp.getIndex(), postResp.getType(), postResp.getId()).execute(handleOrError(getResp2 -> {
printGR(getResp2);
client().prepareSearch(postResp.getIndex()).execute(handleOrError(searchResponse2 -> {
printSR(searchResponse2);
sem.release();
}));
}));
}));
}));
}));
}));
sem.acquire();
}
我无法找出问题,因为没有打印异常或错误。只有代码执行在executeUpdate()方法中被挂起。
数据库:Oracle 11g Java:1.6
答案 0 :(得分:0)
由于没有异常或堆栈跟踪,因此只能猜测。
可能在Java代码中吞噬了异常。看看并尽可能打印出来。
where TRUNC(CREATED_TS) <= TRUNC(ADD_MONTHS(SYSDATE,-3))
将阻止CREATED_TS上的索引(如果有的话)被使用,并可能减慢进程的速度。并且可能已发生超时。我会检查设置的Java端的连接/语句超时设置。
答案 1 :(得分:0)
问题不在于删除SQL。问题出在另一个会话中,其中有一些未提交的更改。因此,java代码中的删除SQL无限期地被挂起。在另一个会话上发出提交时,java api executeUpdate()响应并且它开始正常工作。
问题类似于以下链接中的问题: