MySQL 无法从 Glassfish 的 JDBC 连接池连接
最近遇到了在 Glassfish 应用服务器上配置 MySQL 数据源时无法从 JDBC 连接池连接的问题。经过一番调查,最终找到了解决方法,在这里分享给大家。
阅读更多:MySQL 教程
背景介绍
Glassfish 应用服务器是一个开源的 Java EE 应用服务器,提供了丰富的功能,可以用于开发和部署 Java Web 应用程序。它支持多种数据库,包括 MySQL、Oracle、DB2 等。在 Glassfish 中,连接数据库需要配置数据源和 JDBC 连接池。
在使用 MySQL 作为 Glassfish 的数据源时,我们需要下载 MySQL Connector/J 驱动程序,将其复制到 Glassfish 的 lib 目录中,然后在 Glassfish 管理控制台中配置数据源和 JDBC 连接池。这个过程可以参考一些官方文档或者其他教程。
但是,在配置好数据源和 JDBC 连接池之后,我们有可能遇到一些问题,比如连接池无法建立,连接数不够,连接超时等等。这篇文章就是为了解决其中的一种问题:MySQL 无法从 Glassfish 的 JDBC 连接池连接。
问题分析
当 MySQL 无法从 Glassfish 的 JDBC 连接池连接时,我们可以通过查看 Glassfish 的日志文件来了解具体原因。在 Glassfish 的域目录下,有一个 logs 目录,在该目录下有多个日志文件,其中一个是 server.log,该文件记录了 Glassfish 服务器的运行日志,包括启动、关闭、调试信息等等。
在 server.log 文件中,我们可以搜索关键词“JDBC”,查找与 JDBC 数据库连接相关的信息。如果存在连接池无法建立或连接失败的日志记录,可以根据错误信息来分析问题。
例如,下面是一个 MySQL 连接池创建失败的日志记录:
[#|2019-09-24T22:11:35.332-0400|SEVERE|javax.enterprise.system.core|_ThreadID=1;_ThreadName=main;_TimeMillis=1569365495332;_LevelValue=1000;|
Exception while deploying the app [abc-war] :
Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
Exception Description: Predeployment of PersistenceUnit [abc-war] failed.
Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions:
...
Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.IntegrityException
...
Caused by: org.eclipse.persistence.exceptions.IntegrityException
Descriptor Exceptions:
...
Internal Exception: java.sql.SQLException: Unable to get physical connection from JDBC connection pool [abcpool].
...
Caused by: java.sql.SQLException: Unable to get physical connection from JDBC connection pool [abcpool].
...
Caused by: javax.resource.spi.ResourceAllocationException: Unable to allocate connection in pool|
可以看到,日志中的关键字是“EclipseLink-28018”,这是 Glassfish 中的 ORM 框架的错误信息。错误信息显示,连接池无法分配连接,原因是从 JDBC 连接池“abcpool”中无法获取物理连接。这可能是因为 MySQL 数据库的开放连接数不足,导致 Glassfish 没有可用的连接。此时,我们可以通过增加 MySQL 数据库的最大连接数来解决问题。下面是具体的处理方法。
解决方法
方法一:修改 MySQL 数据库配置
在 MySQL 数据库中,有一个参数 max_connections,用于指定 MySQL 的最大并发连接数。如果该参数值太低,则可能会导致连接不足的情况。因此,我们可以通过修改该参数的值来增加 MySQL 的最大连接数。
具体的方法是登录到 MySQL 数据库中,通过执行以下命令来修改参数值:
mysql> SET GLOBAL max_connections = 1000;
其中,1000 是新的参数值,可以根据实际需求进行调整。需要注意的是,该命令必须使用 MySQL 的超级用户权限才能执行。如果没有超级用户权限,可以考虑联系数据库管理员执行该操作。
修改完成后,我们可以通过以下命令来验证参数值是否修改成功:
mysql> SHOW VARIABLES LIKE 'max_connections';
如果参数值已经修改为新的值,则表示修改成功。此时,我们可以重新启动 Glassfish 应用服务器,并查看日志文件中是否还存在连接池无法建立的问题。如果问题已经解决,则恭喜你,这个方法已经成功了。
方法二:增加 Glassfish 中的连接池大小
除了修改 MySQL 数据库的最大连接数之外,我们还可以通过在 Glassfish 中增加连接池的大小来解决连接不足的问题。具体的方法是在 Glassfish 管理控制台中,找到数据源的配置页面,然后修改连接池的属性。
连接池的属性包括最小连接数、最大连接数、空闲连接数、连接超时时间等等。我们可以根据实际需求来调整这些属性的值,以达到增加连接池大小的目的。
需要注意的是,增加连接池大小可能会占用更多的系统资源,因此需要根据实际情况来选择适当的连接池大小。过小的连接池可能会导致连接不足的情况,而过大的连接池则可能会消耗过多的内存和 CPU 资源,影响系统的性能。
总结
通过本文的介绍,我们了解了 MySQL 无法从 Glassfish 的 JDBC 连接池连接的问题,并提供了两种解决方法:修改 MySQL 数据库的最大连接数和增加 Glassfish 中的连接池大小。这些方法都可以有效地解决连接不足的问题,提高系统的可靠性和性能。如果你在使用 Glassfish 和 MySQL 数据库时遇到了连接池无法连接的问题,不妨试试以上的方法。