存储过程不';停止Java时无法执行
我在MySQL中创建了一个存储过程,并使用JPA EclipseLink从Java应用程序调用它。一旦调用了这个过程,它里面就有一个“sleep(sec)”方法,然后它会成功地执行一些操作,除非关闭应用程序,看起来这个过程也被取消了,这不是我想要的。与我尝试使用JDBC PreparedStatements的方法相同,结果相同。即使应用程序在过程调用后关闭,是否有任何解决方法可以使存储过程正常工作 存储过程存储过程不';停止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
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进程在过程成功执行之前终止,则必须回滚事务以保证原子性。但是,我不确定是否有可能影响/配置此行为。找到了解决方法。用事件替换存储过程,并在事务中触发它。