Java - сбой связи

0

Я только что поговорил с моим хостом, что у меня есть моя веб-страница, и они говорят, что разрешают подключения JDBC.

В любом случае страница, которую вы можете просмотреть, это http://mystikrpg.com/mysqltest/mysqltry.html

Вот моя ошибка:

**** Looking for database...
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:343)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2308)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2122)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:774)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:375)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:289)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at test.init(test.java:38)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission [0:0:0:0:0:0:0:1]:4464 connect,resolve)
    at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:407)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:268)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:292)
    ... 16 more
java.lang.NullPointerException
    at test.init(test.java:69)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception: java.lang.NullPointerException

и вот код:

Что я делаю неправильно?

//package mysqltest;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.TextArea.*;
import java.sql.*;
import java.util.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.net.*;
import java.applet.*;

public class test extends JApplet
{
    public JTextArea c;
    public void init()
    {
        c = new JTextArea();
        add(c);
        c.append("**** Looking for database...");
        Connection conn = null;
        Properties props = new Properties();
        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "mystik";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "";
        String loggedusername = getParameter("name");
        boolean online = false;
        try
        {
            Class.forName(driver).newInstance();
            online = true;
            if (online)
            {
                // if user loads applet online
                conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");
            }
            else
            {
                // for localhost - testing purposes props.put("user", "root");
                conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mystik", props);
            }
            c.append("\nConnected to the database");
            c.append("\nGetting stats for: " + loggedusername);
            PreparedStatement statement = conn.prepareStatement( "select * from `user` where `username` = '"+loggedusername+"'");
            ResultSet result = statement.executeQuery();
            // just a dumb mysql statement! while(result.next())
            {
                c.append("\nUsername: "+result.getString(2)+ "\nLevel: "+result.getString(6)+"\nEXP: "+result.getString(8)+"\n");
            }
            PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666' where `username` = '"+loggedusername+"'");
            updateEXP.executeUpdate();
            ResultSet xresult = statement.executeQuery();
            while(xresult.next())
            {
                c.append("\nUsername: "+xresult.getString(2)+ "\nLevel: "+xresult.getString(6)+"\nEXP: "+xresult.getString(8)+"\n");
            }

            c.append("\nDisconnected from database");
        }
        catch (Exception e)
        {
            System.out.println(c.getText());
            e.printStackTrace();
        }finally {
            try {
            conn.close();
        }catch(SQLException dan) {dan.printStackTrace(); }
        }
    }
}
  • 1
    Вы должны сделать nullcheck в finally , как так , if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } чтобы избежать NPE в конце трассировки, потому что соединение не было получено.
Теги:
jdbc

2 ответа

3
Лучший ответ

Цитата вашего кода:

  // if user loads applet online
  conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");

Апплет - это программа, запущенная на машине пользователя, где находится браузер. Таким образом, localhost относится к пользовательской машине на этом этапе. Скорее всего, большинство пользователей не запускают MySQL на своей собственной машине, даже если бы это было так, это был не тот, который вам нужен, и что он все равно выйдет из среды с песочницей.

EDIT (после обсуждения в комментариях):

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

  • Вы были обеспокоены отправкой своего имени пользователя и пароля в своих примерах. Это лишь незначительная проблема по сравнению с тем, что может произойти, если вы широко распространили ваш апплет: каждый мог легко просмотреть трафик, отправленный вашим приложением на ваш сервер MySQL, и получить имя пользователя/пароль.
  • Большинство серверов MySQL блокируются от внешнего доступа, главным образом потому, что они не обеспечивают соответствующего контроля доступа самостоятельно по сравнению с требованиями к доступу к общему приложению. Это не всегда так, но контроль доступа на операциях INSERT/SELECT/UPDATE сам по себе часто слишком груб, чтобы представлять функциональную цель всего приложения.

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

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

Я не уверен, что ваша служба хостинга позволяет запускать службы Java, но более дешевые хостинг-провайдеры имеют тенденцию позволять вам запускать службы PHP, Perl и/или Python, чтобы вы могли написать услугу на одном из этих языков и апплет быть клиентом, который говорит с ними.

Объяснение того, как писать веб-службы, возможно, выходит за рамки этого вопроса/ответа. В общем, вы, вероятно, столкнетесь с тремя категориями: веб-сервисы в стиле REST (это архитектурный стиль, ориентированный на понятие ресурсов и представлений), XML-RPC (часто называемый "REST" по ошибке, где вы отправляете фрагменты XML на какую-либо веб-страницу, которая вызовет функцию/метод и даст вам некоторые результаты взамен; вы можете сделать то же самое с JSON) и SOAP (где вы, вероятно, получите больше инструментов, но также можете быть более раздутыми в зависимости от того, с чем вам удобно). Были продолжающиеся дебаты о том, что лучше, но вам решать, как вы думаете, лучше для вашего приложения. Вероятно, это зависит от того, что может быть установлено на вашем хосте.

  • 0
    +1: есть минута впереди меня!
  • 0
    Однако в своем предыдущем вопросе он использовал правильный URL. Я понятия не имею, почему это изменено на localhost. @Dan: кстати, AccessControlException - это как раз то исключение, которое указывает на то, что апплет, вероятно, неправильно подписан (ссылаясь на комментарии в предыдущем вопросе)
Показать ещё 17 комментариев
0

NPE - это потому, что Connection conn никогда не инициализируется - это то, что взрывается.

Я бы рекомендовал использовать инструмент подключения к базе данных (например, MySQL Workbench), чтобы установить правильный URL из вашей системы в mystikrpg.com; если у вас есть правильный URL-адрес, вы можете поместить его в свой апплет.

Как указал @Bruno, апплет запускается локально.

  • 0
    Действительно, но этот NPE находится только в блоке finally, который должен содержать if (conn!=null) { conn.close(); } , это побочный эффект исходной проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню