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

时间:2011-10-18 16:38:14

标签: java mysql java-ee

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

  

HTTP状态500 -

     

输入例外报告

     

消息

     

description服务器遇到阻止的内部错误()   它来自履行这一要求。

     

例外

     

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

     

根本原因

     

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

     

根本原因

     

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持久性服务 -   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:分配a时出错   连接。原因: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毫秒之前。

Image of config

持久性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连接池设置的“其他属性”中:servername,URL,user和password。


  

我已解决了这个问题

enter image description here

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

CREATE TABLE dual 
(
    x VARCHAR(1)
);

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

2 个答案:

答案 0 :(得分:20)

您的根本原因PoolingException: javax.resource.spi.LocalTransactionException: Communications link failurethis Glassfish bug有关,它解释了(在底部的评论标签中)您可能需要刷新无效连接。

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. This article也详细解释了这个问题。
  2. 关于此主题的
  3. Jagadish's Oracle Blog Article有更多信息。
  4. Article详细解释Glassfish JDBC连接验证。
  5. 来自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
    

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

答案 1 :(得分:1)

你应该使用这个驱动程序吗?

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

我发现您使用的是与附加图像不同的驱动程序...