为什么我们使用数据源而不是DriverManager?


89

我正在阅读Java JDBC规范(版本4),并且遇到了以下语句:

DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明

我想了解的是aConnection和a之间的区别DataSource以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(如用户名,密码,URL等),然后以相同的方式使用DriverManager?

并且DataSource创建接口只是为了以一种通用的方式返回可以合并的连接吗?在Java EE中,应用程序服务器是否实现此接口,并且部署的应用程序具有对数据源而不是连接的引用?

Answers:


72

更好的可扩展性和维护

对于 DriverManager您需要了解所有详细信息(主机,端口,用户名,密码,驱动程序类)才能连接到数据库并获得连接。将这些属性外部化在属性文件中不会改变您需要了解它们的事实。

使用aDataSource只需知道JNDI名称。AppServer关注细节,不是由客户端应用程序的供应商配置,而是由托管应用程序的管理员配置。

可扩展性:

假设您需要自己创建连接,如何处理不断变化的负载,有时您有10个用户,有时您有1000个用户,那么只要需要一个连接并稍后“释放”它就不能获得连接,因此数据库服务器不会摆脱连接,这将导致您进入连接池。DriverManager不提供,提供DataSource

如果您要自己编写连接池,则必须使用DriverManager,否则请使用DataSource


4
数据源实现是由驱动程序供应商提供的(例如MySQL)。应用服务器需要知道驱动程序才能创建数据源。之后,它负责将其绑定到已配置的JNDI名称(逻辑名称)。请注意,对于此配置步骤,所有详细信息(驱动程序类,URL,用户名,密码等)都必须已知。但这仍然比客户端应用程序知道这些要好。
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.-你把名字翻了吗?
2014年

3
@arun我不这么认为,DriverManager是比DataSource低级别的API。
A4L

9
@CodeChieftain我认为他的意思是,如果您想自己实现一个连接池,那么没有什么可翻转的。
Koray Tugay

2
数据源提供连接轮询。最后一条语句指出是否要对连接轮询进行编程,请使用DataManager。起初可能会产生误导。应该是如果您希望在应用程序中进行连接轮询以获取数据源。
Aniket Thakur

38

DriverManager

  • 当在Java类中创建/关闭连接时,会影响应用程序的性能。
  • 不支持连接池。

DataSource

  • 由于未在类内创建/关闭连接,而是由应用程序服务器管理这些连接,并且可以在运行时进行获取,因此可以提高应用程序性能。
  • 它提供了创建连接池的工具
  • 对企业应用程序有帮助

但是,如果您创建了自己的类(例如MyConnectionPool),并且使用DriverManager在其中进行了一些魔术操作,是否与使用实现DataSource接口的类相同?数据源接口是否仅用于具有公共接口来进行连接?
LuckyLuke

1
不完全相同,像spring这样的框架显示了dataSource的功能及其性能。
nav0611 2013年

3

下面的代码显示了两种获取连接的方法。

mySqlDataSource注释此行的情况下,无需了解URL 。

public class MySqlDataSourceTest {

public static void main(String[] args) throws SQLException, ClassNotFoundException {


    /************** using MysqlDataSource starts **************/
    MysqlDataSource d = new MysqlDataSource();
    d.setUser("root");
    d.setPassword("root");
//  d.setUrl("jdbc:mysql://localhost:3306/manavrachna");
    d.setDatabaseName("manavrachna");
    Connection c =  (Connection) d.getConnection();
    /************** using MysqlDataSource ends**************/


    /************** using DriverManager start **************/
    Class.forName("com.mysql.jdbc.Driver");
    Connection c=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/manavrachna","root","root");
    /************** using DriverManager ends **************/

    Statement st=(Statement) c.createStatement();
    ResultSet rs=st.executeQuery("select id from employee");
    while(rs.next())
    {
        System.out.println(rs.getInt(1));
    }

}

}


1

我们可以使用数据源获得连接,如下所示。使用该连接来执行任何数据库查询。

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.