- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在代码审查论坛中提出了类似的问题,但建议在这里提出这个问题。我想知道下面的网络方法中的 synchronized
关键字。由于 setPerson 是从线程池调用的(意味着不同的线程可以调用它),我应该以某种方式同步它。当我的客户端对方法进行 SOAP 调用时,EclipseLink 将使用 thead 池。我的问题是,使 Web 方法同步
是否是一个好的做法,或者我可以使用 em.lock(person, WRITE)
进行同步吗?
@Override
public synchronized void setPerson(Person person) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersonLibPU");
EntityManager em = emf.createEntityManager();
if(!em.getTransaction().isActive()) {
em.getTransaction().begin();
}
try {
person.setPersonId(getLastInsertedId() + 1); // Get the last inserted ID and increment it by 1
em.merge(person);
em.getTransaction().commit();
emf.getCache().evict(Person.class);
} catch (Exception ex) {
if(em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
}
编辑
我在上面的代码中又添加了一行,在其中设置了 person 对象的主键值。这就是同步的目的,而不是为了任何共享的 java 对象。我需要同步它,这样两个线程就无法获得相同的主键。
最佳答案
您可能问错了问题。同步在这里对您没有帮助,因为唯一存在并发问题的部分是 getLastInsertedId():您不希望两个方法获取相同的值并尝试保留具有该 ID 的实例.
只有当 setPerson
是持久保存 Person
的唯一方法时,同步它才能解决问题。
如果可能,使用底层数据存储的自动递增功能;如果做不到这一点,您的 ORM 解决方案是否会执行上下文范围的 ID 分配?最后的手段是使用 getNextId
方法,该方法可以同步并返回递增的值。这可能会导致数据库中出现不连续的 ID 序列(getNextId
将不知道持久操作是否成功),但这会减少锁定的范围。
正如 JB Nizet 指出的那样,ID 分配需要持久保存并以某种可供该数据存储的所有客户端使用的方式提供。如果您的应用程序有两个持久化 Person
实例,则需要确保它们共享一个 ID 分配器。
关于java - 在不同线程使用时使 Web 方法同步是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11185089/
在我生活的世界中,构建一个将所有飞镖都扔到墙上的解决方案,并希望其中一些能命中靶心是一种非常糟糕的解决方案方法。 那么,我的问题出现了,什么时候在约定可接受的生产系统中使用 INSERT IGNORE
在数据处理时,经常会因为index报错而发愁。不要紧,本次来和大家聊聊pandas中处理索引的几种常用方法。 1.读取时指定索引列 很多情况下,我们的数据源是 CSV 文件。假设
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我是一名优秀的程序员,十分优秀!