【发布时间】:2015-12-07 23:29:03
【问题描述】:
我是 Java 和 Hibernate 的新手。
我已经实现了一个生成请求编号的功能。基于已保存的请求编号。这是通过查找最大请求号来完成的。并将其增加 1,然后再次将其保存到数据库中。
但是,我遇到了多线程问题。当两个线程同时访问我的代码时,都生成相同的请求号。我的代码已经同步。请提出一些解决方案。
synchronized (this.getClass()) {
System.out.println("start");
certRequest.setRequestNbr(generateRequestNumber(certInsuranceRequestAddRq.getAccountInfo().getAccountNumberId()));
reqId = Utils.getUniqueId();
certRequest.setRequestId(reqId);
ItemIdInfo itemIdInfo = new ItemIdInfo();
itemIdInfo.setInsurerId(certRequest.getRequestId());
certRequest.setItemIdInfo(itemIdInfo);
dao.insert(certRequest);
addAccountRel();
System.out.println("end");
}
以下是显示我的同步的输出:
start
end
start
end
这是一些休眠问题。 Spring中事务属性的使用会影响我Case中的代码提交吗?
我正在使用以下事务属性:
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
编辑:聊天室中显示的 generateRequestNumber() 代码。
public String generateRequestNumber(String accNumber) throws Exception {
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;
}
【问题讨论】:
-
你在用这个方法中创建的“线程”对象做什么?找不到任何参考资料。这没有任何意义。
-
如果您是 Java 新手,您不应该使用线程或 Hibernate。即使是有经验的开发人员也很难正确编写多线程代码。我怀疑您认为需要 Hibernate 的任何事情都不能通过 JDBC 做得更好或更好。重新考虑一下。
-
@VA31 线程对象仅用于控制台上的显示目的,以便了解哪个线程正在访问代码。它没有其他用途。
-
您没有正确使用 Spring。这里没有很好的理由使用线程。让它变得简单:使用来自客户端的同步请求并阻塞直到响应返回。
标签: java multithreading spring hibernate spring-mvc