Java 计划中的JTA用户事务

Java 计划中的JTA用户事务,java,transactions,ejb,schedule,Java,Transactions,Ejb,Schedule,我正在Glassfish服务器上开发一个JSF程序,其中包含一个MySQL数据库。我目前有一个单例LocalBean,其代码的简化版本如下所示: @Resource private UserTransaction trans; @Schedule(second = "30", minute = "*", hour = "*", dayOfWeek = "*", dayOfMonth = "*", month = "*", year = "*", info = "subTimer") priva

我正在Glassfish服务器上开发一个JSF程序,其中包含一个MySQL数据库。我目前有一个单例LocalBean,其代码的简化版本如下所示:

@Resource
private UserTransaction trans;

@Schedule(second = "30", minute = "*", hour = "*", dayOfWeek = "*", dayOfMonth = "*", month = "*", year = "*", info = "subTimer")
private void scheduledTimeout(final Timer t)
{
        InsertIntoDatabase();
    }

private void InsertIntoDatabase()
{
    trans.begin();
    trans.doTransaction();
    trans.commit(); 
}
如果没有时间表,代码可以正常工作。不幸的是,我需要每天运行一次检查,并可能将信息插入MySQL数据库,甚至可能一天两次。我收到一个错误,声明如下:

 SEVERE: Transaction commit error
 java.lang.IllegalStateException: Operation not allowed.    
 at com.sun.enterprise.transaction.UserTransactionImpl.checkUserTransactionMethodAccess(UserTransactionImpl.java:146)

我做了一些研究,发现你不能在计时器或计划事件中运行UserTransactions,但我需要某种方式按照计划执行事务,我不知道如何继续执行。

对不起,这个愚蠢的问题解决了。因为事务是在调度程序中启动的,所以我根本不需要将usertransaction也放在调度程序中。因此,只要调用EntityManager.merge,所有事务管理都将由调度程序处理,这项工作就完成了。

您的ejb是否用@TransactionManagementType.BEAN注释?如果设置为使用CMT,则不允许使用这些传输标定方法。请看本页的最后一页-。不,我现在没有任何transactionmanagement注释。