Подтвердить что ты не робот

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

Есть ли у кого-нибудь идеи, что произошло и что делать?

4b9b3361

Ответ 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();