30

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

我通过 Glassfish 管理面板创建了 MySQL 池。从 GF 管理面板 Ping 到 MySQL 没问题。

我用 persistence.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 日志中的 Stacktrace 非常庞大。开始于

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)
....

有谁知道发生了什么以及该怎么做?

4

8 回答 8

27

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

示例 Glassfish jdbc 资源设置

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

于 2012-11-16T01:19:16.333 回答
6

__nontx 和 __pm 是池的扩展。文档:https ://docs.oracle.com/cd/E19798-01/821-1752/beamr/index.html (其他地方http://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

第一个下午

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

允许非组件调用者

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

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

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

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

在 asadmin set 命令中指定 allow-non-component-callers 选项。例如:

asadmin 设置 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 命令中指定 non-transactional-connections 选项。例如:

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

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

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

公共 java.sql.Connection getNonTxConnection() 抛出 java.sql.SQLException

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

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

于 2015-08-20T11:32:48.823 回答
4

(我的同一篇文章,但现在有正确的帐户):

使用您的设置配置持久性时,您只需在 persistence.xml 中设置 JDBC 池的 JNDI 名称。可选,您可以设置目标数据库名称。

<persistence-unit name="foo" transaction-type="JTA">
    <jta-data-source>jdbc/mysql</jta-data-source>
    <!--optional-->
    <property name="eclipselink.target-database" value="MySQL4"/>
</persistence-unit>

我还鼓励将“drop-and-create-table”更改为“create-tables”,这样您就不会丢失数据,这应该以以下方式提供 EclipseLink 的属性:

<property name="eclipselink.ddl-generation" value="create-tables"/>

也很方便

<property name="eclipselink.ddl-generation.output-mode" value="both"/>

这将创建模式和 sql 脚本。

欲了解更多信息,请访问:http ://wiki.eclipse.org/EclipseLink/Examples/JPA/DDL 或http://docs.oracle.com/cd/E19798-01/821-1752/gbwmj/index.html

于 2012-11-15T23:17:54.123 回答
3

我有同样的问题。

解决方案(对于仍然有此问题的任何人):

  1. 如果您将 NetBeans IDE 8.1 与 Glassfish 4.1.1 一起使用,我建议您将其更改为 Glassfish 4.1

  2. 转到 NetBeans 中的左侧面板。

单击services > server > glassfish然后右键单击(在 Glassfish 服务器中)并选择查看域管理控制台,应该会显示一个网页。

向左选择resources > JDBCJDBC connection pool

通过单击添加新的连接池new,输入池的名称。

接下来,选择javax.sql.ConnectionPoolDataSourcedatadriver(在我的例子中是 MySQL),然后单击下一步。

之后,您应该输入数据库所需的所有信息。

  1. 回到Resources > JDBC. 这一次,JDBC Resources创建一个新的 JDBC 资源(对我来说,我将它命名为jdbc/test)。不要忘记将它与您已经创建的连接池链接。

  2. 在 NetBeans 中,转到您的ejb项目并修改persistence.xml文件。更改datasource为数据库资源(在我的情况下jdbc/test)并保存所有。

那应该行得通。

于 2016-04-15T23:20:11.853 回答
1

当我在由 netbeans 安装向导创建的服务器上运行/部署应用程序时,我遇到了同样的问题。

为了解决这个问题,我从官方网站下载了最后一个 glassfish 版本,然后转到:Netbeans > “Service's Tab” > “Servers” > “Add Server...”。

请记住更改您的项目配置以使用新的 glassfish 服务器实例。

于 2014-04-08T19:03:23.053 回答
0

我遇到了这个问题。我在管理控制台中设置了 jdbc 连接池和 jdbc 资源。但我没有在 persistence.xml 中设置数据源。

  <persistence-unit name="OnlinePrintService-warPU" transaction-type="JTA">
    <jta-data-source>jdbc/your-name</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
于 2016-03-23T08:51:43.193 回答
0

这可能是由于他们说他们已经修复但似乎没有修复的 NetBeans 错误。作为一种解决方案,我最终glassfish-resources.xml完全删除了(因为我无法persistence.xml使用任何变通方法来获取它)并改用@DataSourceDefinition注释。

我的配置使用单独的DataSourceBean.java文件@DataSourceDefinition

@Singleton
@Startup
@DataSourceDefinition(name="java:global/jdbc/myDataSource",
    className="com.microsoft.sqlserver.jdbc.SQLServerDataSource",
    url="jdbc:sqlserver://127.0.0.1:1433;databaseName=myDB",
    user="myuser",
    password="mypassword"
)
public class DataSourceBean {
}

persistence.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">
    <persistence-unit name="myUnit" transaction-type="JTA">
        <jta-data-source>java:global/jdbc/myDataSource</jta-data-source>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
    </persistence-unit>
</persistence>
于 2019-07-07T12:12:06.593 回答
-1

我有同样的问题,我坚信这是由一些剩余缓存引起的。

就在我完成之后

asadmin remove-domain domain1
asadmin create-domain domain1 
firefox http://localhost:4848 

Now__pm不再附加到 JDBC 资源中。

如果这没有帮助,那么我假设您正在使用

@PersistenceContext
EntityManager em;

这应该替换为例如

em=Persistence.createEntityManagerFactory("DefaultPU(PUT_PERSISTANCE_UNIT_NAME_HERE").createEntityManager();
String ret="Hello " + txt + ", "+ em.createNamedQuery("Usertable.findAll").getResultList().get(0).toString() +" !" ;
em.close();
于 2013-05-17T12:32:27.607 回答