- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的项目中,我使用 Spring Data Neo4j (3.4.2.RELEASE) 以及使用嵌入式数据库的基于 AspectJ 的“高级映射”模式。我还通过@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)使用基于AspectJ的事务管理
在我的应用程序中,在并发读取/写入数据库的情况下,我遇到了死锁。但我没有收到 DeadlockDetectedException
,而是看到一个线程无限期地等待 RWLock
。此后不久,所有剩余线程将等待第一个线程,并且应用程序将停止并无法恢复。其他线程可能也已经获得了锁,但由于我看不到,所以我不确定。
锁定线程的堆栈跟踪:
Thread [Processing-XXX] (Suspended)
owns: SeasonOfCompetitionRepositoryImpl (id=134)
waiting for: RWLock (id=174)
Object.wait(long) line: not available [native method]
RWLock(Object).wait() line: 502 [local variables unavailable]
RWLock.acquireWriteLock(Object) line: 388
LockManagerImpl.getWriteLock(Object, Object) line: 66
CommunityLockClient.acquireExclusive(Locks$ResourceType, long) line: 116
LockingStatementOperations.relationshipCreate(KernelStatement, int, long, long) line: 287
OperationsFacade.relationshipCreate(int, long, long) line: 866
NodeProxy.createRelationshipTo(Node, RelationshipType) line: 559
DelegatingGraphDatabase.getOrCreateRelationship(Node, Node, RelationshipType, Direction, Map<String,Object>) line: 298
Neo4jTemplate.getOrCreateRelationship(Node, Node, RelationshipType, Direction, Map<String,Object>) line: 772
RelationshipHelper.createSingleRelationship(Node, Node) line: 198
RelationshipHelper.createAddedRelationships(Node, Set<Node>) line: 154
RelatedToSingleFieldAccessorFactory$RelatedToSingleFieldAccessor(RelatedToFieldAccessor).createAddedRelationships(Node, Set<Node>) line: 78
RelatedToSingleFieldAccessorFactory$RelatedToSingleFieldAccessor.setValue(Object, Object, MappingPolicy) line: 68
NodeEntityState(DefaultEntityState<STATE>).setValue(Neo4jPersistentProperty, Object, MappingPolicy) line: 113
DetachedEntityState<STATE>.setValue(Neo4jPersistentProperty, Object, MappingPolicy) line: 181
DetachedEntityState<STATE>.setValue(Field, Object, MappingPolicy) line: 145
SeasonOfCompetition.season_aroundBody21$advice(SeasonOfCompetition, SeasonOfCompetition, Season, JoinPoint, Neo4jNodeBacking, NodeBacked, Object, AroundClosure, JoinPoint) line: 266
SeasonOfCompetition.setSeason_aroundBody22(SeasonOfCompetition, Season) line: 108
SeasonOfCompetition$AjcClosure23.run(Object[]) line: 1
AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(Object, AroundClosure) line: 66
AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation() line: 72
AnnotationTransactionAspect(TransactionAspectSupport).invokeWithinTransaction(Method, Class<?>, InvocationCallback) line: 281
AnnotationTransactionAspect(AbstractTransactionAspect).ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(Object, AroundClosure, JoinPoint$StaticPart) line: 70
SeasonOfCompetition.setSeason(Season) line: 95
SeasonOfCompetitionRepositoryImpl.getOrCreate_aroundBody0(SeasonOfCompetitionRepositoryImpl, Season, Competition) line: 32
SeasonOfCompetitionRepositoryImpl$AjcClosure1.run(Object[]) line: 1
AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(Object, AroundClosure) line: 66
AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation() line: 72
AnnotationTransactionAspect(TransactionAspectSupport).invokeWithinTransaction(Method, Class<?>, InvocationCallback) line: 281
AnnotationTransactionAspect(AbstractTransactionAspect).ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(Object, AroundClosure, JoinPoint$StaticPart) line: 70
SeasonOfCompetitionRepositoryImpl.getOrCreate(Season, Competition) line: 26
这是自定义 RepositoryExtension 的一部分,应该为给定参数创建唯一的 SeasonOfCompetition
:
@Override
@Transactional
public synchronized SeasonOfCompetition getOrCreate(Season season, Competition competition)
{
String uri = buildUri(season, competition);
SeasonOfCompetition soc = getOrCreateByUri(uri);
if(soc.getSeason() == null)
{
soc.setSeason(season);
}
if(soc.getCompetition() == null)
{
soc.setCompetition(competition);
}
return soc;
}
请注意,我已经使用了 @Transactional
和 sychronized
- 这两个我最初没有使用,因为我认为(但我不确定)这里不需要它们。
这是线程卡住的领域实体SeasonOfCompetition
的选择:
@NodeEntity
public class SeasonOfCompetition extends UriEntity
{
@RelatedTo(type = "inSeason", direction = Direction.OUTGOING)
private Season season;
@Transactional
public void setSeason(Season season)
{
this.season = season;
}
}
我在这里做错了什么?我假设通过 SDN 访问图形数据库是线程安全的,并且除了使用事务之外不需要任何特殊处理。也欢迎提供有关如何调试此问题或如何使其在这种情况下抛出 DeadlockDetectedException
的建议。
我以前也遇到过其他与并发相关的问题(本应是唯一的重复实体、重复关系等),并且不完全理解我还需要如何处理这个问题。欢迎提供有关如何为 NodeEntities 和关系实现线程安全的 #getOrCreate 的意见。
编辑:我尝试实现基于 MERGE
查询的 #getOrCreate 版本,该版本不使用@cybersam 建议的任何自定义同步:
@Override
@Transactional
@SuppressWarnings("deprecation")
public T getOrCreateByUri(String uri)
{
checkArgument(!StringUtils.isEmpty(uri));
Class<T> clazz = getEntityType();
String queryString = "MERGE (n:" + clazz.getSimpleName() + " {uri: {uri}}) RETURN n";
Map<String, Object> parameters = new HashMap<>();
parameters.put("uri", uri);
Node node = (Node) template.getGraphDatabase().queryEngine().query(queryString, parameters).single().get( "n" );
template.postEntityCreation(node, clazz);
T result = (T) template.convert(node, clazz);
return result.persist();
}
但是这无法创建唯一的节点。创建 100 个线程并并行调用它的简单测试会失败,因为创建了多个节点。这可能与 result.persist()
有关,但如果没有,返回的实体不会附加到图表中,并且会丢失一些信息。
最佳答案
neo4j documentation包含此警告:
执行 Neo4j 操作的Important
Deadlocks caused by the use of other synchronization than the locks managed by Neo4j can still happen. Since all operations in the Neo4j API are thread safe unless specified otherwise, there is no need for external synchronization. Other code that requires synchronization should be synchronized in such a way that it never performs any Neo4j operation in the synchronized block.
getOrCreate()
目前已同步
。所以,死锁有可能实际上是由你自己代码的Java同步引起的。您将需要重新设计代码以避免在执行 Neo4j 操作时使用 Java 同步。
关于java - Spring 数据 Neo4j : Indefinite waiting for RWLock without DeadlockDetectedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962837/
我在一次采访中遇到过这个问题。 线程中wait和wait on time有什么区别? 我知道 wait 方法 导致当前线程等待,直到另一个线程调用此对象的 notify() 方法或 notifyAll
我在这里得到了一个 java 代码片段,这让我想知道调用 wait() 和 this.wait() 之间的区别是什么。 假设您有一个类,该类具有获取资源的方法并且是同步的。通常,如果资源不可用,我会在
我知道如何使用 wait_event 在 Linux 内核队列中等待以及如何唤醒它们。 现在我需要弄清楚如何同时在多个队列中等待。我需要多路复用多个事件源,基本上以类似于 poll 或 select
c系统编程中wait(null)和wait(&status)有什么区别? 指针状态的内容是什么? 最佳答案 如果您调用 wait(NULL) ( wait(2) ),您只会等待任何子进程终止。使用 w
设想: 用户单击 View 上的按钮 这会调用 ViewModel 上的命令 DoProcessing 考虑到 View 和 ViewModel 的职责,Wait 光标是如何以及在哪里设置的? 为了清
我在使用 Selenium 的代码中看到了 FluentWait 和 WebDriverWait。 FluentWait 使用轮询技术,即它将在每个固定时间间隔轮询特定的 WebElement。我想知
我编写了以下代码,其中 start 方法应该等待,直到 stop 方法通知它。但是在执行过程中,尽管我已指定它等待,但启动方法下面的日志行会被打印。下图是我的start方法实现如下。 private
我有以下连接到 SignalR Hub 的代码 private static async Task StartListening() { try {
我对线程中的 wait() 方法如何工作感到很困惑。假设我写: public class test3 { public static void main(String args[]){
在使用 Java 线程原语构造线程安全有界队列时 - 这两种构造之间有什么区别 创建显式锁定对象。 使用列表作为锁并等待它。 示例 1 private final Object lock = new
故事: 在 Java selenium 语言绑定(bind)中有一个 FluentWait class ,这允许严格控制如何检查预期条件: Each FluentWait instance defin
wait-die 和 wound-wait 算法有什么区别? 这两种死锁预防技术似乎都在做同样的事情:回滚旧进程。 两者有什么区别? 请提供一个合适的例子来对比这两种算法。 最佳答案 Wait-Die
在 Java 线程转储中,您可以看到堆栈跟踪中提到的锁。 似乎有三种信息: 1: - locked (a java.io.BufferedInputStream) 2: - waiting to l
以下代码运行大约需要 20 秒。然而,取消注释 do! 后只用了不到一秒的时间。为什么会有这么大的差异? 更新:使用ag.Add时需要9秒。我已经更新了代码。 open FSharpx.Control
我在 ASP.NET WebForms 网站上有一个服务器端点击事件。在这种情况下,我调用一个方法,该方法又调用其异步合作伙伴方法,在调用中添加 .Wait()。 此方法然后向下几个级别(即,调用另一
有 3 种状态的线程处于 Activity 状态但既不运行也不可运行:- sleep 已阻止 正在等待 当线程执行 sleep() 方法时,它会在其参数指定的时间段(比如几毫秒)内从运行状态进入休眠状
考虑以下代码 public class ThreadTest1 { private static final long startTime = System.currentTimeMillis();
我有一个使用线程的 Java 应用程序,它使用多个 Lock 对象实例来同步对公共(public)资源的访问。 现在,作为性能测量的一部分,我想测量每个线程在每个锁中花费的时间。到目前为止,我已经尝试
我写了下面这段代码: let first_row = rows_stream.take(1).wait(); 并收到以下错误(当我真正想要访问该元素时): found struct `futures:
我使用了两个命令来等待设备启动:adb 等待设备和 adb 等待设备。两者似乎都在等待设备启动,我发现它们的行为没有任何区别。他们的行为有什么不同吗? 添加更多关于我所做的信息: 所以这就是我所做的,
我是一名优秀的程序员,十分优秀!