数据库插入同步

时间:2015-08-11 12:42:01

标签: java multithreading hibernate

我有一个java代码,它根据从数据库接收的数据生成请求编号,然后为新生成的数据库更新

synchronized (this.getClass()) {
            counter++;
            System.out.println(counter);
            System.out.println("start " + System.identityHashCode(this));
            certRequest
                    .setRequestNbr(generateRequestNumber(certInsuranceRequestAddRq
                            .getAccountInfo().getAccountNumberId()));
            System.out.println("outside funcvtion"+certRequest.getRequestNbr());
            reqId = Utils.getUniqueId();
            certRequest.setRequestId(reqId);
            System.out.println(reqId);
            ItemIdInfo itemIdInfo = new ItemIdInfo();

            itemIdInfo.setInsurerId(certRequest.getRequestId());

            certRequest.setItemIdInfo(itemIdInfo);

            dao.insert(certRequest);
            addAccountRel();
            counter++;
            System.out.println(counter);
            System.out.println("end");

        }

System.out.println()语句的输出是`

1
start 27907101
com.csc.exceed.certificate.domain.CertRequest@a042cb
inside function request number66
outside funcvtion66
AF88172D-C8B0-4DCD-9AC6-12296EF8728D

2
end
3
start 21695531
com.csc.exceed.certificate.domain.CertRequest@f98690
inside function request number66
outside funcvtion66
F3200106-6033-4AEC-8DC3-B23FCD3CA380

4
end

在我的情况下,我从这个代码的两个线程接到一个调用。

如果您观察到两个线程独立运行。但是,两种情况下请求号的数据都相同。

是否有可能在第一个线程的数据库更新完成之前,第二个线程开始执行。 ` generateRequestNumber()的代码如下:

public String generateRequestNumber(String accNumber)抛出异常{

String requestNumber = null;

if (accNumber != null) {

    String SQL_QUERY = "select CERTREQUEST.requestNbr from CertRequest as CERTREQUEST, "
            + "CertActObjRel  as certActObjRel where  certActObjRel.certificateObjkeyId=CERTREQUEST.requestId "
            + " and certActObjRel.certObjTypeCd=:certObjTypeCd "
            + " and certActObjRel.certAccountId=:accNumber ";

    String[] parameterNames = { "certObjTypeCd", "accNumber" };
    Object[] parameterVaues = new Object[] {
            Constants.REQUEST_RELATION_CODE, accNumber };
    List<?> resultSet = dao.executeNamedQuery(SQL_QUERY,
            parameterNames, parameterVaues);

    // List<?> resultSet = dao.retrieveTableData(SQL_QUERY);
    if (resultSet != null && resultSet.size() > 0) {
        requestNumber = (String) resultSet.get(0);
    }

    int maxRequestNumber = -1;

    if (requestNumber != null && requestNumber.length() > 0) {
        maxRequestNumber = maxValue(resultSet.toArray());
        requestNumber = Integer.toString(maxRequestNumber + 1);

    } else {
        requestNumber = Integer.toString(1);
    }
    System.out.println("inside function request number"+requestNumber);
    return requestNumber;
}
return null;

}

1 个答案:

答案 0 :(得分:1)

数据库允许多个同时连接,因此除非您正确编写代码,否则可能会弄乱数据。

由于您似乎只需要一个唯一的增长整数,因此您可以使用例如序列(如果数据库支持)在数据库中安全地生成一个整数。不支持序列的数据库通常提供其他方式(例如MySQL中的自动增量列)。