为什么每次重新部署时都需要刷新连接池?

2022-09-03 13:47:26

我已经通过Glassfish成功连接到远程MySQL服务器,但是每次我对代码或XHTML文件进行更改时,我都需要打开Glassfish的管理员面板并刷新连接池,否则当我刷新页面时,我会收到以下错误。有人经历过这种情况吗?如果需要,我可以发布代码或其他信息。

HTTP 状态 500 -

类型异常报告

消息

描述服务器遇到内部错误 (),导致无法满足此请求。

例外

javax.servlet.ServletException: WELD-000049 無法在 com.myapp.QuestionController@4635bd2a 上@PostConstruct public com.myapp.QuestionController.initialize() invoke [method]

根源

org.jboss.weld.exceptions.WeldException: WELD-000049 無法在 com.myapp.interfaces.QuestionController@4635bd2a 上@PostConstruct public com.myapp.interfaces.QuestionController.initialize() 啟用 [method]

根源

java.lang.reflect.InvocationTargetException

根源

javax.ejb.EJBException

根源

javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: 分配连接时出错。原因:java.lang.RuntimeException: 在 XAResource.start 期间出现异常:错误代码:0

根源

异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException 内部异常: java.sql.SQLException: 分配连接时出错。原因:java.lang.RuntimeException: 在 XAResource.start 期间出现异常:错误代码:0

根源

java.sql.SQLException:分配连接时出错。原因:java.lang.RuntimeException: 在 XAResource.start 期间出现异常:

根源

javax.resource.spi.ResourceAllocationException:分配连接时出错。原因:java.lang.RuntimeException: 在 XAResource.start 期间出现异常:

根源

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: Got exception during XAResource.start:

根源

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException: Got exception during XAResource.start:

根源

java.lang.RuntimeException: 在 XAResource.start 期间 Got exception:

根源

javax.transaction.xa.XAException: com.sun.appserv.connectors.internal.api.PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure

从服务器成功接收的最后一个数据包是 435 409 毫秒前。成功发送到服务器的最后一个数据包是 7 毫秒前。

配置的图像

持久性 XML

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="SertifikatPU" transaction-type="JTA">
        <jta-data-source>jdbc/sertifikatdb</jta-data-source>
    </persistence-unit>
</persistence>

在我刚刚配置的 Glassfish 连接池设置中的“其他属性”中:服务器名称、URL、用户和密码。


我已经解决了这个问题

enter image description here

我制作了自己的双表,类似于Oracle中的表。

CREATE TABLE dual 
(
    x VARCHAR(1)
);

INSERT INTO dual(x) VALUES('y');

答案 1

您的根本原因与此Glassfish错误有关,该错误解释了(在底部的评论选项卡中)您可能需要刷新无效连接。PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure

Jagadish的错误注释说要检查您的连接验证类型。如果它设置为“自动提交”(默认值),则 JDBC 驱动程序可能会缓存先前的连接验证数据,并且在将来的连接验证期间不会发生实际的数据库交互。

要解决此问题,请设置 和 (替换为任何现有表的名称)。这样做会强制连接与数据库而不是缓存通信;如果连接无效,它将被删除并重新创建。您可能还需要指定 。connection-validation-method="table"validation-table-name="any_table_you_know_exists"any_table_you_know_existsis-connection-validation-required="true"

有关其他配置帮助的文章:

  1. 本文还详细解释了该问题。
  2. Jagadish关于此主题的Oracle博客文章提供了更多信息。
  3. 详细解释玻璃鱼JDBC连接验证的文章。

来自Jagadish博客的文本:

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required=true
domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required = true

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method=table
domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method = table

bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name=sys.systables
domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name = sys.systables

请注意,示例代码引用 ,这是一个保证存在的 MS SQL 表。对于 Oracle,请参阅保证表 。对于MySQL,创建一个仅用于验证目的的1列表;安全播放,并通过插入一行数据来预填充表。sys.systablesdual


答案 2

是否应使用此驱动程序?

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

我看到您正在使用与附加图像不同的驱动程序...


推荐