为什么我们使用DataSource而不是DriverManager?

时间:2013-03-04 09:30:35

标签: java jdbc datasource

我正在阅读Java JDBC规范(vr.4),并且我声明了这句话:

  

DataSource - 此接口是在JDBC 2.0 Optional中引入的   包API。它比DriverManager更受欢迎,因为它允许   有关基础数据源的详细信息,以便透明   应用

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

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

5 个答案:

答案 0 :(得分:61)

更好的可扩展性和维护

对于驱动程序管理器,您需要知道连接到数据库和获取连接的所有详细信息(主机,端口,用户名,密码,驱动程序类)。外部化属性文件中的内容并不会改变您需要了解它们的任何事实。

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

可扩展性:

假设你需要自己创建连接,你将如何处理不断变化的负载,有时当你有1000个用户时有10个用户,你不能只在需要时获得连接,然后“释放”它以便数据库服务器没有连接,这会导致连接池。 DriverManager没有提供它,DataSource也没有。

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

答案 1 :(得分:33)

DriverManager的。

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

数据源

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

答案 2 :(得分:3)

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

由于此行被评论,因此无需了解mySqlDataSource的网址。

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));
    }

}

}

答案 3 :(得分:1)

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

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();

答案 4 :(得分:0)

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