0

I'm learning how to use a servlet by accessing the JNDI Datasource and however, the connection couldn't be established.Here is my Code:

Tomcat's Server.xml:

**<Resource name="jdbc/testDB" 
   auth="Container" 
   type="javax.sql.DataSource"
   driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://192.168.56.101:3306/testDB?characterEncoding=utf-8"
   username="test"
   password="123"
   maxActive="200"
   maxIdle="50"
   maxWait="3000"/>**

Tomcat's Context.xml:

**<Resource name="jdbc/testDB" 
   auth="Container" 
   type="javax.sql.DataSource"
   driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://192.168.56.101:3306/testDB?characterEncoding=utf-8"
   username="test"
   password="123"
   maxActive="200"
   maxIdle="50"
   maxWait="3000"/>**

and final web.xml:

<servlet-mapping>
   <servlet-name>ViewDictionary</servlet-name>
   <url-pattern>/servlet/ViewDictionary</url-pattern>
</servlet-mapping>
<welcome-file-list>
   <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
**<resource-ref>
   <description>DB Connection</description>
   <res-ref-name>jdbc/testDB</res-ref-name>
   <res-type>javax.sql.DataSource</res-type>
   <res-auth>Container</res-auth>
</resource-ref>**

The problem happens here:

javax.naming.Context ctx = new javax.naming.InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.
    lookup("java:/comp/env/jdbc/testDB");
    **Connection conn = ds.getConnection();  //Couldn't get the Connection** 

Error Stack Trace:

java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2160)
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2032)
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1532)
at chapter4.ViewDictionary.doGet(ViewDictionary.java:28)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
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:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
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:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(DriverManager.java:315)
at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2144)
... 26 more
Snow jon
  • 17
  • 7
  • Could you please post the full stracktrace, so we can see where the exception originates. – Mark Rotteveel Jul 03 '16 at 08:03
  • the full stracktrace has been put there. – Snow jon Jul 03 '16 at 10:01
  • Class.forName("com.mysql.jdbc.Driver"); "This statement could work, but I don't want to do like this. And I still don't know how to get the Connection by JNDI. Besides, I've already succeed to get the Connection by the JDBC. – Snow jon Jul 03 '16 at 10:49

1 Answers1

1

My final solution is to generate a context.xml where the "Resource" tag locates at and then move it to the directory "/WebContent/META-INF". My IDE is Eclipse.

Here is the code:

 <?xml version="1.0" encoding="UTF-8"?>
<Context>
 <Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000" username="test" password="123"
    driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.56.101:3306/testDB" />
</Context>

The directory is:

enter image description here

Finally it works. However, I still can't find out the right way to directly collocate the server.xml and context.xml in the tomcat to get the connection.

Snow jon
  • 17
  • 7