Java,JPA,Glassfish,无效资源:jdbc / __ default__pm
我使用Glassfish 3.1.2.2(build 5),JPA,EclipseLink,MySQL
我通过Glassfish管理面板创建了MySQL池。 从GF管理面板ping到MySQL是可以的。
我用persistence.xml创建了app:
org.eclipse.persistence.jpa.PersistenceProvider
我试图部署它并得到错误:
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) ....
有没有人有想法发生了什么,该怎么办?
如果您只创建了MySQL连接池,则还必须创建JDBC资源。 这可以从用于创建连接池的上下文菜单中创建。
在我的Glassfish中,我的JDBC资源jdbc / __ default使用连接池mysql_lemon。
__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#GSDVG00185和http://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组件(如servletfilter,生命周期模块和第三方持久性管理器)使用此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结尾的资源。 这会强制使用此资源查找的所有连接都是非事务性的。
(我的同一个post,但现在有适当的帐户):
使用设置配置持久性时,只需在persistence.xml中为JDBC池设置JNDI名称。 可选,您可以设置目标数据库名称。
jdbc/mysql
我还鼓励将’drop-and-create-table’更改为’create-tables’,这样就不会丢失数据,这应该是以下列方式提供EclipseLink的属性:
也方便
这将创建模式和SQL脚本。
有关更多信息,请访问: http : //wiki.eclipse.org/EclipseLink/Examples/JPA/DDL或http://docs.oracle.com/cd/E19798-01/821-1752/gbwmj/index.html
我有同样的问题。
解决方案(适用于任何仍有此问题的人):
- 如果您使用带有Glassfish 4.1.1的NetBeans IDE 8.1,我建议您将其更改为Glassfish 4.1
- 转到NetBeans中的左侧面板。 单击
services > server > glassfish
然后右键单击(在Glassfish服务器中)并选择查看域管理控制台,应显示一个网页。 转到左侧,选择resources > JDBC
和JDBC连接池。 单击“new
添加新连接池,键入池名称。 接下来,选择javax.sql.ConnectionPoolDataSource
和datadriver
(在我的例子中是MySQL)并单击下一步。 之后,您应该输入数据库的所有必需信息。 - 返回
Resources > JDBC
。 这次,JDBC资源创建了一个新的JDBC资源(对我来说,我把它命名为jdbc/test
)。 不要忘记将它与您已创建的连接池链接。 - 在NetBeans中,转到
ejb
项目并修改persistence.xml
文件。 将datasource
更改为数据库资源(在我的示例中为jdbc/test
)并保存所有datasource
。
这应该工作(y)。
当我在netbeans instalattion向导创建的服务器上运行/部署应用程序时,我遇到了同样的问题。
为了解决我从官方网站下载了最后一个glassfish版本并转到:Netbeans>“服务选项卡”>“服务器”>“添加服务器…”。
请记住更改项目配置以使用新的glassfish服务器实例。
我有同样的问题,我坚信它是由一些keepig-cache引起的。
就在我完成之后
asadmin remove-domain domain1 asadmin create-domain domain1 firefox http://localhost:4848
现在__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();
我遇到了这个问题。我在admin consol中设置了jdbc连接池和jdbc资源。 但是我没有在persistence.xml中设置数据源。
jdbc/your-name false