为什么我需要在 Tomcat Web 应用程序中调用 Class.forName,即使我使用 JDBC Driver 4.0?
Why do I need to call Class.forName in Tomcat Web Application even if I use a JDBC Driver 4.0?
我正在研究 Java Web,在学习期间我了解到,从 JDBC 的版本 4 开始,无需使用方法 Class.forName
来加载驱动程序。我在这个 link.
中确认了这个信息
根据这些信息,我在没有调用的情况下开发了 getConnection 方法,但是当我启动 Tomcat 并去测试我的方法时,抛出了以下异常。
jan 23, 2015 7:55:48 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.caelum.servlet.AdicionaContatoServlet] in context with path [/fj21-agenda] threw exception
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:14)
at br.com.caelum.jdbc.dao.ContatoDAO.<init>(ContatoDAO.java:19)
at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:12)
... 25 more
我在测试中使用:
- Tomcat 8
- Java 8
- Eclipse Luna 服务版本 1 (4.4.1)
- mysql-连接器-java-5.1.34-bin.jar
如果我包含行 Class.forName("com.mysql.jdbc.Driver");
一切正常。有人对此有任何想法吗?
在 Tomcat 启动期间,Service Provider mechanism 扫描 $CATALINA_BASE/lib
文件夹中的数据库驱动程序以注册它们。但是这个过程不是针对每个网络应用程序执行的。
Thus, the web applications that have database drivers in their WEB-INF/lib
directory cannot rely on the service provider mechanism and should register the drivers explicitly.
我正在研究 Java Web,在学习期间我了解到,从 JDBC 的版本 4 开始,无需使用方法 Class.forName
来加载驱动程序。我在这个 link.
根据这些信息,我在没有调用的情况下开发了 getConnection 方法,但是当我启动 Tomcat 并去测试我的方法时,抛出了以下异常。
jan 23, 2015 7:55:48 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [br.com.caelum.servlet.AdicionaContatoServlet] in context with path [/fj21-agenda] threw exception
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:14)
at br.com.caelum.jdbc.dao.ContatoDAO.<init>(ContatoDAO.java:19)
at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:12)
... 25 more
我在测试中使用:
- Tomcat 8
- Java 8
- Eclipse Luna 服务版本 1 (4.4.1)
- mysql-连接器-java-5.1.34-bin.jar
如果我包含行 Class.forName("com.mysql.jdbc.Driver");
一切正常。有人对此有任何想法吗?
在 Tomcat 启动期间,Service Provider mechanism 扫描 $CATALINA_BASE/lib
文件夹中的数据库驱动程序以注册它们。但是这个过程不是针对每个网络应用程序执行的。
Thus, the web applications that have database drivers in their
WEB-INF/lib
directory cannot rely on the service provider mechanism and should register the drivers explicitly.