EC2 Tomcat无法连接到MySQL

时间:2017-12-17 05:50:13

标签: jdbc amazon-ec2 tomcat8 mysql-connector

我正在研究亚马逊Linux的Amazon EC2实例,正好遵循this tutorial,但我无法弄清楚如何将Tomcat连接到MySQL。我的意思是这样做的吗?

我尝试了什么

我遍历了/usr/share/tomcat8内的目录,并为每个目录遍历:

  1. 将从here获取的Connector / J文件mysql-connector-java-5.1.45-bin.jar放在目录
  2. 重启Tomcat
  3. 重新加载了我的索引页app/index.jsp
  4. javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver found for jdbc/foo"
  5. 的第8行收到错误:/index.jsp

    我在其他Java库中放置了一个Connector / J jar文件的副本,并将其添加到我的类路径中,尽管这种方法明显无效,因为Tomcat如何处理它的类路径。

    我已尽可能地减少了我的代码,希望我所做的其他事情已经产生了这种现象作为副作用。由于不到50行的代码继续产生相同的错误,这可能不是这种情况,但从技术上讲,我还没有排除它。

    我的文件

    /usr/share/tomcat8/webapps/app/index.jsp

    <!DOCTYPE html>
    <%@ page import="java.io.*, java.util.*, java.sql.*, javax.servlet.http.*, javax.servlet.*" @>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    <% Class.forName("com.mysql.jdbc.Driver").getInstance(); /* for good measure */ %>
    <html>
        <body>
            <sql:query dataSource="jdbc/foo" var="result">
                SELECT name FROM Users;
            </sql:query>
            <c:forEach var="r" items="${result.rows}">
                <c:out value="${r.name}"/><br/>
            </c:forEach>
        </body>
    </html>
    

    /usr/share/tomcat8/webapps/app/META-INF/context.xml

    <?xml version="1.0" encoding="utf-8"?>
    <Context>
        <Resource name="jdbc/foo" auth="Container" type="javax.sql.DataSource" maxTotal="64"
                  maxIdle="16" maxWaitMillis="10000" username="user" password="password"
                  driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/foo"/>
    </Context>
    

    /usr/share/tomcat8/webapps/app/WEB-INF/web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 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_4_0.xsd"
             version="4.0"
             metadata-complete="true>
    
        <request-character-encoding>UTF-8></request-character-encoding>
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
        <resource-ref>
            <description>Database connection</description>
            <res-ref-name>jdbc/foo</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
        </resource-ref>
    </web-app>
    

    我的数据库在[{1}}上拥有'user'@'localhost' IDENTIFIED BY 'password'用户SELECT权限。数据库foo.*有一个表foo

    结论

    我很可能错过了一些愚蠢的东西,因为这是我第一次在我的本地机器之外的Tomcat上做任何事情(顺便说一下,这样做很好)。任何人都可以找到我做错的事吗? (除了我的调试过程本身:我完全清楚这是多么可怕。)

    TL / DR:我已经尝试了很多东西,Tomcat仍然无法连接到我的EC2实例上的MySQL。

    修改

    要明确,因为我被指示将Users(email varchar(127) NOT NULL PRIMARY KEY, name varchar(127) NOT NULL);放在不同的地方或询问我放在哪里:我已经尝试将其放在字面上的每个目录 {{ 1}}。

2 个答案:

答案 0 :(得分:0)

尝试以下

选项1:将文件“mysql-connector-java-5.1.4.4-bin.jar”放在tomcat lib文件夹中

选项2:将文件“mysql-connector-java-5.1.4.4-bin.jar”放在应用程序“foo”的lib文件夹中

选项3:将文件“mysql-connector-java-5.1.4.4-bin.jar”放在java类路径中。

答案 1 :(得分:0)

从技术上讲,您没有做错任何事情,我已经经历过(与tomcat和mysql相同的设置),并且在我这一边纠正了此问题,您可以通过让JSP数据库测试页不使用DataSource进行验证,问题是大多数 Amazon服务不支持开箱即用的东西:

  • JNDI数据源

根据上面的代码,包括Beanstalk在内的EC2缺少此功能:

  • dataSource =“ jdbc / foo”

解决方案之一是求助于:

  1. JDBC DriverManager

  2. 创建JNDI数据源

参考文献: