Okay I am trying to use connection pooling for my project which uses Maven
as a build tool. Now the JDBC Driver is listed as a maven dependency.
Tomcat however cant find it when I try to do
ds.getConnection (ie. get a JDBC connection from a datasource).
The error that I am getting is -:
java.sql.SQLException: Cannot create JDBC driver of class '' for connect
URL 'null'
at
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2065)
at
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1939)
at
org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
at test.Test.doGet(Test.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
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(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:2049)
... 27 more
As you can see in the end it says that caused by "No suitable driver"
My copy of context.xml is as follows-:
<Context>
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
removeAbandonedOnBorrow="true"
timeBetweenEvictionRunsMillis="10000"
minEvictableIdleTimeMillis="6000"
removeAbandonedOnMaintenance="true"
logAbandoned="true"
username="sreyan" password="sreyan"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/practice"/>
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/TestDB"
userTable="users" userNameCol="user_id" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name">
<CredentialHandler className =
"org.apache.catalina.realm.SecretKeyCredentialHandler"
algorithm = "PBEWITHHMACSHA384ANDAES_256"
iterations = "111111"
saltLength = "20" />
</Realm>
</Context>
And my copy of web.xml is -:
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>HibTest</servlet-name>
<display-name>HibTest</display-name>
<description></description>
<servlet-class>test.HibTest</servlet-class>
</servlet>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description></description>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HibTest</servlet-name>
<url-pattern>/hib</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
<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>
<security-constraint>
<web-resource-collection>
<web-resource-name>TECHERS</web-resource-name>
<url-pattern>/protected/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>TEACHER</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/index.jsp</form-login-page>
<form-error-page>/index.jsp?error=true</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>TEACHER</role-name>
</security-role>
</web-app>
I have used the Maven webapp archetype for creating the project.
How do I get Tomcat to load the driver at start up. Also I have put the
JDBC Driver at $Catalina_Home/lib. But even this has no help. All my other
projects that don't use Maven can use connection pooling perfectly with the
above configurations.
Where am I going wrong ? Where do you keep the <resource-ref> declaration ?
After the servlet mappings ?
Any help would be greatly appreciated.
Regards
Sreyan Chakravarty