当前位置:Java -> 如何从Spring Boot应用程序验证数据库连接

如何从Spring Boot应用程序验证数据库连接

最近,我一直在为Spring Data Neo4j创建一个自学习课程,并希望用户能够测试数据库连接。通常,在使用Spring Data的Spring Boot应用程序中,你会将数据库凭据作为属性设置在application.properties文件中。你可以只使用这些详细信息来运行应用程序,但只有当数据库URI具有不正确的语法时,它才会失败。应用程序实际上并没有测试连接是否有效并成功连接。

在这篇博文中,我将向您展示如何在Spring Boot应用程序中,使用Driver类的verifyConnectivity()方法测试连接到Neo4j数据库。

测试连接的方法

你可能会问:“为什么应用程序不测试连接?”这是因为它不是一个配置属性,所以我们必须在运行时测试它。有几种不同的方法可以处理这个问题。

  1. 使用带有驱动程序的CommandLineRunner并使用verifyConnectivity()方法。
  2. 将CommandLineRunner移到它自己的配置类中(更清洁)。
  3. 编写一个使用verifyConnectivity()方法的测试。
  4. 编写使用连接的应用程序功能(领域,存储库,控制器类)。

我过去做的最后一种选择是因为我没有专注于这一步骤的连接。然而,这不是测试连接的理想选择,因为它需要你写很多不必要的代码。如果连接有问题,那么当出现问题时,我们必须排除更多的代码。我们只想处理数据库连接。

第一种和第二种选择是我的下一个方法,并且是相当不错的选择,但需要你运行整个应用程序。一旦你有了测试方法,它要么每次与其一起运行,要么你必须注释掉/删除那部分代码。

第三种选择是最好的,因为它是一个随时可以运行的测试。它不会增加实际应用程序的开销,并且只有在需要时才能运行单个测试。这将是我们的目标,但我也会向您展示如何编写第一种和第二种选择。

verifyConnectivity()方法

首先,让我们看看verifyConnectivity()方法。直到现在我才意识到它的存在,所以我做了一些研究。在Java API文档中的信息显示,它验证驱动程序是否能够连接到数据库,如果无法连接,则会抛出异常。这正是我们想要的!

该方法是Driver类的一部分,它是Neo4j Java Driver的一部分。因此,为了执行verifyConnectivity()方法,我们将需要创建一个驱动程序对象。

设置:创建一个Spring Boot项目

让我们从创建一个Spring Boot项目开始。我喜欢通过Spring Initializr网站来完成这件事。我将使用以下设置:

Spring Initializr settings

Spring Initializr settings

一旦你下载了项目,用你喜欢的IDE打开它。我们需要做的第一件事是在application.properties文件中设置数据库凭据。这将给我们一些内容来测试。

如果你还没有运行Neo4j的实例,你可以在几分钟内启动一个免费的Neo4j Aura云实例。Neo4j Aura是一个完全托管的云数据库服务。一旦你有了实例,你可以从Aura控制台获取连接URI。

接下来,打开application.properties文件并添加以下属性:

spring.neo4j.uri=neo4j+s://dbhash.databases.neo4j.io
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=test
spring.data.neo4j.database=neo4j


请注意,至少你需要更新URI和密码字段以匹配你的实例(用户名和数据库字段默认值,除非你稍后自定义它们)。现在,我们可以创建一个CommandLineRunner类来测试连接。

我们将在伴随的GitHub项目的不同分支中展示本文中要覆盖的每一项选择。你可以通过检出每一项的分支来跟进。在测试类中,main分支是首选解决方案。

选项1:使用CommandLineRunner 

有了准备的项目,我们可以开始添加代码来测试数据库连接。打开主应用程序类(如果你的项目名是verify-connectivity,则为VerifyConnectivityApplication.java),并添加代码使其与下面的类匹配:

@SpringBootApplication
public class VerifyConnectivityApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(VerifyConnectivityApplication.class, args);
    }

    final Driver driver;
  
    public VerifyConnectivityApplication(@Autowired Driver driver) {
        this.driver = driver;
    }

    public final void run(String... args) {
        driver.verifyConnectivity();
    }
}


我们让我们的类实现CommandLineRunner 接口,以便我们创建的bean在应用启动时运行。接下来,我们在第17行注入驱动并创建一个使用该驱动的构造函数在第19行

第23行是我们实际测试连接的地方。我们实现了run()方法,它使用Driver对象调用其verifyConnectivity()方法。如果连接成功,该方法将返回0成功状态码。如果连接失败,则该方法将抛出异常,应用程序将以错误代码退出。

我们可以通过运行应用程序来测试这一点。如果输出返回0状态代码,那么它就像应该的那样工作。您还可以通过将一些错误数据放入application.properties文件中并再次运行该应用程序来测试它是否失败。

在主应用程序类中测试连接不是最佳解决方案,因为我们在主类中加入了测试代码。我们可以通过将此代码移至自己的配置类来使其更清晰些。

选项2:设置一个配置类

通过该选项,我们实际上并没有改变任何功能,而是将一部分配置代码移到了一个单独的类中。这将使我们的主应用程序类保持干净,并专注于应用程序的主要功能。

首先,我们需要创建一个新的Java类。您可以给它取任何您喜欢的名字,但我把它叫做Config.java。打开该类并将主应用程序类中的代码复制/粘贴到配置类中,以便您的配置类看起来像以下内容:

@Configuration
public class Config implements CommandLineRunner {

    final Driver driver;

    public Config(@Autowired Driver driver) {
        this.driver = driver;
    }

    public final void run(String... args) {
        driver.verifyConnectivity();
    }
}


确保您从主类中删除了复制的代码,然后再次测试应用程序。它应该和之前一样工作,当0状态代码意味着成功时,但是现在我们已经将连接测试代码分离到了应用程序的配置部分。

这种解决方案也并不理想,因为我们仍然需要运行整个应用程序来测试连接。我们可以通过在测试类中编写一个测试来更好地解决这个问题,这样只有在需要检查该功能时才运行。

选项3:写一个测试

第三个选项是最好的。它不会增加实际应用程序的开销,我们可以根据需要运行一个单独的测试。为此,我们需要打开VerifyConnectivityApplicationTests.java文件并添加以下代码:

@SpringBootTest
class VerifyConnectivityApplicationTests {

    final Driver driver;

    public VerifyConnectivityApplicationTests(@Autowired Driver driver) {
        this.driver = driver;
    }

    @Test
    final void testConnection() {
        driver.verifyConnectivity();
    }
}


您还需要删除Config.java类,因为我们不再需要它。现在,我们可以运行测试,它将验证连接。如果连接成功,则测试将通过。如果连接失败,则测试将失败。您可以更改application.properties中的值来验证您得到了预期的成功和失败结果。

这个版本的代码更加清晰,因为我们想要测试连接,所以把这部分代码放在测试类中是有意义的。对于更严格和全面的应用程序测试,我们可以进一步改进,使用像Neo4j harness或Testcontainers这样的测试套件,但这超出了这篇博客文章的范围。在我们的情况下,创建一个简单的测试来验证我们的应用程序是否可以连接到数据库就足够了。

总结!

在今天的文章中,我们了解了如何使用verifyConnectivity()方法来测试从Spring Boot应用程序连接到Neo4j数据库。我们看到了三种不同的方法,并讨论了每种方法的优缺点。我们还讨论了为什么最佳选项是利用测试类并编写一个测试。如果连接成功,则测试通过。如果连接失败,则测试失败,我们可以调查连接详细信息。

愉快的调试!

资源

推荐阅读: 字节跳动面经(13)

本文链接: 如何从Spring Boot应用程序验证数据库连接