简而言之
DataSource
是一种将连接数据库所需的信息外部化的方式:服务器名称或地址、用户名、用户密码、特定于您的特定数据库引擎的设置等。
DriverManager
在你初学时使用很好。但是在部署到生产环境时,您不希望在代码库中硬编码连接信息。在实际工作中,使用 DataSource
而不是 DriverManager
来访问外部化的配置信息(地址、名称、密码等)。
Connection
是你与数据库的实时连接。一个 DataSource
对象将利用 DriverManager
为您获取一个 Connection
对象,以便您在查询数据库时使用它。
详细信息
让我们来看看您的问题的具体内容。
我试图了解的是 Connection
和 DataSource
之间的区别是什么
一个
Connection
对象表示与数据库服务器的实时会话,来回进行查询并获取结果。
一个
DataSource
对象保存了连接到数据库所需的凭据。通常,
DataSource
保存了被数据库服务器识别的用户名、该用户的密码以及各种设置,以自定义与数据库的任何未来会话。一个
DataSource
不是“打开”或“关闭”的;它仅仅保存了创建一个已经打开或关闭的
Connection
所需的信息。
为什么它存在
Connection
作为与数据库服务器交流的管道而存在。
“DataSource”存在的目的是为了避免在应用程序代码中硬编码连接信息(用户名、密码、选项)。在实际工作中,当您部署应用程序后,您不希望因为
DBA更改密码而不得不编辑代码、重新编译和重新部署。
作为一个程序员,您不希望受到部署问题的影响,例如数据库服务器的机器网络地址、用户名、用户密码等。您希望将这些信息外部化到代码库之外。
“externalizing database properties such as username, password, url etc in a property file and then use DriverManager work in the same way?”
不是的。您的代码仍然会被硬编码为寻找该属性文件。但是,DBA和SysAdmins还有其他方法来配置和传达连接信息(用户名、密码、服务器地址等)。Java程序员不应该对部署期间做出的选择和更改做出假设。
主要将信息外部化的方法是将信息放置在
目录服务器中。有许多目录服务器实现。这些通常可以通过标准化接口(例如
LDAP接口)进行访问。
Java提供了一种机制,使您的基于Java的应用程序能够通过标准化接口与目录服务交互。这个机制被称为
Java命名和目录接口(JNDI)。
通过JNDI,您的应用程序可以
请求目录服务提供一个带有必要连接信息的DataSource
对象。通过使用JNDI,您的应用程序不需要对DBA/SysAdmin选择如何向应用程序提供此连接信息做出假设。事实上,作为程序员,您无需了解他们的部署选择和更改方面的任何信息。
DataSource
接口是否只是为了创建一种通用的返回连接的方式,以便可以对其进行池化等操作?
一个调用
DataSource#getConnection
返回的连接可能是连接池的一部分,也可能不是。作为Java程序员,您通常不需要关心这个。在部署时,DBA/SysAdmins 可能最初使用非连接池连接进行部署。然后稍后他们可能改用连接池连接。同样,您无需关心,也没有必要编辑您的代码,重新编译和重新部署。DBA可以在不涉及您的情况下更改连接池设置。
在Java EE中,应用服务器是否实现此接口并且部署的应用程序具有对数据源的引用而不是连接?
FYI,Java EE现在被称为
Jakarta EE,在
Oracle Corp 将责任转移给
Eclipse Foundation 后更名。
您可以在任何类型的Java应用程序中使用
JDBC和
DataSource
对象:
控制台, 桌面 (
JavaFX/
Swing/
SWT),
Web应用程序,
微服务等。
如果您所说的“此接口”是指
DataSource
接口……不,像
Tomcat、
Jetty、
Glassfish、
Payara、
WildFly、
JBoss、
Open Liberty这样的Jakarta EE实现并没有实现
DataSource
。通常
JDBC驱动程序提供了一个实现,或者您的连接池实现提供了一个实现。
同样,在部署时由DBA/SysAdmin配置,而不是在开发期间由程序员配置。您不应该将JDBC驱动程序与您的Jakarta EE应用程序捆绑在一起。相反,应该配置您的依赖管理器(如Maven、Gradle等)使驱动程序在开发期间可用,但在最终部署文件(
.war
文件等)中不可用。
该 Jakarta EE 实现会处理获取应用程序的
DataSource
对象。实现本身可能充当目录服务;例如,Tomcat 可以在其自己的配置文件中保存连接信息,然后将该信息作为
DataSource
对象传递给您的应用程序。或者,DBA/SysAdmin 可以配置 Jakarta EE 实现以连接到单独的目录服务器实现,例如
Microsoft Active Directory 或
OpenLDAP。再次强调,这些细节都不是 Java 程序员需要关心的。
在 Jakarta EE 部署中,Jakarta EE 实现向您的应用程序提供一个
DataSource
对象。然后,您的应用程序代码在需要与数据库服务器通信时调用
getConnection
。您的应用程序代码在完成与数据库服务器通信后关闭生成的
Connection
对象。
提示:使用try-with-resources语法自动关闭连接、语句和其他JDBC资源。如上所述,
DataSource
对象不是这种意义上的资源,它本身不会被打开或关闭。