如何使用 PostgreSQL 设置 JNDI 数据源?

How to set up JNDI DataSource with PostgreSQL?

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

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

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

现在数据库配置如下:

driver=org.postgresql.Driver
url=jdbc:postgresql://localhost/trainingproject
dbuser=postgres
dbpassword=Password
DROP TABLE IF EXISTS table1;
CREATE TABLE table1
(
    row1 SERIAL PRIMARY KEY,
    row2 CHARACTER VARYING(64)
);
@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));
}

PGSimpleDataSource DataSource 的实现与 JDBC 驱动程序捆绑在一起。

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

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

更多信息:

JNDI

您的问题混淆了两个问题:DataSourceJNDI

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

JNDI is much more complex. JNDI is an interface for obtaining from a naming/directory server 您的应用在运行时所需的配置信息。将此接口用于此类服务器意味着您无需在代码库中包含部署细节;您在运行时查找所需的详细信息 on-the-fly。

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

因此,您可能希望在启动应用程序时“发现”正确的数据库连接信息,而不是 hard-coding 您的数据库连接信息。您的测试机器将使用伪造的数据库服务器,而您的生产部署机器将使用不同的数据库服务器。这些数据库服务器在编译时可能不为程序员所知,甚至可能还不存在。 look-up 需要完成,JNDI 是没有供应商 lock-in.

的标准方法

如何配置数据库连接信息以由 JNDI-compliant naming/directory 服务器作为 DataSource 对象传递给您的应用程序,具体取决于您企业的特定服务器环境。鉴于您的最后一个代码示例,看起来您实际上并没有访问 class 中的 JNDI 服务器,因此 JNDI 没有实际意义。