2010-01-31 14 views
6

sto eseguendo un Apache Tomcat 6.0.20/MySQL 5.1.37-lubuntu/sun-java6-jdk/sun-java6- jre/sun-java6-bin sulla mia macchina locale usando Ubuntu 9.10 come sistema operativo. Sto cercando di ottenere un semplice esempio DB-query in esecuzione per 2 giorni ormai, ma ho ancora ottenere questa eccezione:Tomcat6 non può connettersi a MySql (il driver non ha ricevuto alcun pacchetto dal server)

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) 

mio web.xml assomiglia a questo:

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

contesto XML è simile al seguente:

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

e il file jsp assomiglia a questo:

<%@ 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> 
  • letto un sacco di post dei forum/un sacco di diverse impostazioni (sempre modificate alle impostazioni originali quando non ha ancora' di lavoro)
  • set TOMCAT6_SECURITY cercato = non in/etc/default/tomcat6 perché TOMCAT6_SECURITY = yes stava causando guai anche
  • bandiera skip-rete non è impostato per il DB (BIND 127.0.0.1 è impostato)
  • firewall swiched off (sudo ufw disable)
  • MySQL funziona (testato più volte con utente utilizzata in questo skript)
  • telnet localhost 3306 dice

    Cercando :: 1 ... Trying 127.0.0.1 ... Connected a localhost. Il carattere di fuga è '^]'. Connessione chiusa da host esterno.


Il TestConnection.java ha prodotto il seguente risultato:

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. 

non so se v'è una differenza tra il modo in cui il jav un driver si connette al DB e il modulo Perl DBI fa, ma questo PERL Skript funziona

#!/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; 

abilitati --log-le avvertenze sul mysql, ma non ho avuto nessun nuove avvertenze. quando ero alla ricerca dei registri per le avvertenze ho trovato questo messaggio quando riavvio il gatto, non so se aiuta a trovare il problema:

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 
+1

Potrebbe provare il 'TestConnection.java' da http: //testdrive.mapinfo. it/techsupp/miprod.nsf/kbase_by_product/B309A6631406A514852569770060E795 e aggiorna la domanda con il risultato? –

+0

Dove hai posizionato il jar del driver mysql? Prova a rimuovere anche l'attributo auth = "Container" – nos

+0

il mysql.jar symlinked in tomcat6/lib da/usr/share/java. in/usr/share/java mysql.jar è un collegamento simbolico al file attuale nella stessa directory. versioni sperimentate mysql-connector-java-5.1.11 e 5.1.6. rimuovere l'attributo auth = "Container" non aiuta neanche. :( –

risposta

0

Si prega di provare con una "ufficiale" Connector/J 5.1 cioè distribuito da MySQL , non un deb (nota che non ho nulla contro deb).

Inoltre, abilitare --log-warnings sul server mysql e vedere se qualcosa è visualizzato nei log degli errori.

+0

io uso il connettore ufficiale versione 5.1.11, abilitato --log -warnings. ha aggiornato la domanda –

3

Ho risolto questo problema. Il motivo per cui si verifica questo errore è rappresentato dalle restrizioni di sicurezza di tomcat.

si deve aggiungere seguente riga al vostro $TOMCAT-CONFIG/policy.d/04webapps.policy

permission java.net.SocketPermission "127.0.0.1:3306", "connect"; 

funziona per me, spero che funzionerà anche per voi :)

+0

Qualcuno potrebbe approvarlo come una buona soluzione? –

+0

Sto avendo lo stesso problema. questo non ha funzionato per me. – jasonmclose

1
Class.forName("com.mysql.jdbc.Driver"); 
      con=DriverManager.getConnection("jdbc:mysql://localhost:3306/indiadb","root","root"); 

Check:

  1. la numero di porta deve essere solo 3306

  2. Aggiungere il mysql.jar in lib se si utilizza Tomcat6

3

ho avuto lo stesso problema.

Si scopre ho incasinato il server eseguendo tre casi mysqld, in modo da uccidere gli indesiderati risolto il mio problema:

[email protected]:~$ 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 

[email protected]:~$ sudo kill 26570