MySQL Tomcat6无法连接MySql(驱动没有收到服务器的任何数据包)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2172570/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Tomcat6 can't connect to MySql (The driver has not received any packets from the server)
提问by Tobias Wiesenthal
i'm running an Apache Tomcat 6.0.20 / MySQL 5.1.37-lubuntu / sun-java6-jdk /sun-java6-jre / sun-java6-bin on my local machine using Ubuntu 9.10 as OS. I'm trying to get a simple DB-query example running for 2 days now, but i still get this Exception:
我正在使用 Ubuntu 9.10 作为操作系统的本地机器上运行 Apache Tomcat 6.0.20 / MySQL 5.1.37-lubuntu / sun-java6-jdk /sun-java6-jre / sun-java6-bin。我正在尝试让一个简单的 DB 查询示例运行 2 天,但我仍然收到此异常:
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)"
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause
javax.servlet.ServletException: javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)"
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
org.apache.jsp.index_jsp._jspService(index_jsp.java:104)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause
javax.servlet.jsp.JspException: Unable to get connection, DataSource invalid: "org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)"
org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.getConnection(QueryTagSupport.java:285)
org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.doStartTag(QueryTagSupport.java:168)
org.apache.jsp.index_jsp._jspx_meth_sql_005fquery_005f0(index_jsp.java:274)
org.apache.jsp.index_jsp._jspx_meth_c_005fotherwise_005f0(index_jsp.java:216)
org.apache.jsp.index_jsp._jspx_meth_c_005fchoose_005f0(index_jsp.java:130)
org.apache.jsp.index_jsp._jspService(index_jsp.java:93)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
my web.xml looks like this :
我的 web.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<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>
the context.xml looks like this :
context.xml 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/my1stApp" docBase="/var/www/jsp/my1stApp" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/testDB" auth="Container" type="javax.sql.DataSource"
maxActive="5" maxIdle="5" maxWait="10000"
username="user" password="password" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/some"/>
</Context>
and the jsp file looks like this:
jsp 文件如下所示:
<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<html>
<head>
<title>DroneLootTool</title>
</head>
<body bgcolor="white">
<sql:query var="res" dataSource="jdbc/testDB">
select name, othername
from mytable
</sql:query>
<h2>Results</h2>
<c:forEach var="row" items="${res.rows}">
Name ${row.name}<br/>
MoreName ${row.othername}<br/><br/>
</c:forEach>
</body>
</html>
- read lots of forum entries / tried lots of different settings (always changed back to original settings when it didnt' work)
- set TOMCAT6_SECURITY=no in /etc/default/tomcat6 because TOMCAT6_SECURITY=yes was causing trouble too
- the skip-networking flag is not set for the DB (BIND 127.0.0.1 is set)
- firewall is swiched off (sudo ufw disable)
- MySQL works (tested several times with user used in this skript)
telnet localhost 3306 says
Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Connection closed by foreign host.
- 阅读很多论坛条目/尝试了很多不同的设置(当它不起作用时总是改回原始设置)
- 在 /etc/default/tomcat6 中设置 TOMCAT6_SECURITY=no 因为 TOMCAT6_SECURITY=yes 也造成了麻烦
- 未为 DB 设置跳过网络标志(设置了 BIND 127.0.0.1)
- 防火墙被关闭(sudo ufw disable)
- MySQL 可以工作(使用本脚本中使用的用户进行了多次测试)
telnet localhost 3306 说
尝试 ::1... 尝试 127.0.0.1... 连接到本地主机。转义字符是“^]”。外部主机关闭连接。
The TestConnection.java produced the following output:
TestConnection.java 产生以下输出:
me@my-laptop:~/Desktop$ java -classpath '/usr/share/java/mysql.jar:./' TestConnection com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/testDB myuser mypassword
me@my-laptop:~/Desktop$ java -classpath '/usr/share/java/mysql.jar:./' TestConnection com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/testDB myuser mypassword
com.mysql.jdbc.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:298)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at TestConnection.checkConnection(TestConnection.java:40)
at TestConnection.main(TestConnection.java:21)
Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:666)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1069)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2031)
... 7 more
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2431)
at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:590)
... 9 more
Connection failed.
i don't know if there is a difference between the way the java driver connects to the DB and the Perl DBI module does, but this PERL skript works
我不知道 java 驱动程序连接到 DB 的方式和 Perl DBI 模块的连接方式是否有区别,但是这个 PERL 脚本有效
#!/usr/bin/perl -w
use CGI;
use DBI;
use strict;
print CGI::header();
my $dbh = DBI->connect("dbi:mysql:some:localhost", "user", "password");
my $sSql = "SELECT * from mytable";
my $ppl = $dbh->selectall_arrayref( $sSql );
foreach my $pl (@$ppl)
{
my @array = @$pl;
print @array;
}
$dbh->disconnect;
enabled --log-warnings on the mysql, but i didn't get any new warnings. When i was searching the logs for warnings i found this messages when i restart the tomcat, don't know if it helps to find the problem :
在 mysql 上启用 --log-warnings,但我没有收到任何新警告。当我在日志中搜索警告时,我在重新启动 tomcat 时发现了此消息,不知道是否有助于找到问题:
Feb 2 19:50:37 tobias-laptop jsvc.exec[3129]: 02.02.2010 19:50:37 org.apache.catalina.startup.HostConfig checkResources#012INFO: Undeploying context [/myapp]
Feb 2 19:50:37 tobias-laptop jsvc.exec[3129]: 02.02.2010 19:50:37 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads#012SCHWERWIEGEND: A web application appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
Feb 2 19:50:37 tobias-laptop jsvc.exec[3129]: 02.02.2010 19:50:37 org.apache.catalina.startup.HostConfig deployDescriptor#012INFO: Deploying configuration descriptor myapp.xml
回答by kalkulator kredytowy
I solved this problem. The reason why this error occurs is tomcat security restrictions.
我解决了这个问题。出现这个错误的原因是tomcat的安全限制。
You have to add following line to your $TOMCAT-CONFIG/policy.d/04webapps.policy
您必须将以下行添加到您的 $TOMCAT-CONFIG/policy.d/04webapps.policy
permission java.net.SocketPermission "127.0.0.1:3306", "connect";
Works for me, hope it will work for you too :)
对我有用,希望它也对你有用:)
回答by Louis
I had the same issue.
我遇到过同样的问题。
It turns out I messed up the server by running three mysqld instances, so kill the unwanted resolved my issue:
事实证明,我通过运行三个 mysqld 实例搞乱了服务器,所以杀死不需要的解决了我的问题:
me@ubuntu:~$ ps aux | grep mysql
mysql 8149 0.1 0.4 280484 26008 ? Ssl 13:24 0:00 /usr/sbin/mysqld
me 8256 0.0 0.0 4392 836 pts/3 S+ 13:24 0:00 grep --color=auto mysql
root 26569 0.0 0.0 5952 1856 ? S 10:44 0:00 sudo /usr/sbin/mysqld --skip-grant-tables --skip-networking
mysql 26570 0.1 0.6 323528 41936 ? Sl 10:44 0:15 /usr/sbin/mysqld --skip-grant-tables --skip-networking
me@ubuntu:~$ sudo kill 26570
回答by Rahul Kumar
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/indiadb","root","root");
Check:
查看:
the port number it must be only 3306
Add the
mysql.jar
in lib if you are using Tomcat6
端口号必须只有 3306
mysql.jar
如果您使用的是 Tomcat6,请添加in lib
回答by Pascal Thivent
Please try with an "official" Connector/J 5.1i.e. distributed by MySQL, not a deb (note that I have nothing against deb).
请尝试使用“官方”连接器/J 5.1,即由 MySQL 分发,而不是 deb(请注意,我不反对 deb)。
Also please enable --log-warnings
on the mysql server and see if anything is showing up in your error logs.
还请--log-warnings
在 mysql 服务器上启用,看看您的错误日志中是否显示任何内容。