替换已弃用的`WrappingNeoServerBootstrapper`

wir*_*res 8 neo4j

我试图将一些Neo4J Java代码转换为2.2+,代码运行带有Web前端的嵌入式Neo4J服务器.

// configure embedded DB,
// but this doesn't start a server at port 12345 ?
final GraphDatabaseService db = new GraphDatabaseFactory()
    .newEmbeddedDatabaseBuilder("/path/to/db")
    .setConfig(ServerSettings.webserver_address, "localhost")
    .setConfig(ServerSettings.webserver_port, 12345)
    .newGraphDatabase();

// add shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread(){
    @Override public void run() {
        graphDb.shutdown();
    }
});
Run Code Online (Sandbox Code Playgroud)

启动服务器的已弃用代码读取:

final GraphDatabaseAPI api = (GraphDatabaseAPI)db;

final ServerConfigurator c = new ServerConfigurator(api);
c.configuration().addProperty(
    Configurator.WEBSERVER_ADDRESS_PROPERTY_KEY, "localhost");
c.configuration().addProperty(
    Configurator.WEBSERVER_PORT_PROPERTY_KEY, 12345);

new WrappingNeoServerBootstrapper(api, c).start();
Run Code Online (Sandbox Code Playgroud)

如果不这样做,则无法启动服务器.我不清楚如何在不使用已弃用的方法的情况下运行嵌入式服务器.有什么想法吗?

更新:

所以确实正确的答案似乎是:改变你的架构.

不应再使用嵌入式服务器,而应使用服务器和RESTful API.对于需要Java API的位,您可以编写非托管扩展(请参阅docs).

这是一个扩展名为https://github.com/histograph/neo4j-plugin的简单示例

谢谢!

Fro*_*its 3

2016 年 1 月更新

在评论中,您会注意到有关 neo4j 的某些事情正在发生变化。我认为这个答案的其余部分仍然有效,但如果您是一个时间旅行者,在 2016 年中期看到这篇文章,请查看新的 Neo4j 二进制协议(AFAIK,称为“bolt”)是否可用。

/结束更新

坏消息是包装 Neo 服务器 boostrapper 已被弃用,并且我认为没有办法在不使用已弃用的方法的情况下做到这一点。所以你的问题的简单答案是“不”。

也许一年前,我正在寻找与您相同的东西,但让我分享我在此期间学到的一些东西,可能会改变您的问题。

因此,当您使用嵌入式服务器时,您会获得某些优势,例如使用 java API 的能力,但也会遇到一些很大的缺点。将数据库与应用程序放在同一内存空间中意味着您必须在两者之间平衡内存。这意味着您无法在不停止数据库的情况下升级应用程序。

当您使用服务器时,很多事情都会变得更好,例如无需通过应用程序层即可运行 cypher 的能力、RESTful 服务的使用等等。

WrappingNeoServerBootstrapper 的问题(以及为什么它被弃用可能是件好事)是它具有这两种方法的缺点。当然,您可以获得 REST 服务和密码,但您仍然与应用程序位于相同的内存空间中。

从架构上来说,我们发现 Neo4j 的特点是,您通常只想使用外部独立服务器,然后通过 REST 服务与其进行通信。我认为neo4j正在研究二进制协议(ala JDBC,但当然不是同一件事),这样也许可以开放更多的java API并且性能会提高。与此同时,neo4j 的所有优秀库(包括 spring-data 和其他库)都已经可以与 HTTP 端点通信,因此它们提供的任何功能通常都可以使用单独的服务器来完成。为了应用程序的可维护性以及 Neo4j 本身的可调整性,运行单独的服务器几乎总是会更好。

请注意,此建议模仿了您在几乎所有其他类型的数据库(mongo、oracle 等)中看到的情况。有些为小型/专业应用程序提供嵌入式选项,但几乎所有这些都假设您将运行单独的服务器进程并让您的应用程序与之通信。所以这根本与图表无关,而与良好的应用程序设计、可演化性和可维护性有关。

因此,出于这些原因,WrappingNeoServerBootstrapper 被弃用(并且可能不会回来)是可以接受的。我的经验表明这不是你真正应该做的事情。

  • 这个问题是相关的,建议不要使用嵌入式不是正确的答案。 (2认同)