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

我正在阅读Java JDBC规范(第4版),并列举了以下声明:

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

我想了解的是ConnectionDataSource之间的区别,以及为什么它存在。 我的意思是,上面的块说,数据源的细节对于应用程序是透明的,但是不会在属性文件中将数据库属性如用户名,密码,url等外化,然后使用DriverManager工作方式相同?

而且DataSource接口的创build只是为了有一个返回可以被集中的连接等常见的方法? 在Java EE中,应用程序服务器是否实现了此接口以及部署的应用程序是否具有对数据源的引用,而不是连接?

更好的可扩展性和维护

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

使用数据源只需要知道JNDI名称。 AppServer关心的细节并不是由客户端应用程序的供应商configuration的,而是由托pipe应用程序的pipe理员configuration的。

可扩展性:

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

如果你打算编写连接池,那么你必须使用DriverManager,否则使用DataSource。

DriverManager的。

  • 在Java类中创build/closures连接时阻碍应用程序的性能。
  • 不支持连接池。

数据源

  • 由于连接不在类中创build/closures,因此应用程序性能得到提高,它们由应用程序服务器pipe理,可在运行时获取。
  • 它提供了一个创build连接池的设施
  • 有助于企业应用程序

我们可以按照如下方式使用数据源进行连接。 使用连接执行任何数据库查询。

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

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

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

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