簡體   English   中英

不同的數據庫系統實現(例如MySQL和Microsoft SQL Server)是否會對“ DataSource”和“ DriverManager”產生不同的影響?

[英]Does different database system implementations (e.g. MySQL, and Microsoft SQL Server) affect `DataSource` and `DriverManager` differently?

這是使用DataSource和使用https://stackoverflow.com/a/19674833/1224441中的 DriverManager一些比較

使用JDBC,我們可以使用抽象類,例如java.sql.DataSource ,它定義了一個數據庫。 但是, MySQL數據源和Microsoft SQL數據源是不同的實現。 JDBC不知道您要使用哪一個。

因此,您可以使用DriverManager來指定要使用MySQL實現的JDBC,然后加載該驅動程序的類。 稍后再說,切換到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 ...。 實際上,您將使用特定於數據庫的實現。

這樣,您為一個數據庫編寫的大多數代碼都可以與另一個數據庫一起使用,並且不必在每次需要訪問新數據庫時都學習新的API。

您需要首先指定JDBC驅動程序所提供的實現。 您可以使用老式的 DriverManager或現在首選的DataSource

驅動程序管理器

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方法的靜態初始化過程中完成了驅動程序的注冊(向DriverManager的注冊)。

供您參考, com.mysql.jdbc.Driver的代碼片段,用於在com.mysql.jdbc.Driver進行驅動程序注冊:

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>

這樣,您不必編寫任何特定的代碼行。 如果您更改數據庫,(理論上)只需更改配置即可。 不是代碼。

重要筆記

  1. 正如Kayaman在評論中提到的那樣,自Java 6以來不再需要調用Class.forName 。所有您需要的是在類路徑中具有驅動程序。
  2. 提醒您,不建議再使用DriverManager 請參閱javadoc中的此摘錄

注意 :JDBC 2.0 API中新增的DataSource接口提供了另一種連接數據源的方法。 使用DataSource對象是連接到數據源的首選方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM