我在MySQL中创建了一个存储过程,并使用JPA EclipseLink从Java应用程序中对其进行了调用。一旦调用了该过程,它内部就有一个“ sleep(sec)”方法,然后它成功执行了一些操作,除非关闭了应用程序,这似乎也取消了该过程,这不是我想要的。我尝试使用JDBC PreparedStatements进行的操作相同,结果相同。即使在过程调用后关闭了应用程序,是否有任何变通办法可以使存储过程正常工作。
存储过程
DELIMITER //
DROP PROCEDURE IF EXISTS session_procedure//
CREATE PROCEDURE session_procedure
(
IN userID INT
)
BEGIN
SELECT SLEEP(30);
UPDATE users
SET users.Active = 0
WHERE users.Id = userID;
END//
DELIMITER ;
Java中的过程调用
public static void destroySessionCountdown(EntityManager entityManager, Account akk){
int accountId = akk.getId();
StoredProcedureQuery storedProcedure = entityManager.createStoredProcedureQuery("session_procedure");
storedProcedure.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);
storedProcedure.setParameter(1, accountId);
try {
storedProcedure.execute();
}catch(Exception e){
e.printStackTrace();
}
// force logout
}
我想,当您关闭与数据库的连接时,与该数据库有关的所有进程都被取消,包括正在运行的该存储过程的调用。我认为您无法避免。
您试图实现的是一种预定的工作。我建议改用cron。对于该过程,您显示了一个简单的SQL而不是存储过程就足够了。与延迟和执行时间有关的逻辑可以放置在Shell脚本和