Java,JPA,Glassfish,无效资源:jdbc / __ default__pm

时间:2012-11-15 22:40:46

标签: java jpa deployment glassfish

我使用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)
....

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

8 个答案:

答案 0 :(得分:25)

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

Example Glassfish jdbc resource setup

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

答案 1 :(得分: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

首先 __ 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命令中指定---- allownoncomponentcallers选项。有关更多信息,请参阅   Oracle GlassFish Server 3.0.1参考手册。

     

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

     

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

     

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()抛出java.sql.SQLException

     

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

     

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

答案 2 :(得分: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>

我还鼓励更改“删除 - 创建”表格&#39;要创建表格,以免丢失数据,这应该是以下列方式提供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/DDLhttp://docs.oracle.com/cd/E19798-01/821-1752/gbwmj/index.html

答案 3 :(得分:2)

我遇到了同样的问题。

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

  1. 如果您使用带有Glassfish 4.1.1的NetBeans IDE 8.1,我建议您将其更改为Glassfish 4.1
  2. 转到NetBeans中的左侧面板。单击services > server > glassfish,然后右键单击(在Glassfish服务器中)并选择查看域管理控制台,应显示一个网页。转到左侧,选择resources > JDBC和JDBC连接池。单击new添加新连接池,键入池名称。接下来,选择javax.sql.ConnectionPoolDataSourcedatadriver(在我的情况下是MySQL),然后单击下一步。之后,您应该输入数据库的所有必需信息。
  3. 返回Resources > JDBC。这次,JDBC资源创建了一个新的JDBC资源(对我来说,我将其命名为jdbc/test)。不要忘记将其与您已创建的连接池相关联。
  4. 在NetBeans中,转到ejb项目并修改persistence.xml文件。将datasource更改为数据库资源(在我的情况下为jdbc/test)并保存所有。
  5. 那应该有效(y)。

答案 4 :(得分:1)

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

要解决我从官方网站下载了最后一个glassfish版本并转到: Netbeans&gt; “服务标签”&gt; “服务器”&gt; “添加服务器......”。

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

答案 5 :(得分:0)

我遇到了同样的问题,我坚信它是由一些keepig-cache引起的。

在我完成之后

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

现在__pm不再附加到JDBC资源。

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

@PersistenceContext
EntityManager em;

这应该替换为 e.g。

em=Persistence.createEntityManagerFactory("DefaultPU(PUT_PERSISTANCE_UNIT_NAME_HERE").createEntityManager();
String ret="Hello " + txt + ", "+ em.createNamedQuery("Usertable.findAll").getResultList().get(0).toString() +" !" ;
em.close();

答案 6 :(得分:0)

我遇到了这个问题。我在admin consol中设置了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>

答案 7 :(得分:0)

这可能是由于a NetBeans bug they say they had fixed导致的,但似乎他们没有。作为一种解决方案,我最终完全删除了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>