我读了Java JDBC规范(VR 4)和我encountred这样的说法:
数据源 - 此接口的JDBC 2.0可选包API中推出。 它优于DriverManager的,因为它允许对底层数据源的信息是透明的应用程序
我想了解的区别是什么之间Connection
和DataSource
,为什么它的存在。 我的意思是,上面的块说,有关数据源的细节是透明的应用程序,但不会外在的数据库性能,如用户名,密码,URL等属性文件,然后使用DriverManager的工作以同样的方式?
并且在DataSource
接口只建立在回去可以合用等连接的一种常见的方式? 在Java EE,并应用服务器实现这个接口和应用程序部署到对数据源,而不是连接的参考?
更好的扩展性和维护
对于驱动程序管理器,你需要知道所有的细节(主机,端口,用户名,密码,驱动类)连接到数据库,并获得连接。 这些外部化的属性文件并不会更改,你需要知道他们实际上什么。
使用DataSource,你只需要知道的JNDI名称。 应用程序服务器关心的细节,而不是由客户端应用程序供应商配置,而是通过在应用程序托管的管理。
可扩展性:
假设你需要自己创建连接,您将如何应对不断变化的负载,有时有10位用户有时你1000,你不能只是得到一个连接时,你需要一个后来“释放”它,因此数据库服务器不会走出连接,从而导致你的连接池。 DriverManager的不提供它,数据源一样。
如果你要那么程序的连接池,你必须使用DriverManager的,与数据源,否则去了。
下面的代码显示了用于获取连接双向的。
有没有必要了解一下的情况下,URL 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));
}
}
}
我们可以用一个数据源如下获取连接。 使用连接执行任何数据库查询。
DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
数据源对象可以提供连接池和分布式事务,所以你可能有,如果你需要的一种或两种这些功能使用的数据源。