2010-09-03 73 views
1

我面临的特殊要求如下:
网络密集型操作是由多个客户端通过网络接口触发到服务器。但是,每次只允许执行一个操作,因此在SQL表中创建一个条目(元组)以指示操作正在进行中。一旦操作完成(无论成功或失败),相应的结果将显示回客户端,并从SQL表中删除相应的元组。
由于该操作是网络密集型的,因此必须引入在某些超时(10分钟)后需要“取消”操作以取消操作的情况。
是否有任何方式在SQL中的行的生命周期与超时值关联,以便在一定的时间后被删除?我的应用程序主要用Java 1.5和EJB 3.0编写,使用JPA/Hibernate访问Oracle 10g数据库引擎。如何在超时后从SQL表中删除元组?

在此先感谢。

问候,
Nagendra U m的

+0

你有没有考虑过使用DBMS_LOCK来获取一个命名锁而不是数据库表? – 2010-09-03 19:28:45

回答

0

我不知道甲骨文有这种设施,但我认为没有数据库引擎有这个。

如果你想在数据库级别做,

  1. 你必须有一个datetime列,例如; 'CreatedDate' in 表。当创建记录时,该列将具有 日期时间。

  2. 编写一个程序并将其放入 计划作业中。该作业将在每10分钟后运行并删除10分钟的旧记录。查询将如此 。

T-SQL:请根据您的数据库引擎进行转换。

DELETE FROM yourtable WHERE CreatedDate < DATEADD(mi, -10, GETDATE()) 

这将从表格中删除超过10分钟的所有记录。

这只是给你一个计划工作的想法。它在SQL Server中。我不知道甲骨文

step_by_step_guide_to_add_a_sql_job_in_sql_server_2005

0

这听起来像你正在使用的数据库中实现互斥,看看this question,看看是否有帮助?听起来像交易访问一个国旗表将为您解决这个问题,只要您在服务器代码中同时获得成功&失败状态。

+0

确切!我的SQL表的目的是确保一次只有一个操作正在进行。但是,如果服务器没有响应,即使很长时间后,我也需要一种方法来处理超时,以便我可以释放要由其他客户端完成的操作。即在10分钟后从桌子上移除入口。如何才能做到这一点?通过本机SQL语句甚至JPA的任何方式?并且,感谢您的快速响应。 :-) – 2010-09-03 16:50:09

+0

你的交易可能是这样读的:'begin tran;如果不存在(从表中选择1开始> = dateadd(mi,-10,getdate()))begin;插入表...,getdate();结束;提交“ - 无论是否或者任何进程决定停止运行网络激烈操作,还会更新表格 – 2010-09-03 17:05:37

1

我建议您尝试使用含有任务的开始时间的时间戳列。

A before如果任务超时,可以触发删除旧列,然后插入新列。

如果您想要拥有不同超时的多个任务,您甚至可以添加一个超时时间为几秒的列。相应地编写你的触发器。