Glassfish4和MySQL 5.5.38远程服务器:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

时间:2014-10-14 10:43:26

标签: 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的规则,因为我刚刚注册,这是我的第一篇文章。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

根据您的问题提供的一些提示:

  

然后我在mysql中创建了一个user @,并将创建的数据库的所有权限授予该用户。

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

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

如果您尝试从其他主机连接到MySQL,那么您将无法成功。有关详细信息,请参阅MySQL - Adding user account


  

在应用程序层,我创建了jdbc连接池[...]

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


  

我的应用程序也有一个特殊功能。我处理一些数据库   使用JPA 2.0的实体,而其他一些实体直接使用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中使用DataSource注入@Resource,如下所示:

@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;
        }
    }
}

  

我还尝试将mysql JDBC连接器放在glassfish4/glassfish/lib文件夹中但不起作用。也把它放进去   应用程序类路径不起作用。

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