在JavaWeb应用程序中的EJB会话bean中生成唯一Id
我尝试生成唯一的长id。我在服务中生成此id这是服务:在JavaWeb应用程序中的EJB会话bean中生成唯一Id,java,ejb-3.0,Java,Ejb 3.0,我尝试生成唯一的长id。我在服务中生成此id这是服务: package x.y.z; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.ejb.Startup; import javax.ejb.Stateless; import x.y.NiceObject; @Stateless @Startup public class Transacciones {
package x.y.z;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.ejb.Startup;
import javax.ejb.Stateless;
import x.y.NiceObject;
@Stateless
@Startup
public class Transacciones {
private long idTransaccion = 0l;
static Map<Long, NiceObject> mapaTransacciones = new ConcurrentHashMap<>();
public Transacciones() {
}
public long getIdTransaccion() {
++idTransaccion;
return idTransaccion;
}
public void setIdTransaccion(long idTransaccion) {
idTransaccion = idTransaccion;
}
public Map<Long, NiceObject> getMapaTransacciones() {
return mapaTransacciones;
}
public void setMapaTransacciones(Map<Long, NiceObject> mapaTransacciones) {
this.mapaTransacciones = mapaTransacciones;
}
}
问题是,在当时的某个地方,它失败了;因为我希望得到如下生成Id:
1,2,3,4,5,6.......
但我得到:
1,2,1,3,4,2,...
在这方面:
long idTransaccion = transaccionService.getIdTransaccion();
问题是什么。请记住,我有一个SessionScope的托管Bean,我在EJB中调用了这个方法
如需任何帮助,请提前感谢 将idTransaccion定义为静态变量。存在一个无状态bean池。每个调用都被委托给一个不同的实例,实际上你调用了一个代理方法,它将你的调用委托给池的一个实例。不能保证对一个bean(注入到您的bean中)的两个连续调用使用同一个bean。因此,当重新生成1时,意味着它使用了另一个bean。您可以使用单例而不是无状态。
正如@prasad_3所说,在无状态bean中不能有状态。谢谢santosh。但我想:我不会引用新的服务对象。为什么需要在这个类中创建这个静态变量?@FernandoPie。我认为您的会话正在丢失,因为您将获得随机值。谢谢。可能是。但是静态化有什么帮助呢?会话bean中“无状态”的含义是什么(您正在用
@stateless
注释Transacciones
)?您能将当前事务ID保存到数据库并从光盘中读取它而不是将其保存在Transacciones实例中吗?谢谢,请查看我的更新。数据库是一种解决方案。但我认为对数据库的访问要比内存中的访问慢得多。。。我之所以选择这个解决方案就是因为这个原因。“会有什么问题。请记住,我有一个SessionScope的托管Bean,我在EJB中调用这个方法。”。问题与调用无状态会话bean的位置无关。来自EJB3规范:无状态会话bean(1)不维护从一个方法调用到下一个方法调用的状态。(2) 没有会话状态且不专用于客户端。无状态会话bean中不能有idTransaccion
实例变量Transacciones
。无国籍意味着没有国家;这意味着没有实例变量。您必须找到其他方法来创建、存储和检索唯一id。尝试使用类似“ejb生成唯一ID”的搜索字符串搜索网络(Google)。
long idTransaccion = transaccionService.getIdTransaccion();