0

リソースローカルデータソース(Oracle9i)をJBoss5.1.0にデプロイしています。

<datasources>
  <local-tx-datasource>
    <jndi-name>OracleDS</jndi-name>
    <connection-url>jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</connection-url>
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
    <user-name>***</user-name>
    <password>***</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <metadata>
        <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

永続性ユニット:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:OracleDS</non-jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

MDB内で、onMessageメソッドが呼び出されると、Beanを永続化し、namedQueryを介してそのタイプの最新の5つのBeanをフェッチしようとしています。

@PersistenceContext
    EntityManager em = null;
    public void onMessage(MyMessage msg) {
        Map message = msg.getMessageTree(false);
        Instrument instrument = em.find(Instrument.class, 55);      

        Tradeticker tt = createTradeticker(message);
        tt.setInstrument(instrument);

        log.info("Persisting tradeticker: " + tt.getTradeType());               
        em.persist(tt);             
        log.info("Tradeticker persisted...");

        List<Tradeticker> last5 = em.createNamedQuery("getLast5").setParameter(1,instrument.getInstrumentId()).setMaxResults(5).getResultList();
        log.info("Persisted tradetickers size: " + last5.size());
    }

私の問題は、エラーの痕跡がないのに、Oracleデータベースに永続化されたオブジェクトがないことです。多数のメッセージが送信された後、呼び出しlast5.size()は0を返します。ログは完全にクリーンです。

私が見つけたMDBの制限は、メソッドでREQUIREDまたはNOT_SUPPORTEDトランザクション属性を使用する必要があることだけです。私のonMessageには注釈が付いていないため、デフォルトでREQUIREDが使用されます。また、MDBクラスにアノテーションがないため、Beanはコンテナ管理のトランザクションを使用する必要があります。

私が間違っているのは何ですか?

4

3 に答える 3

2

jta以外のデータソースを使用する場合は、トランザクションを自分で管理する必要がありますか?つまり、トランザクションを取得してデータを自分でコミットしますか?そのようなことは私自身JTAに任せていますが、これを正しく読むと、あなたの場合は明示的にコミットする必要があるように見えます。

于 2009-10-15T13:55:59.120 に答える
2

わかった。これが私が問題を解決した方法です。1つ目はtxデータソースを定義し、2つ目はpersistence.xmlでjtaモデルとjta-datasourceを定義します。

新しいデータソース定義:

<datasources>
  <xa-datasource>
    <jndi-name>OracleDS</jndi-name>
    <isSameRM-override-value>false</isSameRM-override-value>
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</xa-datasource-property>
    <xa-datasource-property name="User">***</xa-datasource-property>
    <xa-datasource-property name="Password">***</xa-datasource-property>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
    <no-tx-separate-pools/>
    <metadata>
      <type-mapping>Oracle9i</type-mapping>
    </metadata>
  </xa-datasource>

jboss:service = TransactionManager

新しいpersistence.xml:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myEJB" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:OracleDS</jta-data-source>
        <class>hr.bel.model.Instrument</class>
        <class>hr.bel.model.Order</class>
        <class>hr.bel.model.OrderAdditionalData</class>
        <class>hr.bel.model.OrderCondition</class>
        <class>hr.bel.model.Trade</class>
        <class>hr.bel.model.TradeAdditionalData</class>
        <class>hr.bel.model.Tradeticker</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

私のJavaコードは同じで、オブジェクトを永続化しています。mysql dbmsを使用している同僚と話し合った結果、Oracleとそのtxおよびno-txデータソースが、データソースの使用方法と場所に厳しい制限を課していることがわかりました。皆さん、ありがとうございました!

于 2009-10-16T09:30:00.240 に答える
0

つまり、一般的なパターンは、ビジネスロジックをSLSBに配置し、それをMDBから呼び出すことです。これにより、ロジックの他の使用が可能になります。しかし、あなたの問題に違いはないはずです。

デフォルトのトランザクション属性が要求されることを期待します。これが失敗する理由はわかりません。

私はこれらのことをします:

1)。ビジネスロジックを試してみてください。例外はスローされますか?

2)。クエリを削除します。失敗する理由はわかりませんが、挿入を妨げる可能性がある場合は削除します。データベースに頼りましょう。コマンドラインSQLステートメントまたはその他のユーティリティを使用して、いくつかのメッセージが処理された後のDBの内容を確認します。

3)。ログをもう一度確認してください。どこかにエラーが表示されていますか?

于 2009-10-15T13:35:46.493 に答える