java - Glassfish4 和 MySQL 5.5.38 远程服务器 : com. mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

标签 java mysql jpa jdbc glassfish

我有 2 个亚马逊 ec2 实例。在第一个实例中,我的应用程序在 Glassfish4 应用程序服务器上运行,而在第二个实例中,我安装了 mysql。我必须连接到层。 我已将 mysql 配置为远程服务器,在 etc/mysql/my.conf 中设置 bind-address=0.0.0.0 并重新启动 mysql。然后我在 mysql 中创建一个 user@ 并将创建的数据库上的所有权限授予该用户。

在应用层,我使用以下 glassfish 命令创建了 jdbc 连接池:

create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --restype javax.sql.DataSource --property portNumber=3306:password=<PASSWORD>:user=<USER>:serverName=<MYSQL-SERVER-IP>:databaseName=<DATABASE-NAME> <CONNECTION-POOL-NAME>    

然后我在 Glassfish4 上部署我的应用程序。

在我的应用程序中,我使用以下方法:

public Connection getConnection() {
    Connection c = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        c = (Connection) DriverManager.getConnection(connectionString,username,password);
    } catch (SQLException e) {
        e.printStackTrace();
    }catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return c;
}    

我的应用程序也有一个特殊的功能。我使用 JPA 2.0 处理一些数据库实体,而其他一些则直接使用 SQL。所以我还有一个 persistence.xml,我在其中指定了以下属性:

<property name="javax.persistence.url" value="jdbc:mysql://<MYSQL-SERVER-IP>:3306/<DATABASE-NAME>"/>    

persistence.xml 属性中的 url 与 getConnection() 方法中的 connectionString 用户相同。在 persistence.xml 中,我还指定了访问数据库的用户名和密码。

我的应用程序主页显示两个按钮,一个用于使用 JPA 管理的实体初始化数据库,另一个用于使用 SQL 使用其余实体初始化数据库。第一个工作成功,数据库表在远程 mysql 服务器上创建。但是,当我单击第二个按钮时,它会抛出 CommunicationsException。

我在网上和 stackoverflow 上阅读了很多有关此问题的信息,我发现可能有多种原因。我特别阅读了以下讨论:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

并尝试解决几乎所有可能的原因,但一切似乎都有效。

在我看来,它应该与 JDBC 驱动有关。我还尝试将 mysql JDBC 连接器放在 glassfish4/glassfish/lib 文件夹中,但不起作用。将它放在应用程序类路径中也不起作用。

请原谅我的英语问题,如果我忘记在问题中指定某些内容。我希望我的问题符合 stackoverflow 的规则,因为我刚刚注册,这是我的第一篇文章。

预先感谢您的帮助。

最佳答案

根据您的问题给出的一些提示:

Then I create a user@ in mysql and granted all the privilegies on the created database to this user.

MySQL 身份验证机制验证用户+主机的组合,因此您需要确保您尝试连接的主机被允许这样做。例如,一个非常常见的错误是像这样创建用户:

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

如果您尝试从其他主机连接到 MySQL,那么您将不会成功。参见 MySQL - Adding user account了解更多详情。


On the application tier I create the jdbc connection pool [...]

看起来没问题,但您还应该使该池作为具有正确 JNDI 名称的 JDBC 资源可用(即:jdbc/ConnectionPoolName,这样您就可以使用 DataSource 通过使用注入(inject)直接在您的应用程序中。请参阅 Administering JDBC Resources 。如果您同时使用 JPA 和 JDBC,这是有效的。


Also my application has a particular feature. I handle some database entities using JPA 2.0 while some others directly using SQL.

如果您使用 JPA,则必须在 persistence.xml 中设置资源:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="MyPU" transaction-type="JTA">
    <jta-data-source>jdbc/ConnectionPoolName</jta-data-source>
    <properties />
  </persistence-unit>
</persistence>

如果您使用纯 JDBC API,则可以通过在 bean 中使用 @Resource 注入(inject) DataSource,如下所示:

@Stateless
public class MyJdbcBean {

    @Resource(lookup = "jdbc/ConnectionPoolName")
    private DataSource dataSource;

    public Connection getConnection() {
        if (dataSource != null) {
            return dataSource.getConnection();
        } else {
            Exception ex = new ExceptionInInitializerError("Couldn't initialize data source!");
            Logger.getLogger(MyJdbcBean.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
            throw ex;
        }
    }
}

I also tried to put the mysql JDBC connector in the glassfish4/glassfish/lib folder but doesn't work. Also putting it in the application classpath doesn't work.

根据我的经验,JDBC 连接器必须放在域的 lib/ext 文件夹中,即:glassfish-4.0/glassfish/domains/domain1/lib/ext

关于java - Glassfish4 和 MySQL 5.5.38 远程服务器 : com. mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26358833/

相关文章:

java - JPA 默认注释是什么

php - 检查一个表的ID是否用作另一个表的外键

mySQL长查询锁超时异常

mysql - JPA NamedNativeQuery 导致 SQL 异常错误代码 1064

Java:对依赖类的两个不同版本使用相同的代码

java - 其余可以 MediaType.MULTIPART_FORM_DATA 与 @Produces 一起使用

JAVA_HOME 目录不包含处理 Play 服务依赖项所需的 jar

java - 全屏时视口(viewport)似乎稍微偏离屏幕

PHP 创建 JSON 数组列表(数据来自 MySQL)

java - java中的日期格式不正确