javaee并发问题

javaee并发问题,java,concurrency,jakarta-ee,javabeans,Java,Concurrency,Jakarta Ee,Javabeans,我编写了一个应用程序,它使用bean创建书籍标题、作者等并将其存储到数据库中。添加和删除书籍的基本功能在本地无状态bean中实现 我的问题是,我不太明白这将如何以并行方式工作。如果两个用户希望同时获得管理bean的句柄,那么默认情况下是否可以这样做?如果是这样的话,它究竟是如何处理并发请求的 谢谢 注意:只支持创建和删除。不支持编辑!所以我认为在写和读方面没有冲突 您使用哪种客户端技术 如果您使用web界面,您可以使用网关模式、有状态会话bean和扩展perstence上下文,请参阅真实世界的J

我编写了一个应用程序,它使用bean创建书籍标题、作者等并将其存储到数据库中。添加和删除书籍的基本功能在本地无状态bean中实现

我的问题是,我不太明白这将如何以并行方式工作。如果两个用户希望同时获得管理bean的句柄,那么默认情况下是否可以这样做?如果是这样的话,它究竟是如何处理并发请求的

谢谢


注意:只支持创建和删除。不支持编辑!所以我认为在写和读方面没有冲突

您使用哪种客户端技术

如果您使用web界面,您可以使用网关模式、有状态会话bean和扩展perstence上下文,请参阅真实世界的Java EE模式——重新思考Adam Bien的最佳实践,并返回附加的实体


如果您有一个远程客户端,您可能希望返回一个带有业务密钥的DTO,该密钥唯一地标识实体。

您使用哪种客户端技术

如果您使用web界面,您可以使用网关模式、有状态会话bean和扩展perstence上下文,请参阅真实世界的Java EE模式——重新思考Adam Bien的最佳实践,并返回附加的实体


如果您有一个远程客户机,您可能希望返回一个带有业务密钥的DTO,该业务密钥唯一地标识实体。

他们将获得不同的管理bean实例。如果您的管理bean确实是无状态的,那么它将在默认情况下工作


并发性由数据库及其对事务的支持来处理。例如,如果一个事务试图修改另一个并发事务正在删除的书籍,其中一个事务将回滚,因为提交该事务时数据库驱动程序引发了SQLException。

它们将获得管理bean的另一个实例。如果您的管理bean确实是无状态的,那么它将在默认情况下工作


并发性由数据库及其对事务的支持来处理。例如,如果一个事务试图修改另一个并发事务正在删除的书籍,其中一个事务将回滚,这是由于提交该事务时数据库驱动程序引发了SQLException。

在给定时间,每个EJB实例只能有一个调用线程。EJB大部分时间是由容器汇集的:如果两个客户端调用相同的方法或同一EJB类型上的不同方法,那么容器将为它们提供不同的实例,或者一个客户端必须等待一个实例准备好处理其调用。

在给定的时间内,每个EJB实例只能有一个调用线程。EJB大部分时间是由容器共享的:如果两个客户端调用同一个方法或同一EJB类型上的不同方法,那么容器将为它们提供不同的实例,或者一个客户端必须等待一个实例准备好处理其调用。

您对并发请求有什么顾虑?您对并发请求有什么顾虑并发请求?谢谢回复!我正在使用一个web界面,但我的bean是无状态的,我正在注入persistenceContext一个持久化Book对象的EntityManager。我想我误解了你的问题。我的答案更多地是关于实体的句柄,而不是EJB的句柄。正如其他人提到的:无状态bean是共享的,因此不应该有任何状态。通常情况下,除了一些乐观的db锁之外,不需要太多关注并发性。但在开发web界面时,使用上述网关模式重新连接实体可能会节省一些同步时间。谢谢您的回复!我正在使用一个web界面,但我的bean是无状态的,我正在注入persistenceContext一个持久化Book对象的EntityManager。我想我误解了你的问题。我的答案更多地是关于实体的句柄,而不是EJB的句柄。正如其他人提到的:无状态bean是共享的,因此不应该有任何状态。通常情况下,除了一些乐观的db锁之外,不需要太多关注并发性。但在开发web界面时,使用上述网关模式重新连接实体可能会节省一些同步时间。谢谢您的回复!我如何知道这两种情况中的哪一种会由容器提供不同的实例,或者某个实例必须等待一个实例准备好处理其调用?这就是关键:您不需要。您应该像编写单线程的EJB代码一样编写EJB代码。这是因为所有线程问题都是由容器而不是bean来处理的。通过容器,我知道您可以配置EJB池大小—容器将创建多少实例并随时准备为请求提供服务,在知道线程池大小、处理器数量等其他限制的情况下,您必须在池中拥有至少与您想要的数量相同的EJB才能服务并发请求。感谢t
他回答!我如何知道这两种情况中的哪一种会由容器提供不同的实例,或者某个实例必须等待一个实例准备好处理其调用?这就是关键:您不需要。您应该像编写单线程的EJB代码一样编写EJB代码。这是因为所有线程问题都是由容器而不是bean来处理的。通过容器,我知道您可以配置EJB池大小—容器将创建多少实例并随时准备为请求提供服务,在知道线程池大小、处理器数量等其他限制的情况下,您必须在池中至少拥有与您希望的数量相同的EJB,才能为并发请求提供服务,等等……是的,这就是我所想的,但是管理bean是无状态的这一事实是否保证了不同用户的不同实例?每个用户都得到一个代理实例,该实例最终调用会话bean类的一个方法。规范保证会话bean类的实例一次只能处理一个调用。引用规范:容器序列化对每个会话bean实例的调用。大多数容器将支持并发执行的会话bean的多个实例;但是,每个实例只看到方法调用的序列化序列。因此,会话bean不必被编码为可重入的。是的,这就是我的想法,但管理bean是无状态的这一事实是否保证了不同用户的不同实例?每个用户都得到一个代理实例,该实例最终调用会话bean类的一个方法。规范保证会话bean类的实例一次只能处理一个调用。引用规范:容器序列化对每个会话bean实例的调用。大多数容器将支持并发执行的会话bean的多个实例;但是,每个实例只看到方法调用的序列化序列。因此,会话bean不必被编码为可重入的。