Neo4j 2.3.1 服务器在保存具有多个关系的 SDN4 实体时死机
Neo4j 2.3.1 Server dies when saving SDN4 Entity with multiple relationships
我正在为指南服务编写应用程序,我是 运行 数字海洋水滴上的 Neo4j 2.3.1 3 服务器集群。我还使用 Spring Data Neo4j 4.0.0.RELEASE 来自 Tomcat 下的 JSF 网络应用程序 运行 来写入和查询我的数据。
我有一个节点可能与其他节点有 7 种不同的关系,我已经成功保存了 80 多个实例,但是当我尝试保存节点时,我突然开始在实例 1 主 neo4j 服务器上出现内存不足错误.我将 Neo4j 服务器的内存设置更新为以下内容:
wrapper.java.initmemory=512
wrapper.java.maxmemory=1024
我不再收到 OutOfMemoryError,但现在当我尝试保存节点时服务器出现故障。我可以在服务器出现故障之前查询数据。我从未在服务器 1 主服务器 data/log/console.log 文件中收到错误消息,但在服务器 2 从服务器 data/log/console.log 文件中我收到以下消息:
2015-12-31 15:42:00.405-0500 INFO Instance 1 is alive
2015-12-31 15:42:00.539-0500 INFO Instance 1 was elected as coordinator
2015-12-31 15:42:00.598-0500 INFO Instance 1 is available as master at ha://0.0.0.0:6001?serverId=1 with StoreId{creationTime=1447860597504, randomId=2820629596580485150, storeVersion=15250506225055238, upgradeTime=1447860597504, upgradeId=1}
2015-12-31 15:42:00.647-0500 INFO Instance 1 is available as backup at backup://127.0.0.1:6362 with StoreId{creationTime=1447860597504, randomId=2820629596580485150, storeVersion=15250506225055238, upgradeTime=1447860597504, upgradeId=1}
2015-12-31 15:42:11.652-0500 INFO Instance 1 has failed
节点实体Java代码:
public class OutfitterWaterfowlHunt extends WaterfowlHunt {
@Relationship(type="RUN_BY", direction=Relationship.OUTGOING)
private GuideService guideService;
@Relationship(type="GUIDED", direction=Relationship.INCOMING)
private List<Guide> fieldStaffHunter = new ArrayList<Guide>();
@Relationship(type="ASSIGNED_BY", direction=Relationship.OUTGOING)
private Guide fieldStaff;
public void addGuide(Guide guide)
{
this.fieldStaffHunter.add(guide);
}
public List<Guide> getFieldStaffHunter() {
return fieldStaffHunter;
}
public void setFieldStaffHunter(List<Guide> fieldStaffHunter) {
this.fieldStaffHunter = fieldStaffHunter;
}
public GuideService getGuideService() {
return guideService;
}
public void setGuideService(GuideService guideService) {
this.guideService = guideService;
}
public Guide getFieldStaff() {
return fieldStaff;
}
public void setFieldStaff(Guide fieldStaff) {
this.fieldStaff = fieldStaff;
}
}
public class WaterfowlHunt extends Excursion {
@Property(name="type")
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class Excursion extends BaseEntity {
@Relationship(type="OCCURED_ON", direction=Relationship.OUTGOING)
private TookPlaceOn occuredOn;
@Relationship(type="OCCURED_AT", direction=Relationship.OUTGOING)
private ExcursionLocation excursionLocation;
@Relationship(type="PARTICIPATED_IN", direction=Relationship.INCOMING)
private HuntGroupRole participatedIn;
@Relationship(type="HARVESTED", direction=Relationship.OUTGOING)
private HuntInformation harvestInfo;
public TookPlaceOn occuredOn(Day day, Long timeIn, Long timeOut)
{
TookPlaceOn tpo = new TookPlaceOn();
tpo.setDayOfExcursion(day);
tpo.setExcursion(this);
tpo.setTimeIn(timeIn);
tpo.setTimeOut(timeOut);
this.occuredOn = tpo;
day.addOccuredOn(tpo);
return tpo;
}
public void occuredAt(ExcursionLocation huntLocation)
{
this.setExcursionLocation(huntLocation);
}
public void harvested(HuntInformation harvestInfo)
{
this.setHarvestInfo(harvestInfo);
}
public HuntGroupRole participatedIn(HuntGroup huntGroup, Integer nbrOfHunters)
{
HuntGroupRole hgr = new HuntGroupRole();
hgr.setHuntGroup(huntGroup);
hgr.setHuntingSpot(this);
hgr.setNumberOfHunters(nbrOfHunters);
this.participatedIn = hgr;
huntGroup.addParticipatedIn(hgr);
return hgr;
}
public HuntGroupRole getParticipatedIn() {
return participatedIn;
}
public void setParticipatedIn(HuntGroupRole participatedIn) {
this.participatedIn = participatedIn;
}
public TookPlaceOn getOccuredOn() {
return occuredOn;
}
public void setOccuredOn(TookPlaceOn occuredOn) {
this.occuredOn = occuredOn;
}
public ExcursionLocation getExcursionLocation() {
return excursionLocation;
}
public void setExcursionLocation(ExcursionLocation excursionLocation) {
this.excursionLocation = excursionLocation;
}
public HuntInformation getHarvestInfo() {
return harvestInfo;
}
public void setHarvestInfo(HuntInformation harvestInfo) {
this.harvestInfo = harvestInfo;
}
}
我用来保存的代码是通过SDN4 GraphRepository保存的:
@Transactional
public void saveHunt()
{
OutfitterWaterfowlHunt owh = new OutfitterWaterfowlHunt();
owh.setType("GuideTypeHere");
Day doh = this.determineDayOfHunt();
owh.occuredOn(doh, this.timeIn.getTime(), this.timeOut.getTime());
owh.participatedIn(this.huntGroup, this.nbrOfHunters);
GuideService gs = WDSSession.getInstance().getNeo4JController().retrieveGuideServiceByName("GuideServiceNameHere");
owh.setGuideService(gs);
owh.setFieldStaffHunter(this.selectedFSMembers);
owh.setFieldStaff(this.responsibleFieldStaffer);
owh.occuredAt(this.huntLocation);
HuntInformation hi = this.populateHuntInformation();
owh.setHarvestInfo(hi);
owh = WDSSession.getInstance().getNeo4JController().saveOutfitterWaterfowlHunt(owh);
StringBuffer msg = new StringBuffer();
msg.append("Successfully Saved Hunt ");
msg.append(" (");
msg.append(owh.getGraphId());
msg.append(").");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Hunt Save Status", msg.toString()));
}
GraphRepository 保存:
@Transactional
public OutfitterWaterfowlHunt saveOutfitterWaterfowlHunt(OutfitterWaterfowlHunt owh)
{
OutfitterWaterfowlHunt owHunt = this.outWtrFwlRepo.save(owh);
return owHunt;
}
关于什么导致服务器在保存此节点时突然开始失败的任何想法?我目前在我的 Neo4j 数据库中有 19957 个节点,其中大部分构成了我的 DateTree。有没有比我目前正在做的更好的保存节点的方法?
TIA
此问题已在 yet-to-be-released neo4j-ogm 2.0 中修复。同时解决此问题的困难方法是首先保存所有相关实体,然后保存顶级实体,但查看您的模型,这并不简单。
我正在为指南服务编写应用程序,我是 运行 数字海洋水滴上的 Neo4j 2.3.1 3 服务器集群。我还使用 Spring Data Neo4j 4.0.0.RELEASE 来自 Tomcat 下的 JSF 网络应用程序 运行 来写入和查询我的数据。
我有一个节点可能与其他节点有 7 种不同的关系,我已经成功保存了 80 多个实例,但是当我尝试保存节点时,我突然开始在实例 1 主 neo4j 服务器上出现内存不足错误.我将 Neo4j 服务器的内存设置更新为以下内容:
wrapper.java.initmemory=512
wrapper.java.maxmemory=1024
我不再收到 OutOfMemoryError,但现在当我尝试保存节点时服务器出现故障。我可以在服务器出现故障之前查询数据。我从未在服务器 1 主服务器 data/log/console.log 文件中收到错误消息,但在服务器 2 从服务器 data/log/console.log 文件中我收到以下消息:
2015-12-31 15:42:00.405-0500 INFO Instance 1 is alive
2015-12-31 15:42:00.539-0500 INFO Instance 1 was elected as coordinator
2015-12-31 15:42:00.598-0500 INFO Instance 1 is available as master at ha://0.0.0.0:6001?serverId=1 with StoreId{creationTime=1447860597504, randomId=2820629596580485150, storeVersion=15250506225055238, upgradeTime=1447860597504, upgradeId=1}
2015-12-31 15:42:00.647-0500 INFO Instance 1 is available as backup at backup://127.0.0.1:6362 with StoreId{creationTime=1447860597504, randomId=2820629596580485150, storeVersion=15250506225055238, upgradeTime=1447860597504, upgradeId=1}
2015-12-31 15:42:11.652-0500 INFO Instance 1 has failed
节点实体Java代码:
public class OutfitterWaterfowlHunt extends WaterfowlHunt {
@Relationship(type="RUN_BY", direction=Relationship.OUTGOING)
private GuideService guideService;
@Relationship(type="GUIDED", direction=Relationship.INCOMING)
private List<Guide> fieldStaffHunter = new ArrayList<Guide>();
@Relationship(type="ASSIGNED_BY", direction=Relationship.OUTGOING)
private Guide fieldStaff;
public void addGuide(Guide guide)
{
this.fieldStaffHunter.add(guide);
}
public List<Guide> getFieldStaffHunter() {
return fieldStaffHunter;
}
public void setFieldStaffHunter(List<Guide> fieldStaffHunter) {
this.fieldStaffHunter = fieldStaffHunter;
}
public GuideService getGuideService() {
return guideService;
}
public void setGuideService(GuideService guideService) {
this.guideService = guideService;
}
public Guide getFieldStaff() {
return fieldStaff;
}
public void setFieldStaff(Guide fieldStaff) {
this.fieldStaff = fieldStaff;
}
}
public class WaterfowlHunt extends Excursion {
@Property(name="type")
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class Excursion extends BaseEntity {
@Relationship(type="OCCURED_ON", direction=Relationship.OUTGOING)
private TookPlaceOn occuredOn;
@Relationship(type="OCCURED_AT", direction=Relationship.OUTGOING)
private ExcursionLocation excursionLocation;
@Relationship(type="PARTICIPATED_IN", direction=Relationship.INCOMING)
private HuntGroupRole participatedIn;
@Relationship(type="HARVESTED", direction=Relationship.OUTGOING)
private HuntInformation harvestInfo;
public TookPlaceOn occuredOn(Day day, Long timeIn, Long timeOut)
{
TookPlaceOn tpo = new TookPlaceOn();
tpo.setDayOfExcursion(day);
tpo.setExcursion(this);
tpo.setTimeIn(timeIn);
tpo.setTimeOut(timeOut);
this.occuredOn = tpo;
day.addOccuredOn(tpo);
return tpo;
}
public void occuredAt(ExcursionLocation huntLocation)
{
this.setExcursionLocation(huntLocation);
}
public void harvested(HuntInformation harvestInfo)
{
this.setHarvestInfo(harvestInfo);
}
public HuntGroupRole participatedIn(HuntGroup huntGroup, Integer nbrOfHunters)
{
HuntGroupRole hgr = new HuntGroupRole();
hgr.setHuntGroup(huntGroup);
hgr.setHuntingSpot(this);
hgr.setNumberOfHunters(nbrOfHunters);
this.participatedIn = hgr;
huntGroup.addParticipatedIn(hgr);
return hgr;
}
public HuntGroupRole getParticipatedIn() {
return participatedIn;
}
public void setParticipatedIn(HuntGroupRole participatedIn) {
this.participatedIn = participatedIn;
}
public TookPlaceOn getOccuredOn() {
return occuredOn;
}
public void setOccuredOn(TookPlaceOn occuredOn) {
this.occuredOn = occuredOn;
}
public ExcursionLocation getExcursionLocation() {
return excursionLocation;
}
public void setExcursionLocation(ExcursionLocation excursionLocation) {
this.excursionLocation = excursionLocation;
}
public HuntInformation getHarvestInfo() {
return harvestInfo;
}
public void setHarvestInfo(HuntInformation harvestInfo) {
this.harvestInfo = harvestInfo;
}
}
我用来保存的代码是通过SDN4 GraphRepository保存的:
@Transactional
public void saveHunt()
{
OutfitterWaterfowlHunt owh = new OutfitterWaterfowlHunt();
owh.setType("GuideTypeHere");
Day doh = this.determineDayOfHunt();
owh.occuredOn(doh, this.timeIn.getTime(), this.timeOut.getTime());
owh.participatedIn(this.huntGroup, this.nbrOfHunters);
GuideService gs = WDSSession.getInstance().getNeo4JController().retrieveGuideServiceByName("GuideServiceNameHere");
owh.setGuideService(gs);
owh.setFieldStaffHunter(this.selectedFSMembers);
owh.setFieldStaff(this.responsibleFieldStaffer);
owh.occuredAt(this.huntLocation);
HuntInformation hi = this.populateHuntInformation();
owh.setHarvestInfo(hi);
owh = WDSSession.getInstance().getNeo4JController().saveOutfitterWaterfowlHunt(owh);
StringBuffer msg = new StringBuffer();
msg.append("Successfully Saved Hunt ");
msg.append(" (");
msg.append(owh.getGraphId());
msg.append(").");
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Hunt Save Status", msg.toString()));
}
GraphRepository 保存:
@Transactional
public OutfitterWaterfowlHunt saveOutfitterWaterfowlHunt(OutfitterWaterfowlHunt owh)
{
OutfitterWaterfowlHunt owHunt = this.outWtrFwlRepo.save(owh);
return owHunt;
}
关于什么导致服务器在保存此节点时突然开始失败的任何想法?我目前在我的 Neo4j 数据库中有 19957 个节点,其中大部分构成了我的 DateTree。有没有比我目前正在做的更好的保存节点的方法?
TIA
此问题已在 yet-to-be-released neo4j-ogm 2.0 中修复。同时解决此问题的困难方法是首先保存所有相关实体,然后保存顶级实体,但查看您的模型,这并不简单。