Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Как запустить MySQL в связке с Tomcat


Автор: Mykle 4.7.2008, 13:58
У меня на Linux работает Tomcat и MySQL. В PHP подключился к базе и получил данные. А в JSP не получается

<%@ page contentType="text/html; charset=windows-1251" %>
<%@ page import ="java.net.*" %>
<%@ page import ="java.sql.*" %>
...
<%
//Загружаем драйвер
Class.forName("com.mysql.jdbc.Driver").newInstance();

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=ttt,password=ee");
...
%>

На строку "Connection conn = ..." - ругается, пишет следующее

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException: Unexpected exception encountered during query.
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServletWrapper.service(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.service(jasper5-compiler-5.5.17.jar.so)
    javax.servlet.http.HttpServlet.service(tomcat5-servlet-2.4-api-5.5.17.jar.so)


root cause 

javax.servlet.ServletException: Unexpected exception encountered during query.
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(jasper5-runtime-5.5.17.jar.so)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(jasper5-runtime-5.5.17.jar.so)
    org.apache.jsp.inn_jsp._jspService(inn_jsp.java:116)
    org.apache.jasper.runtime.HttpJspBase.service(jasper5-runtime-5.5.17.jar.so)
    javax.servlet.http.HttpServlet.service(tomcat5-servlet-2.4-api-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServletWrapper.service(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.service(jasper5-compiler-5.5.17.jar.so)
    javax.servlet.http.HttpServlet.service(tomcat5-servlet-2.4-api-5.5.17.jar.so)


root cause 

java.sql.SQLException: Unexpected exception encountered during query.
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2581)
    com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1751)
    com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3425)
    com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2045)
    com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
    com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:298)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    java.sql.DriverManager.getConnection(libgcj.so.7rh)
    java.sql.DriverManager.getConnection(libgcj.so.7rh)
    org.apache.jsp.inn_jsp._jspService(inn_jsp.java:58)
    org.apache.jasper.runtime.HttpJspBase.service(jasper5-runtime-5.5.17.jar.so)
    javax.servlet.http.HttpServlet.service(tomcat5-servlet-2.4-api-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServletWrapper.service(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(jasper5-compiler-5.5.17.jar.so)
    org.apache.jasper.servlet.JspServlet.service(jasper5-compiler-5.5.17.jar.so)
    javax.servlet.http.HttpServlet.service(tomcat5-servlet-2.4-api-5.5.17.jar.so)

ПОМОГИТЕ ПЛЗ.!!!
И за ранее спасибо всем, кто откликнется.

Автор: Mykle 4.7.2008, 15:29
И что там качать, а то там много всего, но ничего интересного я так и не нашел, по подробней объясните пожалуйста что и по чем.

Автор: Mykle 4.7.2008, 15:44
По предлоенной Вами ссылки закачал и установил, но как пользаться не известно, а обычный вариант не работает

Автор: v2v 4.7.2008, 16:46
jdbc connector установил?

Автор: _sten_ 9.7.2008, 11:14
Цитата

//Загружаем драйвер
Class.forName("com.mysql.jdbc.Driver").newInstance();


Зачем newInstance() достаточно просто Class.forName("com.mysql.jdbc.Driver")

Автор: EvgenZ 13.7.2008, 19:28
Предположение, а вот это -  "root cause ", не ключевой ли момент ?  smile  

Автор: Ulysses4j 14.7.2008, 00:31
Вот смотрю я книжку про 6-ой Tomcat и ничего там про традиционный десктопный путь Class.forName нет. Написано так.

1. Добавить в какой-нибудь context.xml (или в общий в /conf или в тот, который для вашего приложения, в /webapps/yourapp/META-INF) ресурс:
Код
<Resource name="jdbc/CatalogDB" auth="SERVLET"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/catalog"
    username="kmittal"
    password="pas44word"
    maxActive="30"
    maxIdle="20000"
    maxWait="120"/>

Тут надо многое подправить в соответствии с вашими установками.

2. В web.xml вашего приложения прописать:
Код
<resource-ref>
    <description/>
    <res-ref-name>jdbc/CatalogDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>SERVLET</res-auth>
</resource-ref>


3. На JSP писать:
Код
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql_rt" %>
<sql:setDataSource dataSource="jdbc/CatalogDB"/>

<sql:query var="products">
SELECT * FROM product
</sql:query>

Потом на странице можнго использовать переменную products, содержащую результат запроса. 

Естественно, как тут уже упоминали, нужен файл с классом-драйвером, его, я так понимаю, в lib  можно кинуть (после этого сервер лучше перезапустить).

Но вообще, конечно, дергать бызу из JSP, это мрак и пыхокодерство.

Автор: w32blaster 19.1.2009, 17:29
Помогите, пожалуйста! 
Снова я воскрешаю старую тему.

 У меня проблема похожая: я установил все компоненты и самое любопытное, что если обратиться к базе через командную строку (а именно, сделать Ява приложение не как сервлет, выполнить простой запрос и вывести на екран через System.out.println и запустить в строке, скажем, #java test) то всё работат. Если вставить тот же код в сервлет и открыть через браузер, сказем, http://localhost:8180/sample/my, то выдаётся ошибка:
Цитата


SQLException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sent to the server was 0 ms ago.
SQLState: 08S01
VendorError: 0 



То есть косяк именно где-то в настройках TomCat - MySQL (ubuntu). Вот ключевые частки кода:

Код

 Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection  con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample?user=uuu&password=ppp"); // <- kak ja ponjal, osibka tut 

//proboval i tak:
// con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/javaShop", "uuu", "ppp");
// ne pomoglo


context.xml:
Код

  <Resource name="jdbc/sample" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="root" password="123123" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javaShop?autoReconnect=true"/>

Остальное по-дефолту...


web.xml
Код

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/sample</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

      <servlet>
        <servlet-name>MyHelloWorld</servlet-name>
        <servlet-class>MyHelloWorld</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyHelloWorld</servlet-name>
        <url-pattern>/my</url-pattern>
    </servlet-mapping>

</web-app>



server.xml
Код

      <ResourceParams name="jdbc/sample">
        <parameter>
          <name>factory</name>
          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
        </parameter>

        <!-- Maximum number of dB connections in pool. Make sure you
             configure your mysqld max_connections large enough to handle
             all of your db connections. Set to 0 for no limit.
             -->
        <parameter>
          <name>maxActive</name>
          <value>10</value>
        </parameter>

        <!-- Maximum number of idle dB connections to retain in pool.
             Set to 0 for no limit.
             -->

        <parameter>
          <name>maxIdle</name>
          <value>5</value>
        </parameter>

        <!-- Maximum time to wait for a dB connection to become available
             in ms, in this example 10 seconds. An Exception is thrown if
             this timeout is exceeded.  Set to -1 to wait indefinitely.
             -->
        <parameter>
          <name>maxWait</name>
          <value>10000</value>
        </parameter>

        <!-- MySQL dB username and password for dB connections  -->
        <parameter>
         <name>username</name>
         <value>uuu</value>
        </parameter>

        <parameter>
         <name>password</name>
         <value>ppp</value>
        </parameter>

        <!-- Class name for mm.mysql JDBC driver -->
        <parameter>
           <name>driverClassName</name>
           <value>com.mysql.jdbc.Driver</value>
        </parameter>

        <!-- The JDBC connection url for connecting to your MySQL dB.
             The autoReconnect=true argument to the url makes sure that the
             mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
             connection.  mysqld by default closes idle connections after 8 hours.
             -->
        <parameter>
          <name>url</name>
          <value>jdbc:mysql://localhost:3306/sample?autoReconnect=true</value>
        </parameter>
      </ResourceParams>
    </Context>




Остальное всё как в туториалах - я скопировал mysql-connector /usr/share/tomcat5.5/common/lib/mysql-connector-java-5.1.7-bin.jar 

classpath: 
/usr/share/java/servlet-api.jar:/usr/share/java/servlet-2.3.jar:/usr/lib/jvm/java-6-sun-1.6.0.06/lib/mysql-connector-java-5.1.7-bin.jar:.

Что ещё забыл?...
Вот. Помогите, пожалуйста! Уже которые сутки мучаюсь... Может, кто сталкивался с такой проблемой...

Автор: skhilkov 21.1.2009, 07:31
Не совсем понял, Вы пытаетесь получить соединение вручную,  хотя натсроили datasource....
Попробуйте так :
Код

DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/sample");
connection = dataSource.getConnection();

А ошибка, коотрую Вы привели, означает что по какой-то причине соединение не может быть установлено с базой. Именно нужно проверить правильность урла подключения, корректность данных пользователя...

Автор: Samotnik 21.1.2009, 10:10
w32blaster, у тебя все данные для базы есть в  context.xml вроде там все правильно
я не пойму зачем вот тут
Цитата

Connection  con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample?user=uuu&password=ppp");

ты указываешь логин и пароль ? Это для базы или для твоего сервлета ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)