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 接続プールの編集
JDBC 接続プールの詳細属性の編集
JDBC 接続プールのプロパティを編集する
他に何が重要なのかわからない! あらゆる種類のヘルプやヒントを事前に感謝します...
自分で見つけたら答えを投稿しますが、今では完全に迷っています。
皆さん、ありがとうございました..