views:

2082

answers:

3

Hi all,

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:

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 :

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

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

<%@ 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.


The TestConnection.java produced the following output:

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

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

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
A: 

I am having the same problem. It works on my development machine, but doesn't work on the machine of deployment. I hope some can help us.

Don Stokes
My problem is SOLVED!I downloaded the current binary of tomcat6 from the apache website, and ran it with the same webapp. Everything worked. The previous tomcat6 binary I was using came from the Ubuntu 9.10 repository.One thing that I did not mention before is that it was necessary to place the mysql connector jar in the tomcat6/lib directory. Placing a copy of the jar in the war file lib directory didn't work.
Don Stokes
I tried replacing the tomcat from ubuntu with the actual download from the Apache-Tomcat site (version 6.0.24) -> no effect. the mysql-connector.jar is symlinked in tomcat6/lib from /usr/share/java
Tobias Wiesenthal
@Don Stokes: The mysql connector jar needs to be in Tomcat's lib folder, because it is needed during the server's start up and before the applications are launched. So, this is expected behaviour.
kgiannakakis
A: 

Please try with an "official" Connector/J 5.1 i.e. distributed by MySQL, not a deb (note that I have nothing against deb).

Also please enable --log-warnings on the mysql server and see if anything is showing up in your error logs.

Pascal Thivent
i use the official connector version 5.1.11, enabled --log-warnings. updated the question
Tobias Wiesenthal
A: 

I solved this problem. The reason why this error occurs is tomcat security restrictions.

You have to add following line to your $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 :)

kalkulator kredytowy