6

アプリケーションのデプロイ中にエラーが発生しました。

環境は次のとおりです。

  • Jboss 7.1.3+Hibernate 4 + JPA
  • OJDBC : ojdbc6.jar

スタックトレースは次のとおりです。

09:13:30,703 WARN  [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (ServerService Thread Pool -- 127) HHH000341: Could not obtain connection metadata : could not turn on auto-commit in an active global transaction
09:13:30,703 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (ServerService Thread Pool -- 127) HHH000422: Disabling contextual LOB creation as connection was null
09:13:30,704 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 127) MSC00001: Failed to start service jboss.persistenceunit."css-ear-0.5.3-SIT.ear/css-submission-0.5.3-SIT.war#css-submission-PU": org.jboss.msc.service.StartException in service jboss.persistenceunit."css-ear-0.5.3-SIT.ear/css-submission-0.5.3-SIT.war#css-submission-PU": java.lang.NullPointerException
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:100) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_21]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_21]
    at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_21]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.0.0.GA.jar:2.0.0.GA]
Caused by: java.lang.NullPointerException
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:207)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:73)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2279)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2275)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:197) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$500(PersistenceUnitServiceImpl.java:57) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:96) [jboss-as-jpa-7.1.3.Final.jar:7.1.3.Final

standalone.xml のデータソース構成は、

<xa-datasource jta="true" jndi-name="java:jboss/datasources/PsaDS" pool-name="PsaDS" enabled="true" use-java-context="true" use-ccm="true">
  <xa-datasource-property name="URL">
        jdbc:oracle:thin:@<hsot>
  </xa-datasource-property>
  <driver>oracle</driver>
  <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
  <xa-pool>
        <min-pool-size>2</min-pool-size>
        <max-pool-size>50</max-pool-size>
        <prefill>true</prefill>
  </xa-pool>
  <security>
        <user-name>user</user-name>
        <password>pwd</password>
  </security>

使用しているドライバーは、

<drivers>
  <driver name="oracle" module="com.oracle.ojdbc6">
        <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
  </driver></drivers>
4

2 に答える 2

1

<xa-datasource>定義タグ内で、standalone.xml に次の変更を加えてみてください。

<xa-pool>タグ内に次を追加します。

<is-same-rm-override>false</is-same-rm-override>
<no-tx-separate-pools>true</no-tx-separate-pools>

ドキュメントによると:

no-tx-separate-pools: この要素の存在は、JTA トランザクションで使用される接続を JTA トランザクションなしで使用される接続から分離するために 2 つの接続プールが必要であることを示します。プールは、最初の使用時に遅延構築されます。その使用例は、JTA トランザクションの有無にかかわらず XA 接続を使用することを好まない Oracle (およびおそらく他のベンダー) の XA 実装です。

それが単独で機能しない場合は、これも<xa-datasource>定義に追加してみてください。

<validation>
      <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
      <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
      <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
于 2013-12-18T03:59:44.113 に答える
1

JBoss + Hibernate を使用したことはありません。だから私はこの調整を試みません。一部のドキュメントのみを読んでください。これらの調整を個別に試してください:

A) 休止状態のプロパティ

調整が必要hibernate.propertiesです。ドキュメントでこのオプションのプロパティを見つけました:

hibernate.connection.autocommit

JDBC プール接続の自動コミットを有効にします (推奨されません)。

例: true | 間違い

ドキュメント リンク

B)standalone.xml

<share-prepared-statements>- 目的は、ドライバーが自動コミット セマンティクスをローカル トランザクションに適用する場合に、疑わしいドライバーの動作を回避することです。プリペアド ステートメント キャッシュを有効にして、同じトランザクション内の 2 つのリクエストが同じステートメントを返すかどうか (jboss-4.0.2 以降 - デフォルト false)。

Connection c = dataSource.getConnection(); // auto-commit == false 
PreparedStatement ps1 = c.prepareStatement(...);    
ResultSet rs1 = ps1.executeQuery();    
PreparedStatement ps2 = c.prepareStatement(...);    
ResultSet rs2 = ps2.executeQuery();

準備されたステートメントが同じであると仮定します。一部のドライバーでは、ps2.executeQuery() が rs1 を自動的に閉じるため、実際には舞台裏で実際に準備された 2 つのステートメントが必要です。これは、クエリを再実行すると新しいトランザクションが自動的に開始される自動コミット セマンティックにのみ使用する必要があります。仕様に従うドライバーの場合、これを true に設定して、同じ実際の準備済みステートメントを共有できます。

ドキュメント リンク

于 2013-10-24T13:32:16.677 に答える