1

EJB CMT で約 1 週間正気を失っていますが、解決策が見つかりません。任意の啓発をいただければ幸いです...

CMT EJBを作成し、成功データベース操作を実行しようとしているだけで、最後のデータベース操作が失敗します(SQLEXCEPTION)。私はすべての操作をロールバックすることを期待していましたが、それは起こっていません....

私の環境:

  • MySQL 5.5
  • グラスフィッシュ 3.0.1
  • 休止状態

私のEJB:

@Stateless(name = "UpdaterFacade", mappedName = "ejb/UpdaterFacade")
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Interceptors(DefaultFacadeInterceptor.class)
public class UpdaterFacade implements UpdaterFacadeRemote {
  @Resource
  private EJBContext context;

  @PersistenceContext(name = "EJB3DS")
  private EntityManager em;

  @Override
  public void updatePluginDatabase() throws Exception {
    try {
      em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '0' WHERE `property` = 'CMTTest';").executeUpdate();
      em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '1' WHERE `property` = 'CMTTest';").executeUpdate();
      em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '2' WHERE `property` = 'CMTTest';").executeUpdate();
      em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '3' WHERE `property` = 'CMTTest';").executeUpdate();

      em.createNativeQuery("ALTER TABLE `itemprices` DROP FOREIGN KEY `fk_itemprices_itemcodes1`;").executeUpdate();

      em.createNativeQuery("UPDATE `core_systemproperties` SET `value` = '4' WHERE `property` = 'CMTTest';").executeUpdate();
      em.createNativeQuery("RENAME TABLE `foo` TO `noo`;").executeUpdate();
    } catch (Exception e) {
      // throw new DatabaseCriticalException("ERP_000048", null, e);
      context.setRollbackOnly();
    }
  }
}

存在しないテーブル「foo」の名前を変更しようとする最後の行を除いて、コードは正常に実行されます。そのため、インジェクション、SQL 接続、データベースが機能しています (設定が間違っている可能性があります)。

「DROP FOREIGN」ステートメントの前に、行ごとにデバッグするとき(および別のプログラムでデータベースを行ごとにクエリするとき)に気付きました。その後、前のステートメントがコミットされます(他の接続/プログラムから見える) . メソッドの最後に到達する前に!

EJB が戻ると、「CMTTest」プロパティの値は「8」になり、FOREING KEY が削除され、RolledBack は何もありませんでした... =\

私はすでに「@ApplicationException(rollback = true)」で例外をスローしようとしましたが、後で明示的な呼び出し「setRollbackOnly()」に変更しましたが、効果はありませんでした...実際、これが問題だとは思いません。 EJB が終了する前にコミットされます。どういうわけか私は設定に失敗しています。たぶんCMTでのある種の自動コミット?絶望的な狂人に見える...

私のpersistence.xml

<persistence-unit name="EJB3DS" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/ERPDS</jta-data-source>
    <jar-file>CoreClient.jar</jar-file>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
    </properties>
</persistence-unit>

私のGlassFishプールは次のように構成されています:

JDBC 接続プールの編集

Edit JDBC Connection Pool

JDBC 接続プールの詳細属性の編集

Edit JDBC Connection Pool Advanced Attributes

JDBC 接続プールのプロパティを編集する

Edit JDBC Connection Pool Properties

他に何が重要なのかわからない! あらゆる種類のヘルプやヒントを事前に感謝します...

自分で見つけたら答えを投稿しますが、今では完全に迷っています。

皆さん、ありがとうございました..

4

1 に答える 1