Class.forName("org.sqlite.JDBC") vs JDBC.PREFIX 加载 JDBC class

Class.forName("org.sqlite.JDBC") vs JDBC.PREFIX to load JDBC class

我们最近开始使用 Maven 构建项目。早些时候,所有 JAR 都添加到 libs 文件夹中并添加到 classpath。在迁移到 Maven 构建时,我错过了向 'sqlite-jdbc' 添加依赖项。从本地 .db3 文件读取数据需要此库。

由于'org.sqlite.JBDC' class是通过调用代码Class.forName("org.sqlite.JDBC")加载的,所以没有编译错误,我在服务器上部署了WAR文件和servlet失败.我正在考虑一种在编译时自己找到问题的方法,以避免将来出现任何此类错误。我可以简单地调用 JDBC.PREFIX 来加载 JDBC,这样,如果我忘记将依赖项添加到 pom.xml 文件,我可以在编译时自己找到问题吗?

Class.forName("org.sqlite.JDBC")JDBC.PREFIX 加载 JDBC class 之间是否存在差异?

不需要Class.forName

一般不需要调用Class.forName.

早年就有这样的称呼。现代 Java 已更改,因此 JDBC driver 会通过 Java Service Provider Interface (SPI) 工具自动加载并注册到 JVM。

如果您正在使用建议 Class.forName 的书籍或教程,您可能需要获取更多 up-to-date 学习资料。

DataSource

此外,在 Servlet 工作中,您通常不应显式访问 JDBC driver.

设置数据库服务器地址、用户名和密码需要 hard-coding 文本。当部署系统管理员更改 IP 地址或轮换密码时,您的代码就会中断。然后您将不得不修改您的源代码,re-compile 和 re-deploy.

相反,您应该外部化此类配置详细信息。

对于 SQLite,请参阅 Using DataSource to connect to SQLite with (Xerial) sqlite-jdbc driver

JNDI

您可以使用 DataSource interface. After obtaining a DataSource object at runtime, make database connections by calling its getConnection 方法外部化数据库配置。 DataSource object 包含数据库服务器地址、用户名、密码以及连接到数据库所需的所有其他设置。

在运行时使用JNDI. Your Servlet container may act as the naming/directory server to provide the DataSource object, if your sysadmin so configures it. Or the DataSource can be obtained via JNDI from an external server such as an LDAP服务器获取DataSourceobject。

同样,使用 DataSource 和 JNDI 的优点在于,当部署细节发生变化时,作为 Servlet 程序员的您无需参与,甚至无需通知。

JDBC driver 位置

对于 Servlet 工作,您通常不会将 JDBC driver 与您的应用捆绑在一起。

相反,JDBC driver 进入由您的 Servlet 容器管理的文件夹。研究特定 Servlet 容器的文档。对于 Apache Tomcat, see this Answer.

在开发中,您的 IDE 可能需要访问 JDBC driver 才能编译。如果是这样,在您的 Maven POM 中,使用 <scope>provided</scope> 元素标记依赖项。此标记告诉 Maven 从最终构建中忽略该依赖项,因为该依赖项在运行时已经存在(提供)。

如果您坚持将 JDBC driver 捆绑在网络应用的 WAR 文件中,请参阅重要的 Comment by Mark Rotteveel.

此主题已在 Stack Overflow 上多次提及。 Search 了解更多。