小编Mar*_*ian的帖子

使用 Spring Boot 和嵌入式驱动程序测试 Neo4j

问题

我使用 Neo4j 数据库构建了一个应用程序。我喜欢使用 Spring Boot 的@DataNeo4jTest注释测试一些自定义 Cypher 查询(另请参阅Spring Boot Test - Neo4j),但我遇到了以下任一问题:

  • 该测试尝试使用 BOLT 驱动程序连接到 Neo4j 实例。
  • 测试无法加载嵌入式驱动程序。

细节

我的依赖项是按照Spring Data Neo4j 参考文档使用 Maven 管理的。SDN 文档的第 10.3.1 节解释了:

默认情况下,SDN 将使用 BOLT 驱动程序连接到 Neo4j,您无需在 pom 中将其声明为单独的依赖项。如果要在生产应用程序中使用嵌入式或 HTTP 驱动程序,还必须添加以下依赖项。(如果您只想使用嵌入式驱动程序进行测试,则不需要这种对嵌入式驱动程序的依赖。有关更多信息,请参阅下面的测试部分)。

因此,我的相关部分pom.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi=...>
    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        ...
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency> …
Run Code Online (Sandbox Code Playgroud)

neo4j maven spring-data spring-boot spring-boot-test

5
推荐指数
1
解决办法
3173
查看次数

复合模式中的内存管理

在过去的几周里,我一遍又一遍地遇到同样的问题.归结为它的核心,我构建了一个(有向无环)对象层次结构,如:

  • a -> c
  • b -> c
  • b -> d

一个实例可以有多个父项和多个子项.c可能是读者和作家之间共享的价值.b可能是一个复合值.层次结构很容易由工厂创建 - 例如a.setChild(new C()).后来,客户只关心根,对她称getValue()setValue().

我的问题是:谁清理了层次结构?谁负责调用deleteb还是c

  1. 选项 - 工厂创建节点,工厂必须删除节点: 我不喜欢这个选项,因为我理解工厂作为替代new.保持工厂直到它创建的实例可以被销毁,这感觉很奇怪.

  2. 选项 - "智能"指针: 不太好,因为它污染了界面,并为诸如指针之类的简单事物引入了很多复杂性.

  3. 选项-任何内存管理的曲线状类: 该类收集的所有节点a,b,c,d,...,并提供访问根.节点本身相互引用,但不删除子节点或父节点.如果"图形"或复合管理器被销毁,它将销毁所有节点.

我更喜欢最后一个选项.然而,它使层次结构的构造复杂化.您可以在外部构建层次结构,并告诉图表每个节点,或者在图形内部构建层次结构,这类似于选项1.图表只能删除,它知道什么.因此,如果必须将节点传递给图形,则设计中会出现内存泄漏.

有这个问题的模式吗?您更喜欢哪种策略?

编辑1 - 2014年9月1日:抱歉,对于智能指针没有特别说明.我试图避免另一个"何时使用智能指针问题",而是将问题集中在替代解决方案上.但是,我愿意使用智能指针,如果它们确实是最好的选择(或者如果必要的话).

在我看来,签名setChild(C* child)应该是首选,setChild(std::shared_ptr<C> child)原因与每个循环应优先于迭代器相同.但是,我必须承认,像std:string共享指针一样,它的语义更具体.

就复杂性而言,现在节点内的每个操作都必须处理共享指针.std::vector<C*>变得std::vector< std::shared_ptr<C> >,...此外,每个指针都带有一个引用计数,如果有其他选项可以避免.

我应该补充一点,我开发了一个实时系统的低级部分.它不是固件而是关闭.

编辑2 - 2014年9月1日: 感谢您的所有意见.我的具体问题是:我得到一个字节数组,让我们说传感器数据.在某些时候,我被告知哪个值写在该数组中的哪个位置.一方面,我想要从数组中的位置到原始值(int32,double,...)的映射.另一方面,我想将原始值合并到复杂类型(结构,向量,......).不幸的是,并非所有映射都是双向的.例如.我可以读取值之间的比较,但我不能根据比较结果写入值.因此,我将读者和作者分开,并在必要时让他们访问相同的值.

c++ memory-management factory graph composite

3
推荐指数
1
解决办法
231
查看次数