为了找到问题的解决方案,我在网上到处查看,但我没有运气! :(
我正在尝试开发一个能够连接到MySQL数据库(连接池)的servlet,并将其部署在Tomcat 8服务器上。
我在META-INF中有一个context.xml文件,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/DBConnectionPoolTest">
<Resource name="jdbc/testdb"
auth="Container"
type="javax.sql.DataSource"
username="xxx" password="xxx"
driverclassname="com.mysql.jdbc.Driver"
url="jdbc:mysql://xxx/myApp"
maxactive="10"
maxidle="4" />
</Context>
在WEB-INF中,我创建了web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<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>
</web-app>
最后,在servlet类中,我使用:
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
dataSource = (DataSource) envContext.lookup("jdbc/testdb");
...
connection = dataSource.getConnection();
但是在这一行上,当我尝试从数据源获取连接时,我得到以下异常:
java.sql.SQLException: Cannot create JDBC driver of class '' for connect URL 'jdbc:mysql://xxx/myApp'
t 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 DBPoolConnectionServlet.processRequest(DBPoolConnectionServlet.java:73)
...
Caused by: java.sql.SQLException: No suitable driver
我认为这可能是由于缺少JDBC驱动程序引起的,所以我把mysql-connector-java-5.1.34-bin.jar
推入了:
但没有运气。
你能告诉我我做错了什么吗?我觉得自己很高兴...... :(非常感谢您花时间阅读(并希望回答)我的问题!!!
答案 0 :(得分:3)
看起来你做得很好,所以:
driverClassName =&#34; com.mysql.jdbc.Driver&#34; (首都可能很重要)。
你放置mysql-connector-java-5.1.34-bin.jar(它必须在tomcat / lib中检测到jar扩展名(不要把它放在你的webapp路径上,它应该由tomcat类加载器加载)
如果没有帮助,您正在从IDE启动Web应用程序。尝试启动tomcat表单控制台并手动部署您的应用程序。如果安装了多个tomcat,请确保将CATALINA_HOME设置为放置mysql jar的那个。
答案 1 :(得分:1)
可能的问题可能是Tomcat在类加载期间多次遇到驱动程序jar。驱动程序jar只需要位于Tomcat lib目录下,而不是在Web应用程序的WEB-INF/lib
下。在这两个位置都有驱动程序jar导致我出现奇怪的类加载问题,这些错误表明“jdbc驱动程序具有空类,并且无法创建空URL”。请参阅此答案,了解其他数据库中的类似问题:https://stackoverflow.com/a/11604084/2200690
更新:我不再从Eclipse中启动Tomcat以确保Eclipse和Tomcat设置不会混淆(相反,我只是从bin目录启动tomcat并远程调试jvm来自Eclipse)。一旦我做了这个改变,我可以在Web-INF / lib和Tomcat lib目录中都有驱动程序jar,这没关系。
答案 2 :(得分:1)
修复Netbeans / Tomee / MySQL连接问题并解决FAIL的步骤 - 在上下文路径/RA7Web-1.0-SNAPSHOT部署的应用程序但上下文无法启动:
使用appBase的完整路径名编辑Tomee服务器上的server.xml:
<!-- Fixed the problem of cannot deploy by providing a full path for appBase -->`
<Host name="localhost"
appBase="C:\apache\apache-tomee-7.0.2-plume\webapps"
unpackWARs="true" autoDeploy="true">
将以下内容添加到项目web-xml:
<resource-ref>
<description>Resource Allocation database</description>
<res-ref-name>jdbc/resourcealloc</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
将以下内容添加到Context.xml:
<Resource name="jdbc/resourcealloc"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="mySecretPwd"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/resourcealloc"
maxActive="15"
maxIdle="3"/>
生成了以下resources.xml,但我必须编辑多个反斜杠,以便与我的网址匹配:
<resources>
<Resource id="jdbc/resourcealloc" type="javax.sql.DataSource">
jdbcDriver=com.mysql.jdbc.Driver
password=mySecretPwd
userName=root
jdbcUrl=jdbc:mysql://localhost:3306/resourcealloc?zeroDateTimeBehavior=convertToNull
</Resource>
</resources>