我认为这很简单,但到目前为止我还没有做到这一点。我有一个tomcat集群,我想分配一个主服务器。
我在考虑节点之间的比赛以锁定表格。无论谁锁定它都是主人。主人现在必须保持锁定。其他节点应该尝试获取锁...
我不介意纯JDBC,但应用程序正在使用JPA和EJB(TomEE)
如何锁定? 怎么抓住锁? 如果已经锁定,如何无限期地获取锁定?
好的,我设法让它“永远等待”,但现在我很害怕,因为在阅读文档时,我得到的印象是它不应该等待,所以我不觉得我在掌控...
这是我使用Eclipselink的僵局:
Map<String, Object> timeout = new HashMap<>();
timeout.put("javax.persistence.lock.timeout", 1L);
master = entityManager.find(Master.class, "MASTER", LockModeType.PESSIMISTIC_READ, timeout);
还在persistence.xml中指定了超时标志...
答案 0 :(得分:1)
要获取锁定,请使用javax.persistence.LockModeType.PESSIMISTIC_WRITE
和EntityMode
的{{1}}方法(或采用锁定模式的任何方法)。您可以通过不让事务完成(通过提交或回滚)来保持锁定。
为了继续重试锁,我会使用try-catch永远循环来处理异常,并再次尝试获取锁。请注意,根据您的隔离级别,您可能必须清理旧事务并在每次尝试获取锁定时启动新事务。将锁定等待超时设置为一段合理的持续时间(比如说一分钟),或者在尝试获取锁定之间至少短暂地设置lock()
,这样就不会浪费大量资源尝试并且无法锁定所有非主服务器。
您需要确保没有任何超时会过早地终止连接或交易(对于&#34;主人和#34;以及所有正在尝试的非主人)成为主人。)
您还需要确保正确处理&#34; master&#34;以自动方式改变(最终会发生),所以当另一台服务器设法获得锁定时,它会接管所有&#34; master&#34;商业逻辑。