Java中加载DB驱动程序的替代方法

Java中加载DB驱动程序的替代方法,java,jdbc,Java,Jdbc,除了类之外,还有其他加载DB驱动程序的方法吗?通常,您可以创建它的实例,但这会导致对特定驱动程序的硬依赖 之所以使用Class.forName,是因为您可以对其进行配置。它工作的原因是它触发类的静态初始值设定项运行,从而允许它向jdbc注册 简言之,据我所知,您有两种选择: Class.forName-允许配置驱动程序-很好 直接实例化-创建实体类依赖关系-不好 通常,您可以只创建一个实例,但这会导致对特定驱动程序的硬依赖 之所以使用Class.forName,是因为您可以对其进行配置。它工作

除了类之外,还有其他加载DB驱动程序的方法吗?

通常,您可以创建它的实例,但这会导致对特定驱动程序的硬依赖

之所以使用Class.forName,是因为您可以对其进行配置。它工作的原因是它触发类的静态初始值设定项运行,从而允许它向jdbc注册

简言之,据我所知,您有两种选择:

  • Class.forName-允许配置驱动程序-很好
  • 直接实例化-创建实体类依赖关系-不好

通常,您可以只创建一个实例,但这会导致对特定驱动程序的硬依赖

之所以使用Class.forName,是因为您可以对其进行配置。它工作的原因是它触发类的静态初始值设定项运行,从而允许它向jdbc注册

简言之,据我所知,您有两种选择:

  • Class.forName-允许配置驱动程序-很好
  • 直接实例化-创建实体类依赖关系-不好

    • 现代JDBC驱动程序应该在其jar文件清单中提供足够的元数据,因此您可能不需要做任何事情

      Class#forName
      的要点是删除对特定JDBC驱动程序的编译时依赖(并使其在运行时可配置)。如果您在程序中使用Oracle驱动程序代码(使用非标准JDBC扩展),并且没有强制要求硬编码驱动程序类名,那么您也可以创建驱动程序类的常规实例

       new oracle.jdbc.driver.OracleDriver();
      

      现代JDBC驱动程序应该在其jar文件清单中提供足够的元数据,所以您可能不需要做任何事情

      Class#forName
      的要点是删除对特定JDBC驱动程序的编译时依赖(并使其在运行时可配置)。如果您在程序中使用Oracle驱动程序代码(使用非标准JDBC扩展),并且没有强制要求硬编码驱动程序类名,那么您也可以创建驱动程序类的常规实例

       new oracle.jdbc.driver.OracleDriver();
      

      现代驱动程序不需要注册,因为它们有一个META-INF/services/java.sql.Driver文件,通过包含驱动程序类的名称来声明驱动程序的存在

       new oracle.jdbc.driver.OracleDriver();
      
      只需使用
      DriverManager.getConnection(…)
      ,它就会发现驱动程序本身


      EDIT@Thilo:我刚刚用PostgreSQL测试了它,它可以工作:

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      
      public class JdbcDriverLoadTest {
      
          public static void main(String[] args) throws SQLException {
              Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5434/IKOffice_Core", "ik", "ik0000");
              System.out.println(c.getMetaData().getDatabaseProductName());
          }
      
      }
      

      现代驱动程序不需要注册,因为它们有一个META-INF/services/java.sql.Driver文件,通过包含驱动程序类的名称来声明驱动程序的存在

       new oracle.jdbc.driver.OracleDriver();
      
      只需使用
      DriverManager.getConnection(…)
      ,它就会发现驱动程序本身


      EDIT@Thilo:我刚刚用PostgreSQL测试了它,它可以工作:

      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      
      public class JdbcDriverLoadTest {
      
          public static void main(String[] args) throws SQLException {
              Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5434/IKOffice_Core", "ik", "ik0000");
              System.out.println(c.getMetaData().getDatabaseProductName());
          }
      
      }
      

      您还可以将驱动程序类添加到系统属性
      jdbc.drivers
      ,该属性是
      DriverManager
      类加载的以冒号分隔的驱动程序类名列表

      例如:

      java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver MyApp
      

      源:.

      还可以将驱动程序类添加到系统属性
      jdbc.drivers
      ,该属性是
      DriverManager
      类加载的以冒号分隔的驱动程序类名列表

      例如:

      java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver MyApp
      

      来源:com.mysql.jdbc.Driver dr=null

      com.mysql.jdbc.Driver dr=null

      该死的,我正要写:),但不是他们注册的清单文件。Thilo,我以前也没看到它起作用。但我相信这在Java1.6中是固定的,因为我刚刚检查过,它可以工作+1尽管如此。该死,我正要写:),但它们不是在清单文件中注册的。Thilo,我以前也没看到它起作用。但我相信这在Java1.6中是固定的,因为我刚刚检查过,它可以工作+1尽管如此,删除了“oracle”标记,因为该问题一般适用于JDBC。删除了“oracle”标记,因为该问题一般适用于JDBC。但是,您的应用程序需要正确记录,最终用户应该使用此功能提供完整的JDBC 4兼容驱动程序,否则应用程序可能无法工作。到目前为止,并不是所有主要的JDBC驱动程序供应商都实现了这一点。我仍然会依赖
      Class#forName()
      ,并在一年或两年后重新评估JDBC驱动程序世界,然后完全杀死
      Class#forName()
      。但是,您的应用程序需要有适当的文档记录,最终用户应该使用此功能提供与JDBC 4完全兼容的驱动程序,否则应用程序可能无法工作。到目前为止,并不是所有主要的JDBC驱动程序供应商都实现了这一点。我仍然会依赖于
      Class#forName()
      ,并在一两年后重新评估JDBC驱动程序世界,然后完全杀死
      Class#forName()