停止Java时不执行存储过程

问题描述 投票:1回答:1

我在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
    }
java mysql jpa stored-procedures eclipselink
1个回答
0
投票

我想,当您关闭与数据库的连接时,与该数据库有关的所有进程都被取消,包括正在运行的该存储过程的调用。我认为您无法避免。

您试图实现的是一种预定的工作。我建议改用cron。对于该过程,您显示了一个简单的SQL而不是存储过程就足够了。与延迟和执行时间有关的逻辑可以放置在Shell脚本和中。

© www.soinside.com 2019 - 2024. All rights reserved.