97

我正在阅读 Java JDBC 规范(vr. 4),我遇到了这个声明:

DataSource——这个接口是在 JDBC 2.0 Optional Package API 中引入的。它优于 DriverManager,因为它允许有关底层数据源的详细信息对应用程序透明

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

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

4

5 回答 5

76

更好的可扩展性和维护

因为DriverManager您需要知道所有详细信息(主机、端口、用户名、密码、驱动程序类)才能连接到 DB 并获得连接。将它们外部化到属性文件中并不会改变您需要了解它们的事实。

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

可扩展性:

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

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

于 2013-03-04T10:04:32.097 回答
41

DriverManager

  • 由于在 java 类中创建/关闭连接,会妨碍应用程序的性能。
  • 不支持连接池。

DataSource

  • 由于连接不是在类中创建/关闭,因此提高了应用程序性能,它们由应用程序服务器管理,并且可以在运行时获取。
  • 它提供了一个创建连接池的工具
  • 有助于企业应用
于 2013-03-04T09:43:58.410 回答
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));
    }

}

}
于 2017-04-13T14:16:35.667 回答
3

DataSourceDataSource对象可以提供连接池和分布式事务,因此如果您需要这些功能之一或两者,您可能必须使用这些功能。

于 2017-06-11T17:34:07.127 回答
1

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

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
于 2016-07-22T04:36:43.140 回答