Why do we use a DataSource instead of a DriverManager?

JavaJdbcDatasource

Java Problem Overview


I am reading the Java JDBC specification (vr. 4) and I encountred this statement:

> DataSource — this interface was introduced in the JDBC 2.0 Optional > Package API. It is preferred over DriverManager because it allows > details about the underlying data source to be transparent to the > application

What I am trying to understand is what the difference is between a Connection and a DataSource, and why it exists. I mean, the block above says that the details about a datasource is transparent to the application, but wouldn't externalizing database properties such as username, password, url etc in a property file and then use DriverManager work in the same way?

And is the DataSource interface created only to have a common way of returning connections that can be pooled etc? In Java EE, does the application server implement this interface and the applications deployed to have a reference to a datasource instead of a connection?

Java Solutions


Solution 1 - Java

Better scalability and maintenance

For DriverManager you need to know all the details (host, port, username, password, driver class) to connect to DB and to get connections. Externalizing those in a properties file doesn't change anything about the fact that you need to know them.

Using a DataSource you only need to know the JNDI name. The AppServer cares about the details and is not configured by the client application's vendor, but by an admin where the application is hosted.

Scalability:

Suppose you need to create connections yourself, how would you deal with changing load, sometime you have 10 users sometime you have 1000, you can't just get a connection whenever you need one and later 'release' it so the Database server does not get out of connections, which leads you to connection pooling. DriverManager does not provide it, DataSource does.

If you are going to program a connection pool yourself then you have to use DriverManager, otherwise go with DataSource.

Solution 2 - Java

DriverManager

  • hampers the application performance as the connections are created/closed in java classes.
  • does not support connection pooling.

DataSource

  • improves application performance as connections are not created/closed within a class, they are managed by the application server and can be fetched while at runtime.
  • it provides a facility creating a pool of connections
  • helpful for enterprise applications

Solution 3 - Java

Below code shows two way for getting connection.

There is no need to know about URL in case of mySqlDataSource as this line is commented.

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

}

}

Solution 4 - Java

DataSource objects can provide connection pooling and distributed transactions, so you may have to use DataSource if you need one of or both these features.

Solution 5 - Java

We can get connection using a datasource as follows. Use the connection to perform any database query.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLuckyLukeView Question on Stackoverflow
Solution 1 - JavaA4LView Answer on Stackoverflow
Solution 2 - JavaNaveenKumar1410View Answer on Stackoverflow
Solution 3 - JavaRam TiwaryView Answer on Stackoverflow
Solution 4 - JavaKoray TugayView Answer on Stackoverflow
Solution 5 - JavaansrajuView Answer on Stackoverflow