Java, JPA, Glassfish, Invalid resource: jdbc/__ default__pm
Я использую Glassfish 3.1.2.2 (сборка 5), JPA, EclipseLink, MySQL
Я создал пул MySQL через панель администратора Glassfish. Ping to MySQL из панели администрирования GF в порядке.
Я создал приложение с 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
Stacktrace в журнале 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.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-компоненты, такие как фильтры сервлетов, жизненных циклов и сторонних менеджеров персистентности, использовать это Пул соединений JDBC. Возвращаемое соединение автоматически зачислен в контекст транзакции, полученный из транзакции менеджер. Стандартные компоненты Java EE также могут использовать такие пулы. Соединения, полученные некомпонентными абонентами, не являются автоматически закрывается в конце транзакции контейнером. Они должны быть явно закрыто вызывающим.
Вы можете включить некомпонентных абонентов следующими способами:
Отметьте флажок Разрешить некомпонентные вызывающие абоненты на странице "Расширенные атрибуты пула подключений" в Консоли администрирования. default - false. Для получения дополнительной информации нажмите кнопку "Справка" в Консоль администрирования.
Укажите параметр ---- allownoncomponentcallers в команде asadmin create-jdbc-connection-pool. Для получения дополнительной информации см. Справочное руководство Oracle GlassFish Server 3.0.1.
Укажите опцию allow-non-component-callers в команде set asadmin. Например:
asadmin set domain1.resources.jdbc-connection-pool.DerbyPool.allow-non-component-callers = true
Дополнительные сведения см. в справочном руководстве Oracle GlassFish Server 3.0.1.
Создайте ресурс JDBC с суффиксом __pm.
и __ nontx
из https://docs.oracle.com/cd/E19798-01/821-1752/beamu/index.html
Использование не-транзакционных подключений
Вы можете указать соединение без транзакции в любой из эти способы:
Отметьте флажки Non-Transactional Connections на пуле подключений нового JDBC или выберите Пул соединения пула в Администрировании Консоль. Значение по умолчанию не отмечено. Для получения дополнительной информации нажмите Справка в Консоли администрирования.
Укажите параметр ---- nontransactionalconnections в команде asadmin create-jdbc-connection-pool. Для получения дополнительной информации см. Справочное руководство 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.
Используйте реализацию DataSource на сервере GlassFish, которая предоставляет метод getNonTxConnection. Этот метод извлекает JDBC которое не входит в объем транзакции. Есть два варианты.
public java.sql.Connection getNonTxConnection() throws java.sql.SQLException
public java.sql.Connection getNonTxConnection (String user, String password) бросает java.sql.SQLException
Создайте ресурс с именем JNDI, заканчивающимся на __nontx. Это заставляет все соединения искать, используя этот ресурс, транзакционный.
Ответ 3
(Тот же самый пост, но с надлежащей учетной записью сейчас):
При настройке настойчивости с вашей установкой вы устанавливаете только имя JNDI для пула JDBC в файле persistence.xml. Необязательно, вы можете установить имя целевой базы данных.
<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
Ответ 4
У меня была та же проблема.
Решение (для любого, у кого еще есть эта проблема):
- если вы используете среду IDE NetBeans 8.1 с Glassfish 4.1.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
) и сохраните все.
Это должно работать (y).
Ответ 5
У меня была такая же проблема, когда я запускал/развертывал приложение на сервере, созданном мастером instabetion netbeans.
Чтобы решить, я загрузил последнюю версию из стеклянной рыбы с официального сайта и отправился в:
Netbeans > "Вкладка" Сервис " > " Серверы " > " Добавить сервер... ".
Не забудьте изменить конфигурацию вашего проекта, чтобы использовать новый экземпляр сервера Glassfish.
Ответ 6
У меня была эта проблема. Я устанавливаю пул соединений 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
Это могло произойти из-за ошибки 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>
Ответ 8
У меня была та же проблема, и я твердо уверен, что это вызвано некоторыми остальными кешами.
Сразу после того, как я сделал
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();