0

我看过很多关于这个问题的帖子,它们涉及数据库权限或防火墙设置,但我似乎遇到了不同的问题。

我收到错误消息“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障。成功发送到服务器的最后一个数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。” 尝试从 Android 应用程序打开到远程数据库的 jdbc 连接时。

我知道这不是权限、防火墙或数据库可用性的问题,因为我能够使用完全相同的 java 类来连接不同的应用程序并进行更改,并且此功能在之前的代码迭代中运行良好,但是现在正在引起问题。它的调用方式相同,唯一的区别是在一个项目中它是一个 Android 应用程序,而在另一个项目中它是一个常规 Java 应用程序。如果有人对可能出现的问题有任何想法,请告诉我。我正在使用的类如下:

public class DatabaseHandler{

private static String address;
private String username;
private String password;
private static Connection con;

public DatabaseHandler(String url, String un, String pw){
    address = "jdbc:mysql://[remote server IP]:3306/nfcgeo";
    username = un;
    password = pw;
}

public void openDB() throws Exception{
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection(address, username, password);
}

在 android 应用程序的 MainMenu 类中:

 public void onCreate(Bundle savedInstanceState)
{
    setupDatabaseConnection(context);
    if(!dbAvailable)
    {
        noDatabaseConnection(context);       

    }

public static void setupDatabaseConnection(Context _context)
{
    try
    {
    dbHandle = new DatabaseHandler("","root","rootpw");
    dbHandle.openDB();
    dbAvailable = true;
    }
    catch(Exception e)
    {
        dbAvailable = false;
        e.printStackTrace();
    }
}

同样,如果在 android 应用程序之外使用 DatabaseHandler 类,它可以完美地工作,我只有在从主菜单调用它时才会得到异常。如果有人有任何想法,请告诉我。谢谢。

4

1 回答 1

0

发生这种情况是因为服务器没有分配给名为 u 的用户在此处作为用户名提供的权限

所以你需要在你的数据库上运行命令

  1. 将 *.* 上的所有权限授予由 somepassword username 标识的用户名 - 您将使用它连接到数据库密码 - 您将使用它连接到 dB。所以连接字符串现在将是 jdbc:mysql://ip:3306/dbname,username,password
  2. 刷新权限(检查拼写)
  3. 如果仍然不起作用,请将 bind-address:your ip 替换为 bind-address:0.0.0.0。该文件将位于 mysql 安装目录中。
于 2013-04-19T16:19:13.760 回答