Java JDBC executeUpdate无法在where子句中使用TRUNC函数删除SQL

时间:2016-11-04 14:57:33

标签: java sql oracle jdbc

以下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

2 个答案:

答案 0 :(得分:0)

由于没有异常或堆栈跟踪,因此只能猜测。

  1. 可能在Java代码中吞噬了异常。看看并尽可能打印出来。

  2. where TRUNC(CREATED_TS) <= TRUNC(ADD_MONTHS(SYSDATE,-3))将阻止CREATED_TS上的索引(如果有的话)被使用,并可能减慢进程的速度。并且可能已发生超时。我会检查设置的Java端的连接/语句超时设置。

答案 1 :(得分:0)

问题不在于删除SQL。问题出在另一个会话中,其中有一些未提交的更改。因此,java代码中的删除SQL无限期地被挂起。在另一个会话上发出提交时,java api executeUpdate()响应并且它开始正常工作。

问题类似于以下链接中的问题:

Oracle database is hanging infinitly in UPDATE queries