【发布时间】:2014-12-09 03:07:36
【问题描述】:
我有 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的规则,因为我刚刚注册,这是我的第一篇文章。
提前感谢您的帮助。
【问题讨论】:
标签: java mysql jpa jdbc glassfish