我使用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)
....
有没有人知道发生了什么以及该怎么做?
答案 0 :(得分:25)
如果您只创建了一个MySQL连接池,则还必须创建一个JDBC资源。这可以从用于创建连接池的上下文菜单中创建。
在我的Glassfish中,我的JDBC资源jdbc / __ default使用连接池mysql_lemon。
答案 1 :(得分:6)
首先 __ 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/DDL 或http://docs.oracle.com/cd/E19798-01/821-1752/gbwmj/index.html
答案 3 :(得分:2)
我遇到了同样的问题。
解决方案(适用于任何仍有此问题的人):
services > server > glassfish
,然后右键单击(在Glassfish服务器中)并选择查看域管理控制台,应显示一个网页。转到左侧,选择resources > JDBC
和JDBC连接池。单击new
添加新连接池,键入池名称。接下来,选择javax.sql.ConnectionPoolDataSource
和datadriver
(在我的情况下是MySQL),然后单击下一步。之后,您应该输入数据库的所有必需信息。 Resources > JDBC
。这次,JDBC资源创建了一个新的JDBC资源(对我来说,我将其命名为jdbc/test
)。不要忘记将其与您已创建的连接池相关联。 ejb
项目并修改persistence.xml
文件。将datasource
更改为数据库资源(在我的情况下为jdbc/test
)并保存所有。那应该有效(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>