我正在使用MySQL数据库在Glassfish服务器上开发JSF程序。我目前有一个Singleton 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,但我需要某种方式按计划执行交易,我不知道如何继续用它。
答案 0 :(得分:0)
对不起,愚蠢的问题并弄清楚了。由于事务是在调度程序中启动的,所以我根本不需要在那里使用usertransaction。因此,只需调用EntityManager.merge()即可完成工作,所有事务管理都由调度程序处理。