2

MySQL データベースにアクセスする必要がある JAX-RS レストフル サービスがあります。CDI とエンティティ マネージャーを使用してこれを実行しようとしています。ただし、アプリを公開すると、不適切な永続化ユニットが使用されているように見えます (ポート 3306 ではなくポート 1527 で接続しようとしています)。

try/catch によってキャッチされる例外は次のとおりです。

javax.servlet.ServletException: 
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: Connection could not be allocated because: 
java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused: connect.
Error Code: 0

安らかなサービスは次のとおりです。

@Path("/databases")
@Stateless
public class DatabaseResource {

    @PersistenceUnit(unitName = "beta.example.services")
    EntityManagerFactory entityManagerFactory;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response list() {
        try {

            EntityManager entityManager = entityManagerFactory.createEntityManager();
            Connection connection = entityManager.unwrap(java.sql.Connection.class);

            ...

            return Response.ok().build();

        } catch (SchemaCrawlerException e) {
            return Response.status(500).entity(e.getMessage()).build();
        }
    }
}

持続性ユニット (src/META-INF にあります):

<?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="beta.example.services">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/" />
            <property name="javax.persistence.jdbc.user" value="test" />
            <property name="javax.persistence.jdbc.password" value="test" />
        </properties>
    </persistence-unit>
</persistence>

どんな助けでもいただければ幸いです

4

1 に答える 1

2

永続化ユニットは、RESOURCE_LOCAL と JTA の 2 つのモードで構成できます。
元:

<persistence-unit name="beta.example.services" transaction-type="JTA">

VS

<persistence-unit name="beta.example.services" transaction-type="RESOURCE_LOCAL">

JTA がデフォルト値です。「javax.persistence.jdbc.*」などのプロパティは、「RESOURCE_LOCAL」を使用する場合にのみ読み取られます。JTA を使用する場合は、glassfish のトランザクション マネージャーが使用されます。つまり、この場合、次のように JNDI 名を指定する必要があります。

<jta-data-source>youJNDIName</jta-data-source>

私が考えているのは、デフォルトの「JTA」トランザクションタイプを使用していることですが、jta-datasource を指定していないため、glassfish のデフォルトのものを使用しようとする可能性があります (derby を指します)。

RESOURCE_LOCAL または JTA としての持続性ユニット?

http://openejb.apache.org/jpa-concepts.html

エンティティマネージャーの使用方法を見ると、トランザクションタイプを RESOURCE_LOCAL に設定することが解決策のようです。

于 2012-07-25T15:13:01.950 に答える