Neo4j 3.0.6 和 neo4j-ogm 2.0.5 - 在数据库上创建重复数据
Neo4j 3.0.6 and neo4j-ogm 2.0.5 - Create duplicate data on database
我的 neo4j 数据库有问题。当我尝试初始化数据时,它应该只是创建一个样本数据,但有时当我尝试初始化数据时,它会创建双样本数据。第二次来电无迹可寻。这是我的 Neo4j
的配置
@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();
}
}
这就是我调用函数的方式
@RequestMapping(value = "/initCurrency")
public ModelAndView initCurrency() {
initializationService.initCurrency();
ModelAndView model = new ModelAndView("redirect:/");
return model;
}
这是初始化服务函数
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);
}
}
}
避免重复的唯一可靠方法是在 属性:
上有一个实际的 unicity constraint
CREATE CONSTRAINT ON (n:Currency) ASSERT n.name IS UNIQUE;
SDN 4.[0-2](还)没有办法从模型中创建这样的约束(在 SDN 3.x 中有 @Indexed
或 @Indexed(unique = true)
注释),因此您必须 运行 独立查询(例如使用 Liquigraph!)。
在并发环境中通过查找来保护创建是不够的(顺序调用是可以的),因为读取和写入之间没有锁,这可能会导致以下交错执行的情况:
- 线程 A 检查是否存在,没有找到节点
- 线程 B 检查是否存在,也没有找到节点
- 线程 A 创建了一个名为 "USB"
的货币节点
- 线程B创建另一个同名货币节点
由于您最终得到重复项,因此发生了 2 个并发调用 。超时时间很短并配置为重试的负载均衡器?激活 HTTP 日志,在 Spring 控制器或服务中添加一些日志记录,使用 tcpdump
捕获流量等。一旦唯一性约束处于活动状态,隔离第二个调用会更容易,因为您将得到一个例外。
我的 neo4j 数据库有问题。当我尝试初始化数据时,它应该只是创建一个样本数据,但有时当我尝试初始化数据时,它会创建双样本数据。第二次来电无迹可寻。这是我的 Neo4j
的配置@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();
}
}
这就是我调用函数的方式
@RequestMapping(value = "/initCurrency")
public ModelAndView initCurrency() {
initializationService.initCurrency();
ModelAndView model = new ModelAndView("redirect:/");
return model;
}
这是初始化服务函数
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);
}
}
}
避免重复的唯一可靠方法是在 属性:
上有一个实际的 unicity constraintCREATE CONSTRAINT ON (n:Currency) ASSERT n.name IS UNIQUE;
SDN 4.[0-2](还)没有办法从模型中创建这样的约束(在 SDN 3.x 中有 @Indexed
或 @Indexed(unique = true)
注释),因此您必须 运行 独立查询(例如使用 Liquigraph!)。
在并发环境中通过查找来保护创建是不够的(顺序调用是可以的),因为读取和写入之间没有锁,这可能会导致以下交错执行的情况:
- 线程 A 检查是否存在,没有找到节点
- 线程 B 检查是否存在,也没有找到节点
- 线程 A 创建了一个名为 "USB" 的货币节点
- 线程B创建另一个同名货币节点
由于您最终得到重复项,因此发生了 2 个并发调用 。超时时间很短并配置为重试的负载均衡器?激活 HTTP 日志,在 Spring 控制器或服务中添加一些日志记录,使用 tcpdump
捕获流量等。一旦唯一性约束处于活动状态,隔离第二个调用会更容易,因为您将得到一个例外。