Java, JPA, Glassfish, Invalid resource : jdbc/__default__pm

2022-09-01 11:58:25

我使用Glassfish 3.1.2.2(build 5),JPA,EclipseLink,MySQL

我通过Glassfish管理面板创建了MySQL池。从GF管理面板Ping到MySQL是可以的。

我创建了具有持久性的应用.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="myUnit">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/myDBName"/>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="myPass"/>
        <property name="javax.persistence.ddl-generation" value="drop-and-create-tables"/>
    </properties>
</persistence-unit>

我试图部署它,但得到错误:

Invalid resource : jdbc/__default__pm

[#|2012-11-16T02:20:59.480+0400|SEVERE|glassfish3.1.2|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=43;_ThreadName=Thread-2;|Invalid resource : jdbc/__default__pm
java.lang.RuntimeException: Invalid resource : jdbc/__default__pm

GF 日志中的堆栈跟踪非常庞大。开始于

at com.sun.enterprise.connectors.ConnectorRuntime.lookupDataSourceInDAS(ConnectorRuntime.java:540)
at com.sun.enterprise.connectors.ConnectorRuntime.lookupPMResource(ConnectorRuntime.java:469)
at org.glassfish.persistence.common.PersistenceHelper.lookupPMResource(PersistenceHelper.java:63)
at org.glassfish.persistence.jpa.ProviderContainerContractInfoBase.lookupDataSource(ProviderContainerContractInfoBase.java:71)
....

有没有人知道发生了什么以及该怎么办?


答案 1

如果您只创建了 MySQL 连接池,则还必须创建 JDBC 资源。这可以从用于创建连接池的上下文菜单上方的上下文菜单中创建。

Example Glassfish jdbc resource setup

在我的 Glassfish(我的 JDBC 资源)中,jdbc/__default 正在使用连接池mysql_lemon。


答案 2

__nontx和__pm是池的扩展。文档:https://docs.oracle.com/cd/E19798-01/821-1752/beamr/index.htmlhttp://docs.oracle.com/cd/E26576_01/doc.312/e24930/jdbc.htm#GSDVG00185http://docs.oracle.com/cd/E26576_01/doc.312/e24930/transaction-service.htm#GSDVG00512)

第一__pm

https://docs.oracle.com/cd/E19798-01/821-1752/gavro/index.html 相比

允许非组件调用方

您可以允许非 Java-EE 组件(如 servlet 过滤器、生命周期模块和第三方持久性管理器)使用此 JDBC 连接池。返回的连接将自动与从事务管理器获取的事务上下文一起登记。标准 Java EE 组件也可以使用此类池。容器不会在事务结束时自动关闭非组件调用方获得的连接。它们必须由调用方显式关闭。

您可以通过以下方式启用非组件调用方:

选中管理控制台中编辑连接池高级属性页面上的允许非组件调用方框。默认值为 false。有关详细信息,请单击管理控制台中的“帮助”按钮。

在 asadmin create-jdbc-connection-pool 命令中指定----允许非组件呼叫者“选项。有关详细信息,请参阅 Oracle GlassFish Server 3.0.1 参考手册。

在 asadmin set 命令中指定允许非组件调用方选项。例如:

asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.allow-non-component-callers=true

有关详细信息,请参阅 Oracle GlassFish Server 3.0.1 参考手册。

创建具有__pm后缀的 JDBC 资源。

__nontx

https://docs.oracle.com/cd/E19798-01/821-1752/beamu/index.html 相比

使用非事务性连接

您可以通过以下任一方式指定非事务性数据库连接:

选中管理控制台中新建 JDBC 连接池或编辑连接池页面上的非事务性连接框。默认值为未选中状态。有关详细信息,请单击管理控制台中的“帮助”按钮。

在 asadmin create-jdbc-connection-pool 命令中指定----nontransactionalconnections 选项。有关详细信息,请参阅 Oracle GlassFish Server 3.0.1 参考手册。

在 asadmin set 命令中指定非事务性连接选项。例如:

asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.non-transactional-connections=true

有关详细信息,请参阅 Oracle GlassFish Server 3.0.1 参考手册。

使用 GlassFish Server 中的 DataSource 实现,它提供了一个 getNonTxConnection 方法。此方法检索不在任何事务范围内的 JDBC 连接。有两种变体。

public java.sql.Connection getNonTxConnection() throw java.sql.SQLException

public java.sql.Connection getNonTxConnection(String user, String password) throw java.sql.SQLException

创建 JNDI 名称以__nontx结尾的资源。这将强制使用此资源查找的所有连接都是非事务性的。


推荐