EC2 Tomcat 无法连接到 MySQL
EC2 Tomcat can’t connect to MySQL
我正在使用 Amazon Linux 的 Amazon EC2 实例,已完全遵循 this tutorial,但我不知道如何将 Tomcat 连接到 MySQL.我这样做的意思是什么?
我试过的
我遍历了 /usr/share/tomcat8
中的目录,并且对于每个目录:
- 将从 here 获得的 Connector/J 文件
mysql-connector-java-5.1.45-bin.jar
放在目录 中
- 重新启动Tomcat
- 重新加载了我的索引页,
app/index.jsp
- 收到错误:
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
的第 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"
解决方案是:
JDBC DriverManager
创建 JNDI 数据源
参考文献:
我正在使用 Amazon Linux 的 Amazon EC2 实例,已完全遵循 this tutorial,但我不知道如何将 Tomcat 连接到 MySQL.我这样做的意思是什么?
我试过的
我遍历了 /usr/share/tomcat8
中的目录,并且对于每个目录:
- 将从 here 获得的 Connector/J 文件
mysql-connector-java-5.1.45-bin.jar
放在目录 中
- 重新启动Tomcat
- 重新加载了我的索引页,
app/index.jsp
- 收到错误:
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
的第 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"
解决方案是:
JDBC DriverManager
创建 JNDI 数据源
参考文献: