存储过程不';停止Java时无法执行

存储过程不';停止Java时无法执行,java,mysql,jpa,stored-procedures,eclipselink,Java,Mysql,Jpa,Stored Procedures,Eclipselink,我在MySQL中创建了一个存储过程,并使用JPA EclipseLink从Java应用程序调用它。一旦调用了这个过程,它里面就有一个“sleep(sec)”方法,然后它会成功地执行一些操作,除非关闭应用程序,看起来这个过程也被取消了,这不是我想要的。与我尝试使用JDBC PreparedStatements的方法相同,结果相同。即使应用程序在过程调用后关闭,是否有任何解决方法可以使存储过程正常工作 存储过程 DELIMITER // DROP PROCEDURE IF EXISTS sessio

我在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脚本和cron上。

取消是什么意思?需要更多的信息,注意:我有相当多的猜测。如果没有进一步的信息,我会怀疑存储过程将在JPA打开的事务中执行。因此,如果Java进程在过程成功执行之前终止,则必须回滚事务以保证原子性。但是,我不确定是否有可能影响/配置此行为。找到了解决方法。用事件替换存储过程,并在事务中触发它。