如何通过JDBC访问表时检查表的锁定状态

时间:2014-02-03 09:54:02

标签: java jdbc

我使用JDBC连接到Oracle表。(表1) 仅执行插入操作,限制为:仅使用“语句”

java代码有一个侦听器,用于侦听数据源。该数据被上传到表1,并且在转换之后表2中读取表1中的数据。 要求是使这个过程接近实时。

我的问题:有没有办法找出表2中表1被访问(锁定)的时间,以便我可以用java代码保存数据。

1 个答案:

答案 0 :(得分:2)

首先,表不读取数据,某些“东西”必须读取表1中的数据并将其插入表2中。 此外,从表1中读取的任何内容可能都没有锁定表1中的所有内容,它可能会锁定一些记录,但不会锁定整个表。 查看herehere以获取有关如何在Oracle中查找锁的信息。 但是:

更好的选择是在更高级别进行同步;在你的java代码和更新表2之间 这可以使用适当的同步机制(信号量,互斥量,java锁等)基于更新表2的“事物”以及正在使用的平台来完成。如果无法进行专门的同步,则可以在数据库本身中实现锁定。

(非常)简单的此类实现使用包含lockowner列的表lockID。然后为每个参与者提供唯一标识符,并使用以下SQL语句来声明锁定:

    update lock set owner = <my unique identifier> where owner is null and lockID = <lock id>

    select owner from lock where lockID = <lock id>

owner对应于成功声明锁定的参与者的唯一标识符。 要取消锁定,只需将其设置为null

虽然很简单,但这种方法仍然会让你解决锁何时变得空闲的问题,如果没有按时释放(或触摸)锁定陈旧,如果锁具有高度争议,则可能导致饥饿。

如果您真的想要实现接近实时的性能,那么更好的选择是消除数据库。任何数据库都有太多变量(缓存,维护后台线程,本地优化等)以实现一致的性能。一个旨在接近实时性能的系统必须使用针对特定平台定制的异步文件IO,并且可能需要使用非垃圾收集语言,以便可以控制内存分配和释放。

相关问题