Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Glassfish4和MySQL 5.5.38远程服务器:com.MySQL.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障_Java_Mysql_Jpa_Jdbc_Glassfish - Fatal编程技术网

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

Java Glassfish4和MySQL 5.5.38远程服务器:com.MySQL.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障,java,mysql,jpa,jdbc,glassfish,Java,Mysql,Jpa,Jdbc,Glassfish,我有2个AmazonEC2实例。在第一个实例中,我的应用程序运行在Glassfish4应用程序服务器上,而在第二个实例中,我安装了mysql。我必须连接到第二层。 我已经将mysql配置为远程服务器,在etc/mysql/my.conf中设置bind address=0.0.0.0,然后重新启动mysql。然后,我在mysql中创建了一个user@,并将所创建数据库上的所有特权授予该用户 在应用层上,我使用以下glassfish命令创建jdbc连接池: create-jdbc-connectio

我有2个AmazonEC2实例。在第一个实例中,我的应用程序运行在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>    
我的应用程序还有一个特殊的功能。我使用JPA2.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中,我还指定了访问数据库的用户名和密码

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

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

并试图修复几乎所有可能的原因,但似乎一切都起了作用

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

请原谅我的英语,如果我忘了在问题中说明什么的话。我希望我的问题符合stackoverflow的规则,因为我刚刚注册,这是我的第一篇帖子


提前感谢您的帮助。

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

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

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

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
@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连接池[…]

看起来还可以,但是您还应该使用适当的JNDI名称(即:
JDBC/ConnectionPoolName
)将此池作为JDBC资源提供,这样您就可以通过使用注入直接在应用程序中使用
DataSource
。请参阅。如果同时使用JPA和JDBC,这是有效的


另外,我的应用程序还有一个特殊的特性:我处理一些数据库 实体使用JPA2.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>

我还尝试将mysql JDBC连接器放在
glassfish4/glassfish/lib
文件夹中,但不起作用 应用程序类路径不工作


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

关于我检查过的主机,我设置了正确的用户+主机对。JDBC资源是在persistence.xml中创建和设置的,实际上使用jpa管理的实体是正确的但是当我调用c=(Connection)DriverManager.getConnection(connectionString,username,password)时,它返回null。所以我应该使用SQL创建的实体没有被创建!这真的很奇怪!还因为如果我尝试在本地运行应用程序(本地mysql glassfish4实例),一切正常!我将尝试将连接器放在正确的文件夹中,并让您知道。将mysql-connector-java-5.1.33-bin.jar放在glassfish-4.0/glassfish/domains/domain1/lib/ext中,然后重新启动glassfish4不起作用。server.log还报告以下内容:成功发送到服务器的最后一个数据包是0毫秒前的。t驱动程序尚未从服务器收到任何数据包。您是否按照我的建议创建了JDBC资源?请注意
DriverManager.getConnection()
不再是使用JDBC的合适方式,它已被
数据源接口所取代。请参见。尝试从Glassfish ping数据库池,看看会发生什么。实际上,JPA正在工作:根据最后一条注释Glassfish无法连接到服务器。@Micheleguerrerousing Glassfish命令ping connection pool成功了。我认为glassfish能够连接到服务器,因为使用JPA数据库表已经创建。也许问题出在代码中,正如你所说,我必须使用数据源,但这不是我的应用程序,虽然允许我修改代码,但这应该是最后一次机会。现在,我甚至想修改应用程序代码,但是我不明白为什么如果我在本地机器上运行all,一切都会正常…无论如何,我会尝试使用数据源并让您知道。我将getConnection()替换为su建议的一个,并且我在lookup字段中指定了我的JDBC资源(与我在persistence.xml中指定的JDBC资源相同),但有些东西失败了,因为当我调用getConnection()dataSource=null并抛出ExceptionInInitializerError时。我还向我的类添加了@Stateless注释,但没有添加任何内容。你认为缺少什么吗?
@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;
        }
    }
}