JDBC4和Class.forName

时间:2014-11-29 20:42:49

标签: java postgresql servlets

我编写了一些代码,通过其最新的JDBC4驱动程序连接到PostgreSQL 9.4 DB。我的理解是JDBC4不再需要样板“Class.forName(”org.postgresql.Driver“)驱动程序注册行。因此,我把它遗漏了。它工作正常。

然后我将相同的代码放在servlet中,将postgreSQL JDBC jar添加到WebContent / WEB-INF / lib中,但它没有说:

java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost/

当我添加Class.forName行时,它可以正常工作。

有没有人知道为什么这个JDBC4驱动程序在放入doGet()servlet方法时需要Class.forName,但是在基本的Java类中却没有?

谢谢, TR

编辑:忘记提及,我正在使用Java 7。

一些更新:

在Tomcat中,这似乎是一个相当常见的问题。根据这个和其他帖子的建议,我已经将JAR移出了WEB-INF / lib。即使在TOMCAT_HOME / lib中,我也需要使用Class.forName()。奇怪的是,我认为它与Tomcat注册类的方式有关。

发现这篇文章是mySQL JDBC驱动程序的确切问题,而不是postgreSQL:

When is Class.forName needed when connecting to a database via JDBC in a web app?

1 个答案:

答案 0 :(得分:0)

感谢大家的帮助。在学习如何设置JNDI数据源时,我在Tomcat 7文档中找到了确切的情况和答案:

http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html#DriverManager,_the_service_provider_mechanism_and_memory_leaks

简而言之,在这些情况下,即使在Tomcat 7上使用JDBC4,也需要使用Class.forName注册驱动程序。

感谢大家指点我正确的方向! TR