Я только что поговорил с моим хостом, что у меня есть моя веб-страница, и они говорят, что разрешают подключения 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(); }
}
}
}
Цитата вашего кода:
// if user loads applet online
conn = DriverManager.getConnection("jdbc:mysql://localhost:4464/jsfdan_mystikdan", "jsfdan_muser", "test");
Апплет - это программа, запущенная на машине пользователя, где находится браузер. Таким образом, localhost
относится к пользовательской машине на этом этапе. Скорее всего, большинство пользователей не запускают MySQL на своей собственной машине, даже если бы это было так, это был не тот, который вам нужен, и что он все равно выйдет из среды с песочницей.
EDIT (после обсуждения в комментариях):
Из обсуждений и комментариев в предыдущих связанных вопросах, похоже, вы пытаетесь напрямую подключиться к вашему серверу MySQL из приложения (апплета), которое распространяется на клиентов, которые могут быть где угодно, что обычно является неправильным подходом.
В большинстве служб, использующих базу данных, управление пользователями и контроль доступа выполняются на уровне приложений, а не на уровне базы данных. Это особенно важно, если вы используете общий поставщик, который создает базу данных и учетную запись пользователя для всего вашего приложения, даже если вы хотите, чтобы несколько пользователей.
Типичным обходным решением для этого является создание другой службы (обычно веб-службы), которую будет вызывать ваш клиент, обеспечивая подходящий контекст аутентификации и использования для различных операций, которые вы хотите, чтобы клиент выполнял данные.
Я не уверен, что ваша служба хостинга позволяет запускать службы Java, но более дешевые хостинг-провайдеры имеют тенденцию позволять вам запускать службы PHP, Perl и/или Python, чтобы вы могли написать услугу на одном из этих языков и апплет быть клиентом, который говорит с ними.
Объяснение того, как писать веб-службы, возможно, выходит за рамки этого вопроса/ответа. В общем, вы, вероятно, столкнетесь с тремя категориями: веб-сервисы в стиле REST (это архитектурный стиль, ориентированный на понятие ресурсов и представлений), XML-RPC (часто называемый "REST" по ошибке, где вы отправляете фрагменты XML на какую-либо веб-страницу, которая вызовет функцию/метод и даст вам некоторые результаты взамен; вы можете сделать то же самое с JSON) и SOAP (где вы, вероятно, получите больше инструментов, но также можете быть более раздутыми в зависимости от того, с чем вам удобно). Были продолжающиеся дебаты о том, что лучше, но вам решать, как вы думаете, лучше для вашего приложения. Вероятно, это зависит от того, что может быть установлено на вашем хосте.
AccessControlException
- это как раз то исключение, которое указывает на то, что апплет, вероятно, неправильно подписан (ссылаясь на комментарии в предыдущем вопросе)
NPE - это потому, что Connection conn
никогда не инициализируется - это то, что взрывается.
Я бы рекомендовал использовать инструмент подключения к базе данных (например, MySQL Workbench), чтобы установить правильный URL из вашей системы в mystikrpg.com
; если у вас есть правильный URL-адрес, вы можете поместить его в свой апплет.
Как указал @Bruno, апплет запускается локально.
if (conn!=null) { conn.close(); }
, это побочный эффект исходной проблемы.
finally
, как так ,if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
чтобы избежать NPE в конце трассировки, потому что соединение не было получено.