Веб-приложение Google Web Toolkit (GWT) с MySQL, отлично работающее в Eclipse, но не работающее на сервере openSUSE - PullRequest
0 голосов
/ 02 декабря 2011

Я написал веб-приложение GWT, которое размещено на внешнем сервере openSUSE.Я использую GWT RPC от Google для связи с сервером и отправки данных от моего клиента на сервер, где обновляется база данных MySQL.В Eclipse все прекрасно работает, но как только я перенесу каталог / war на сервер (включая необходимый файл mysql-connector-java-5.1.18-bin.jar для java-соединителя), локальная база данных SQL на моемсервер не обновляется.Почему это не работает?Это какая-то проблема конфигурации mysql?

Я настроил базу данных на сервере с тем же именем и таблицей, что и на моей локальной машине (где я отлаживал с помощью Eclipse).Я не получаю никаких ошибок от GWT (так что доступ к серверу работает нормально), и мои файлы журнала SQL также не показывают ошибок.

Я попытался перезапустить mysql, проверил, что порт 3306 для mysql открыт и прослушивает, отключил брандмауэр и попробовал и localhost и 127.0.0.1 для хоста.

Я не могу понять, в чем проблема, ПОЖАЛУЙСТА, кто-нибудь, помогите мне!Я схожу с ума здесь!

Вот мой код на стороне сервера, который отлично работает в Eclipse, но не на сервере!

package com.mycompany.mywebapp.server;

@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
    GreetingService {

public String[] greetServer(String[] input) {

    //Data is entered into MySQL database on server side 
    Connection con = null; 
    Statement st = null; 

    String url = "jdbc:mysql://127.0.0.1:3306/testdb";
    String user = "username";
    String password = "pass";

    try{
        con = DriverManager.getConnection(url,user,password); //establishes connection to database
        st = con.createStatement(); //object for sending SQL statements to database 

        for (int i=0;i<input.length;i++){
            String DataToSend = input[i];
            String part1 = DataToSend.substring(0,DataToSend.indexOf("["));
            String part2 = DataToSend.substring(DataToSend.indexOf("["),DataToSend.indexOf("]")+1);
            //store values into mysql database
            String query = "INSERT INTO boundingboxes(name, box) VALUES('"+part1+"','"+part2+"')";
            st.executeUpdate(query);
        }

    }catch (SQLException ex){
        Logger lgr = Logger.getLogger(Version.class.getName());
        lgr.log(Level.SEVERE, ex.getMessage(), ex);

    }finally{
        //make sure to avoid null pointerexception 
        try{
            if (st !=null){
                st.close();
            }
            if (con != null){
                con.close();
            }
        }catch (SQLException ex){
            Logger lgr = Logger.getLogger(Version.class.getName());
            lgr.log(Level.WARNING, ex.getMessage(), ex);
        }
    }

    return input; 
}



}

1 Ответ

0 голосов
/ 03 декабря 2011

Я нашел решение своих проблем: чтобы избавиться от NoClassDefFoundError, внешние файлы .jar, используемые вашим приложением, должны быть непосредственно скопированы в / WEB-INF / lib /.

Apache требует дополнительного шага настройки для jdbc-msql.Во-первых, убедитесь, что вы установили правильные разрешения GRANT, настроенные для вашей базы данных SQL.

Далее следуйте его решению, которое взято из: http://dev.mysql.com/doc/refman/5.0/en/connector-j-usagenotes-j2ee.html#connector-j-usagenotes-tomcat

Сначала установите .jarфайл, который поставляется с Connector / J в каталоге $ CATALINA_HOME / common / lib, чтобы он был доступен для всех приложений, установленных в контейнере.

Затем настройте источник данных JNDI, добавив ресурс объявления в $ CATALINA_HOME / conf /server.xml в контексте, который определяет ваше веб-приложение:

<Context ....>

...

<Resource name="jdbc/MySQLDB"
       auth="Container"
       type="javax.sql.DataSource"/>

<!-- The name you used above, must match _exactly_ here!

The connection pool will be bound into JNDI with the name
"java:/comp/env/jdbc/MySQLDB"
-->

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

<!-- Don't set this any higher than max_connections on your
 MySQL server, usually this should be a 10 or a few 10's
 of connections, not hundreds or thousands -->

    <parameter>
      <name>maxActive</name>
      <value>10</value>
    </parameter>

 <!-- You don't want to many idle connections hanging around
   if you can avoid it, only enough to soak up a spike in
   the load -->

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

 <!-- Don't use autoReconnect=true, it's going away eventually
 and it's a crutch for older connection pools that couldn't
 test connections. You need to decide whether your application
 is supposed to deal with SQLExceptions (hint, it should), and
 how much of a performance penalty you're willing to pay
 to ensure 'freshness' of the connection -->

  <parameter>
   <name>validationQuery</name>
   <value>SELECT 1</value> <-- See discussion below for update to this option -->
  </parameter>

  <!-- The most conservative approach is to test connections
  before they're given to your application. For most applications
  this is okay, the query used above is very small and takes
  no real server resources to process, other than the time used
  to traverse the network.

  If you have a high-load application you'll need to rely on
  something else. -->

  <parameter>
   <name>testOnBorrow</name>
   <value>true</value>
  </parameter>

   <!-- Otherwise, or in addition to testOnBorrow, you can test
   while connections are sitting idle -->

   <parameter>
    <name>testWhileIdle</name>
    <value>true</value>
   </parameter>

  <!-- You have to set this value, otherwise even though
   you've asked connections to be tested while idle,
   the idle evicter thread will never run -->

 <parameter>
  <name>timeBetweenEvictionRunsMillis</name>
  <value>10000</value>
 </parameter>

 <!-- Don't allow connections to hang out idle too long,
 never longer than what wait_timeout is set to on the
 server...A few minutes or even fraction of a minute
 is sometimes okay here, it depends on your application
 and how much spikey load it will see -->

 <parameter>
  <name>minEvictableIdleTimeMillis</name>
  <value>60000</value>
 </parameter>

 <!-- Username and password used when connecting to MySQL -->

 <parameter>
  <name>username</name>
  <value>someuser</value>
 </parameter>

 <parameter>
  <name>password</name>
  <value>somepass</value>
 </parameter>

 <!-- Class name for the Connector/J driver -->

 <parameter>
  <name>driverClassName</name>
  <value>com.mysql.jdbc.Driver</value>
 </parameter>

 <!-- The JDBC connection url for connecting to MySQL, notice
 that if you want to pass any other MySQL-specific parameters
 you should pass them here in the URL, setting them using the
 parameter tags above will have no effect, you will also
 need to use &amp; to separate parameter values as the
 ampersand is a reserved character in XML -->

 <parameter>
  <name>url</name>
  <value>jdbc:mysql://localhost:3306/test</value>
 </parameter>
...