web-dev-qa-db-ja.com

Java、JPA、Glassfish、無効なリソース:jdbc / __ default__pm

Glassfish 3.1.2.2(ビルド5)、JPA、EclipseLink、MySQLを使用します

Glassfish管理パネルを使用してMySQLプールを作成しました。 GF adminパネルは大丈夫です。

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

誰が何が起こったのか、何をすべきかを知っていますか?

26
Victor Mezrin

MySQL接続プールのみを作成した場合は、JDBCリソースも作成する必要があります。これは、接続プールの作成に使用したものの上にあるコンテキストメニューから作成できます。

Example Glassfish jdbc resource setup

私のGlassfishでは、JDBCリソースjdbc/__ defaultは接続プールmysql_lemonを使用しています。

24
Kevin

__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

from https://docs.Oracle.com/cd/E19798-01/821-1752/gavro/index.html

非コンポーネントの呼び出し元を許可する

サーブレットフィルター、ライフサイクルモジュール、サードパーティの永続性マネージャーなどの非Java-EEコンポーネントがこのJDBC接続プールを使用できるようにすることができます。返された接続は、トランザクションマネージャから取得したトランザクションコンテキストに自動的に登録されます。標準Java EEコンポーネントもこのようなプールを使用できます。非コンポーネントの呼び出し元が取得した接続は、コンテナによってトランザクションの終了時に自動的に閉じられません。呼び出し元が明示的に閉じる必要があります。

次の方法で、非コンポーネントの呼び出し元を有効にできます。

Administration Consoleの[接続プールの詳細属性の編集]ページで[非コンポーネントの呼び出し元を許可する]ボックスをオンにします。デフォルトは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

from https://docs.Oracle.com/cd/E19798-01/821-1752/beamu/index.html

非トランザクション接続の使用

以下のいずれかの方法で、非トランザクションデータベース接続を指定できます。

Administration Consoleの[新しいJDBC接続プール]または[接続プールの編集]ページの[非トランザクション接続]ボックスをオンにします。デフォルトはオフです。詳細については、Administration Consoleの[ヘルプ]ボタンをクリックしてください。

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リファレンスマニュアルを参照してください。

GetNonTxConnectionメソッドを提供するGlassFish ServerのDataSource実装を使用します。このメソッドは、トランザクションのスコープ内にないJDBC接続を取得します。 2つのバリアントがあります。

public Java.sql.Connection getNonTxConnection()throws Java.sql.SQLException

public Java.sql.Connection getNonTxConnection(String user、String password)throws Java.sql.SQLException

末尾が__nontxのJNDI名でリソースを作成します。これにより、このリソースを使用してルックアップされたすべての接続が強制的に非トランザクションになります。

6
Bernhard

(私の同じ投稿ですが、今は適切なアカウントを持っています):

セットアップで永続性を設定する場合、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>

また、「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
Pawel Solarski

同じ問題がありました。

解決策(この問題が解決しない場合):

  1. netBeans IDE 8.1とGlassfish 4.1.1を使用している場合、Glassfish 4.1に変更することをお勧めします
  2. NetBeansの左パネルに移動します。 [services > server > glassfish]をクリックしてから(Glassfishサーバーで)右クリックして[ドメイン管理コンソールの表示]を選択すると、Webページが表示されます。左側に移動して、resources > JDBCおよびJDBC接続プールを選択します。 newをクリックして新しい接続プールを追加し、プールの名前を入力します。次に、javax.sql.ConnectionPoolDataSourcedatadriver(私の場合はMySQL)を選択して、[次へ]をクリックします。その後、データベースに必要なすべての情報を入力する必要があります。
  3. Resources > JDBCに戻ります。今回、JDBCリソースは新しいJDBCリソースを作成します(私にとっては、jdbc/testと名付けました)。作成済みの接続プールとリンクすることを忘れないでください。
  4. NetBeansでejbプロジェクトに移動し、persistence.xmlファイルを変更します。 datasourceをデータベースリソース(私の場合はjdbc/test)に変更し、すべて保存します。

うまくいくはずです(y)。

2
Mourad Lamkas

Netbeans instalattionウィザードで作成されたサーバーでアプリを実行/デプロイするときに同じ問題が発生しました。

解決するために、公式サイトから最新のglassfishバージョンをダウンロードして、次の場所に移動しました:Netbeans> "Service's Tab"> "Servers"> "Add Server ..."。

新しいglassfishサーバーインスタンスを使用するようにプロジェクト構成を変更することを忘れないでください。

1
user3512459

これは 彼らが修正したと言っている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>
0
Wade

この問題が発生しました。管理コンソールで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>
0
John