Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaWeb应用程序中的EJB会话bean中生成唯一Id_Java_Ejb 3.0 - Fatal编程技术网

在JavaWeb应用程序中的EJB会话bean中生成唯一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 {

我尝试生成唯一的长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 {

     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();