以下是使用DataSource
的一些比较,以及从https://stackoverflow.com/a/19674833/1224441
DriverManager
使用JDBC,我们可以使用一个抽象的类,例如
java.sql.DataSource
,定义数据库。然而, MySQL DataSource和Microsoft SQL DataSource不同 实施。JDBC不知道您要使用哪一个。因此,您使用DriverManager指定要使用的JDBC MySQL实现,您可以加载该驾驶员的类。 说,稍后您切换到Microsoft SQL。现在,你要做的就是 是更改DriverManager来加载Microsoft SQL驱动程序类, 以及使用抽象
java.sql
的所有代码 课程仍然可以工作。
我在http://zetcode.com/tutorials/jeetutorials/datasource/
中找到了一些使用DataSource
和使用DriverManager
的示例但我看不出不同的实现(例如MySQL的实现,Microsoft SQL Server的实现)将对DataSource
和DriverManager
的影响有所不同。还是我误会了什么?
使用JDBC加速数据库时,您将处理java.sql.Connection
,java.sql.Resultset
...是接口。您实际上将使用特定于数据库的实现。
这样,您为一个数据库编写的大多数代码都可以与另一个数据库一起使用,并且每次需要访问新DB时,您都不必学习新的API。
您需要首先指定JDBC驱动程序提供的所需的实现。您可以使用旧学校 DriverManager
或现在首选的DataSource
。
drivermanager
DriverManager
是一个具体类。它不是任何数据库。总而言之,这只是您注册驱动程序的地方,因此您可以以后获得所需的所有特定实现。它本身并不是特定的,但它提供了您需要的所有特定内容。
这是您在我的一些评论中提到的示例中的摘录。
final String url = "jdbc:mysql://localhost:3306/books";
//This line returns the Class of the Jdbc drive
//It will not be used but doing this will allow
//static initializations where it will register
//the driver to the DriverManager
Class.forName("com.mysql.jdbc.Driver");
//Here you get your connection implmentation
Connection con = DriverManager.getConnection(url, "root", "");
//MySQL specific Statement
Statement stmt = con.createStatement();
//MySQL specific ResultSet
ResultSet result = stmt.executeQuery("SELECT * FROM books");
这里的"陷阱"是在调用Class.forName
方法的静态启动期间完成驱动程序的注册(驱动程序)。
有关您的信息,这是com.mysql.jdbc.Driver
中的代码,在INIT中进行驱动程序注册:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
数据源
使用DataSource
更适合外部配置。DataSource
是interface
,实现直接取决于数据库。
在您的示例中,驱动程序实现在web.xml
文件中指定。
首先,我们定义驱动程序可以使用JNDI
找到它<database>
<jndi-name>jdbc/mysql</jndi-name>
<driver>
<type>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</type>
<url>jdbc:mysql://localhost:3306/books</url>
<user>root</user>
<password></password>
</driver>
<database>
,然后我们将引用传递到servlet:
<servlet>
<servlet-name>datasource</servlet-name>
<servlet-class>com.zetcode.DataSourceExample</servlet-class>
<init>
<data-source>${jndi:lookup('jdbc/mysql')}</data-source>
</init>
</servlet>
这样,您不必编写任何特定的代码行。如果您更改数据库,(从理论上)您只需更改配置即可。不是代码。
重要说明
- 正如Kayaman在评论中提到的正常拨打
Class.forName
的那样,由于Java 6. 6. - 不再建议使用
DriverManager
的提醒。请参阅Javadoc
的摘录
Note :JDBC 2.0 API中的新数据源接口提供了另一种连接到数据源的方法。数据源对象的使用是连接到数据源的首选方法。