对不同的数据库系统实现(例如MySQL和Microsoft SQL Server)会影响“ DataSource”和`d



以下是使用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的实现)将对DataSourceDriverManager的影响有所不同。还是我误会了什么?

使用JDBC加速数据库时,您将处理java.sql.Connectionjava.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更适合外部配置。DataSourceinterface,实现直接取决于数据库。

在您的示例中,驱动程序实现在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>

这样,您不必编写任何特定的代码行。如果您更改数据库,(从理论上)您只需更改配置即可。不是代码。

重要说明

  1. 正如Kayaman在评论中提到的正常拨打Class.forName的那样,由于Java 6. 6.
  2. 不再建议使用DriverManager的提醒。请参阅Javadoc
  3. 的摘录

Note :JDBC 2.0 API中的新数据源接口提供了另一种连接到数据源的方法。数据源对象的使用是连接到数据源的首选方法。

最新更新