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

Luc*_*uke 15 java mysql java-ee

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

HTTP状态500 -

类型异常报告

信息

description服务器遇到内部错误(),导致无法完成此请求.

例外

javax.servlet.ServletException:WELD-000049无法在com.myapp.QuestionController@4635bd2a上调用[方法] @PostConstruct public com.myapp.QuestionController.initialize()

根本原因

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

根本原因

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内部异常: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:在XAResource.start期间出现异常:

根本原因

com.sun.appserv.connectors.internal.api.PoolingException:java.lang.RuntimeException:在XAResource.start期间出现异常:

根本原因

java.lang.RuntimeException:在XAResource.start期间出现异常:

根本原因

javax.transaction.xa.XAException:com.sun.appserv.connectors.internal.api.PoolingException:javax.resource.spi.LocalTransactionException:通信链接失败

从服务器成功收到的最后一个数据包是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>
Run Code Online (Sandbox Code Playgroud)

我刚刚配置的Glassfish连接池设置中的"其他属性":servername,URL,user和password.


我已经解决了这个问题

在此输入图像描述

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

CREATE TABLE dual 
(
    x VARCHAR(1)
);

INSERT INTO dual(x) VALUES('y');
Run Code Online (Sandbox Code Playgroud)

Jos*_*hDM 20

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

Jagadish的错误评论说要检查你的连接验证类型.如果将其设置为"autocommit"(默认值),则JDBC驱动程序可以缓存先前的连接验证数据,并且在将来的连接验证期间不会发生实际的数据库交互.

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

有助于其他配置的文章:

  1. 本文还详细解释了该问题.
  2. Jagadish关于此主题的Oracle博客文章有更多信息.
  3. 文章详细解释了Glassfish 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
Run Code Online (Sandbox Code Playgroud)

请注意,示例代码引用sys.systables,它是保证存在的MS SQL表.对于Oracle,请参阅保证表dual.对于MySQL,创建一个单列表仅用于验证目的; 通过插入一行数据来安全地播放表格.