【问题标题】:How to set up JNDI DataSource with PostgreSQL?如何使用 PostgreSQL 设置 JNDI 数据源?
【发布时间】:2021-02-11 08:59:30
【问题描述】:

我正在学习 Java EE。我的导师告诉我在我的学习项目中实现 JNDI 数据源。我找到了一些关于该主题的文章,但我看不清楚执行此操作的步骤。

我的培训项目是一个 Spring MVC 应用程序。在前端,它有一些 Thymeleaf 模板,数据取自 PostgreSQL 数据库。

这里应该做些什么来实现JNDI?我什至不知道我为什么需要它。我只是被告知这个配置应该被认为是过时的和低级的,但我不知道为什么。

现在数据库配置如下:

  • 具有以下内容的道具文件:
driver=org.postgresql.Driver
url=jdbc:postgresql://localhost/trainingproject
dbuser=postgres
dbpassword=Password
  • .sql 文件,如下所示:
DROP TABLE IF EXISTS table1;
CREATE TABLE table1
(
    row1 SERIAL PRIMARY KEY,
    row2 CHARACTER VARYING(64)
);
  • DataSource bean:
@Bean
public DataSource datasource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(environment.getProperty(DRIVER));
    dataSource.setUrl(environment.getProperty(URL));
    dataSource.setUsername(environment.getProperty(USER));
    dataSource.setPassword(environment.getProperty(PASSWORD));
}

【问题讨论】:

    标签: java spring postgresql jndi


    【解决方案1】:

    DataSourcePGSimpleDataSource 实现与 JDBC 驱动程序捆绑在一起。

    https://jdbc.postgresql.org 的 Postgres 的 JDBC driver 包括 DataSource 的实现:PGSimpleDataSource

    PGSimpleDataSource ds = new PGSimpleDataSource() ;  
    ds.setServerName( "localhost" );  
    ds.setDatabaseName( "your_db_name_here" );   
    ds.setUser( "scott" );       
    ds.setPassword( "tiger" );   
    

    更多信息:

    JNDI

    您的问题将两个问题混为一谈:DataSourceJNDI

    DataSource 是一个简单的对象,它包含与数据库建立连接所需的所有连接信息。这包括用户名、密码、数据库服务器的地址以及任意数量的标准和专有功能设置。 专有,我的意思是 Postgres 特定的功能设置与 Microsoft SQL Server 特定的与 Oracle 特定的等等。查看DataSource 的 Javadoc 看看它有多简单,基本上只是一个 @987654330 @ 方法。无论有无 JNDI,您都可以获得DataSource 对象;这两个是正交问题。

    JNDI 要复杂得多。 JNDI 是一个接口,用于从naming/directory server 获取应用程序在运行时所需的配置信息。在这样的服务器上使用这个接口意味着你不需要在你的代码库中包含部署细节;您可以在运行时即时查找所需的详细信息。

    数据库连接信息只是您可能希望从 JNDI 服务器获取的多种信息之一。您还可以查找web services 服务器、logging 服务等。

    因此,与其对数据库连接信息进行硬编码,不如在启动应用时“发现”正确的数据库连接信息。您的测试机器将使用伪造的数据库服务器,而您的生产部署机器将使用不同的数据库服务器。这些数据库服务器在编译时可能不为程序员所知,甚至可能还不存在。需要进行查找,而 JNDI 是一种无需供应商锁定的标准方式。

    如何将数据库连接信息配置为由符合 JNDI 的命名/目录服务器作为DataSource 对象传递到您的应用程序,这取决于您企业的特定服务器环境。鉴于您的最后一个代码示例,看起来您实际上并没有在您的课程中访问 JNDI 服务器,因此 JNDI 没有实际意义。

    【讨论】:

    • 非常感谢!我提到的所有这些配置元素应该只替换 DataSource bean,其余的(.sql 文件、.properties 文件、WebConfiguration 等)可以保持原样吗?
    • @Danny 我添加了另一个部分 (JNDI) 可以解决您的评论问题。我避免使用 Spring,所以我无法为您提供更多帮助。
    • 太棒了!非常感谢您的详细解释。是的,到目前为止,这个培训项目中还没有 JNDI 服务器。但它也可以在没有服务器的情况下工作,对吧?
    • 到目前为止我也不喜欢 Spring,但它是我课程的一部分。也许有一天我会喜欢它...
    • @Danny DataSource 对象独立于 JNDI。正如我在我的答案中所示,您可以通过编程方式实例化 DataSource 对象。或者,您可以要求正确配置的 JNDI 服务器在运行时向您提供 DataSource 对象。也许第三种可能性是让 Spring 给你一个 DataSource 对象,我猜这就是你最后一个代码示例所做的。我不使用Spring,所以我只能在那里推测。我您可能会使用我的答案中显示的代码来更改@Bean public DataSource datasource() 方法的内容。
    猜你喜欢
    • 2013-05-04
    • 2012-02-01
    • 2012-02-15
    • 2012-09-14
    • 1970-01-01
    • 2014-10-05
    • 2018-10-13
    • 2015-03-16
    • 2016-01-02
    相关资源
    最近更新 更多