通过 tomcat 上下文文件和 spring 上下文声明数据源之间的区别

Difference between declaring data source via tomcat context file and spring context

META-IF/context.xml 文件中声明 DataSource 与使用 JNDI 查找(方法 1)从 spring bean 获取它之间有什么区别,或者只是声明 DataSource 直接通过 Spring (方法 2),如:

@Bean(destroyMethod = "close")
DataSource dataSource(Environment env) {
    HikariConfig dataSourceConfig = new HikariConfig();
    dataSourceConfig.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DB_DRIVER_CLASS));
    dataSourceConfig.setJdbcUrl(env.getRequiredProperty(PROPERTY_NAME_DB_URL));
    dataSourceConfig.setUsername(env.getRequiredProperty(PROPERTY_NAME_DB_USER));
    dataSourceConfig.setPassword(env.getRequiredProperty(PROPERTY_NAME_DB_PASSWORD));

    return new HikariDataSource(dataSourceConfig);
}

我认为第二种方法更好,因为它不依赖于特定的服务器,这意味着如果我们使用第一种方法并且有一天迁移到另一个服务器,我们必须在第二个服务器中调整上下文文件的策略(不对?)。

谢谢

第一种方法的一些要点(容器中定义的数据源的 JNDI 查找):

  • 可以在不接触实际应用程序的情况下进行配置
  • 可以更好地保护敏感信息(如密码)
  • DataSource 可以在同一台服务器上的多个应用程序之间共享

出于安全(或"security")原因,我在需要时使用第一种方法 - 通常,客户的要求是数据库访问密码不得以纯文本形式存储在应用程序中。对此可能的回应是 根本不将密码存储在您的应用程序中,而是让客户通过 JNDI 提供数据源。

从系统管理的角度来看,这也是有意义的——如果数据源需要重新配置,很可能是由于某些基础设施或网络发生变化,所以这应该在管理员的权力范围内(而且他们的责任)也重新配置数据源。 servlet容器应该是这样的地方。

如果我不需要以上任何一种方法,我会使用第二种方法(不那么复杂,更容易部署)。

如果有多个应用程序使用您的数据库。我们可以配置 DataSource 内部容器,而不是让每个应用程序管理其数据库配置,我们将让应用程序指向该共享配置。这也将帮助您在所有应用程序之间共享 Db 连接池。

不好意思,我刚刚在SO中搜索到类似的答案(否则我不会发布这个答案)

JNDI really shines when you have to move an application between environments: development to integration to test to production. If you configure each app server to use the same JNDI name, you can have different databases in each environment and not have to change your code. You just pick up the WAR file and drop it in the new environment.

Here are some other assumptions that are crucial to know when judging this answer:

I don't have access to the servers on which the code is deployed at all, except for read-only access to logs. The person who writes and packages the code is not the same person who configures and manages the server. Once a WAR file starts on its journey to PROD it cannot be changed again without going back to the beginning. Any testing that's done by QA on the test server must be re-done if the WAR is altered. Perhaps you don't see this benefit because you're a lone developer who writes code on a local desktop and deploys right to production.

来源:Why use JNDI