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