I have successfully made a connection to a remote MySQL server through Glassfish, however each time I make a change to the code or XHTML files, I need to open the administrator panel of Glassfish and flush the connection pool, otherwise I get the following error when I just refresh the page. Has anybody experienced this? I can post code or other information if it is needed.
HTTP Status 500 –
type Exception report
message
descriptionThe server encountered an internal error () that prevented
it from fulfilling this request.exception
javax.servlet.ServletException: WELD-000049 Unable to invoke [method]
@PostConstruct public
com.myapp.QuestionController.initialize() on
com.myapp.QuestionController@4635bd2aroot cause
org.jboss.weld.exceptions.WeldException: WELD-000049 Unable to invoke
[method] @PostConstruct public
com.myapp.interfaces.QuestionController.initialize() on
com.myapp.interfaces.QuestionController@4635bd2aroot cause
java.lang.reflect.InvocationTargetException
root cause
javax.ejb.EJBException
root cause
javax.persistence.PersistenceException: Exception [EclipseLink-4002]
(Eclipse Persistence Services – 2.3.0.v20110604-r9504):
org.eclipse.persistence.exceptions.DatabaseException Internal
Exception: java.sql.SQLException: Error in allocating a connection.
Cause: java.lang.RuntimeException: Got exception during
XAResource.start: Error Code: 0root cause
Exception [EclipseLink-4002] (Eclipse Persistence Services –
2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException Internal
Exception: java.sql.SQLException: Error in allocating a connection.
Cause: java.lang.RuntimeException: Got exception during
XAResource.start: Error Code: 0root cause
java.sql.SQLException: Error in allocating a connection. Cause:
java.lang.RuntimeException: Got exception during XAResource.start:root cause
javax.resource.spi.ResourceAllocationException: Error in allocating a
connection. Cause: java.lang.RuntimeException: Got exception during
XAResource.start:root cause
com.sun.appserv.connectors.internal.api.PoolingException:
java.lang.RuntimeException: Got exception during XAResource.start:root cause
com.sun.appserv.connectors.internal.api.PoolingException:
java.lang.RuntimeException: Got exception during XAResource.start:root cause
java.lang.RuntimeException: Got exception during XAResource.start:
root cause
javax.transaction.xa.XAException:
com.sun.appserv.connectors.internal.api.PoolingException:
javax.resource.spi.LocalTransactionException: Communications link
failureThe last packet successfully received from the server was 435�409
milliseconds ago. The last packet sent successfully to the server was
7 milliseconds ago.
Persistence 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>
In the "Additional properties" in Glassfish connection pool settings I have just configured: servername, URL, user and password.
I HAVE SOLVED THIS PROBLEM
I made my own dual table, similar to the one in Oracle.
CREATE TABLE dual
(
x VARCHAR(1)
);
INSERT INTO dual(x) VALUES('y');
Best Answer
Your root cause,
PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure
is related to this Glassfish bug, which explains (in the comments tab at the bottom) that you may need to refresh your invalid connections.The bug comment by Jagadish says to check your connection validation type. If it is set to "autocommit" (the default), the JDBC drivers may cache the prior connection validation data, and no actual database interaction will happen during future connection validations.
To resolve the problem, set
connection-validation-method="table"
andvalidation-table-name="any_table_you_know_exists"
(replaceany_table_you_know_exists
with the name of any existing table). Doing this forces the connections to talk to the database instead of the cache; if the connection is invalid, it will be dropped and recreated. You may need to also specifyis-connection-validation-required="true"
.Articles to help with additional configuration:
Text from Jagadish's blog:
Note that the sample code refers to
sys.systables
, which is a MS SQL table that is guaranteed to exist. For Oracle, refer to the guaranteed tabledual
. For MySQL, create a 1-column table solely for validation purposes; play it safe and pre-populate the table by inserting one row of data.