首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j 3.0.6和新4j-ogm 2.0.5 -在数据库上创建重复数据

Neo4j 3.0.6和新4j-ogm 2.0.5 -在数据库上创建重复数据
EN

Stack Overflow用户
提问于 2016-10-20 12:19:41
回答 1查看 190关注 0票数 2

我对neo4j数据库有问题。当我尝试插入数据时,应该只创建一个样本数据,但有时当我尝试插入数据时,它会创建双样本数据。没有任何关于第二次打电话的痕迹。这是我的Neo4j的Config

代码语言:javascript
复制
@Configuration
@EnableNeo4jRepositories(basePackages = "com.example.neo.repository")
@EnableTransactionManagement
public class Neo4jConfig extends Neo4jConfiguration {
    @Override
    @Bean
    public SessionFactory getSessionFactory() {
        // with domain entity base package(s)
        return new SessionFactory("com.example.neo.model", "BOOT-INF.classes.com.example.neo.model");
    }

    // needed for session in view in web-applications
    @Override
    @Bean
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Session getSession() throws Exception {
        return super.getSession();
    }
}

我就是这样调用我的函数的

代码语言:javascript
复制
@RequestMapping(value = "/initCurrency")
public ModelAndView initCurrency() {
    initializationService.initCurrency();

    ModelAndView model = new ModelAndView("redirect:/");
    return model;
}

这是initializationService函数

代码语言:javascript
复制
private String[][] currencyList = {
        { "USD", "7.5" },
        { "DKK", "1" },
        { "AFN", "1"},{ "EUR", "1"},{ "ALL", "1"},{ "DZD", "1"},{ "USD", "1"},{ "AOA", "1"},{ "XCD", "1"},
        { "ARS", "1"},{ "AMD", "1"},{ "AWG", "1"},{ "SHP", "1"},{ "AUD", "1"},{ "AZN", "1"},{ "BSD", "1"},
        { "BHD", "1"},{ "BDT", "1"},{ "BBD", "1"}
}
@Override
public void initCurrency() {
    for (String[] currency : currencyList) {
        Currency existCurrency = currencyService.findByName(currency[0]);

        if (existCurrency == null) {
            existCurrency = new Currency(currency[0], Double.valueOf(currency[1]));
            currencyService.save(existCurrency);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 12:04:06

避免重复的唯一可靠方法是在属性上有一个实际的单一性约束

代码语言:javascript
复制
CREATE CONSTRAINT ON (n:Currency) ASSERT n.name IS UNIQUE;

SDN 4.0-2中没有办法从模型中创建这样的约束(SDN3.x中有@Indexed@Indexed(unique = true)注释),所以您必须独立运行查询(例如使用液位仪!)。

在并发环境中,仅进行查找以保护创建是不够的(顺序调用是可以的),因为读和写之间没有锁,这可能导致执行交错的以下场景:

  • 线程A检查是否存在,找不到节点
  • 线程B检查是否存在,也找不到节点
  • 线程A创建一个名为"USB“的货币节点
  • 线程B创建另一个同名的货币节点。

由于您的结果是重复的,因此将发生两个并发调用。负载均衡器具有非常短的超时并配置为重试?激活HTTP,在Spring控制器或服务中添加一些日志,用tcpdump捕获流量,等等。一旦unicity约束激活,就可以更容易地隔离第二个调用,因为您将得到一个异常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40154264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档