EC2 Tomcat 无法连接到 MySQL

EC2 Tomcat can’t connect to MySQL

我正在使用 Amazon 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" 来自 /index.jsp
  5. 的第 8 行

我已经在我的其他 Java 库中放置了一个 Connector/J jar 文件的副本并将其添加到我的类路径中,尽管考虑到 Tomcat 如何处理这种方法显然是徒劳的它的类路径。

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

我的文件

/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>

我的数据库有一个用户 'user'@'localhost' IDENTIFIED BY 'password'foo.* 上拥有 SELECT 权限。数据库 foo 有一个 table Users(email varchar(127) NOT NULL PRIMARY KEY, name varchar(127) NOT NULL);

结论

我可能漏掉了一些愚蠢的东西,因为这是我第一次在 Tomcat 上在我的本地机器之外做任何事情(顺便说一句,在这台机器上工作得很好)。谁能发现我做错了什么? (除了我的调试过程本身:我完全知道那有多可怕。)

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

编辑

明确地说,因为我被指示将 mysql-connector-java-5.1.45-bin.jar 放在不同的地方或被问到我把它放在哪里:我试过把它放在 每个目录tomcat8.

尝试以下方法

选项 1:将文件 "mysql-connector-java-5.1.4.4-bin.jar" 放入您的 tomcat lib 文件夹

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

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

你在技术上没有做错任何事,我经历过(与上面 tomcat 和 mysql 相同的设置)并在我这边纠正了这个问题,你可以通过 JSP 数据库测试页面未使用 DataSource,问题是大多数 Amazon 服务 不支持开箱即用的东西:

  • JNDI 数据源

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

  • 数据源="jdbc/foo"

解决方案是:

  1. JDBC DriverManager

  2. 创建 JNDI 数据源

参考文献: