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

Java 如何在通过JDBC访问表时检查表的锁定状态,java,jdbc,Java,Jdbc,Iam使用JDBC连接到Oracle表。(表1) 仅执行插入操作,限制为:仅使用“语句” java代码具有侦听数据源的侦听器。该数据上传到表1,转换后,表2读取表1中的数据。 要求是使该过程接近实时 我的问题是:是否有一种方法可以确定表1何时被表2访问(锁定),这样我就可以用java代码保存数据。首先,表不读取数据,一些“东西”必须从表1读取数据并将其插入表2中。 此外,从表1读取的内容可能不会锁定表1的所有内容,它可能会锁定一些记录,但不会锁定整个表。 有关如何在Oracle中查找锁的信息,请

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

java代码具有侦听数据源的侦听器。该数据上传到表1,转换后,表2读取表1中的数据。 要求是使该过程接近实时


我的问题是:是否有一种方法可以确定表1何时被表2访问(锁定),这样我就可以用java代码保存数据。

首先,表不读取数据,一些“东西”必须从表1读取数据并将其插入表2中。 此外,从表1读取的内容可能不会锁定表1的所有内容,它可能会锁定一些记录,但不会锁定整个表。 有关如何在Oracle中查找锁的信息,请参阅和。 然而:

更好的选择是在更高级别上同步;在您的java代码和正在更新表2的内容之间。
这可以通过使用适当的同步机制(信号量、互斥量、java锁等)来完成,这取决于更新表2的“东西”是什么以及使用的是什么平台。如果无法进行专门的同步,则可以在数据库本身中实现锁

一个(非常)简单的此类实现使用一个表
lock
,其中包含列
owner
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> 更新锁集所有者=其中所有者为null且锁ID= 从lock中选择所有者,其中lockID=
所有者
对应于成功申请锁的参与者的唯一标识符。 要解除锁定,只需将其设置为
null

虽然这种方法很简单,但仍然会给您带来一个问题,即确定锁何时变为空闲状态,如果没有及时释放(或触摸)锁,则会使锁过期,如果锁受到高度竞争,则可能会导致饥饿


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

谢谢@Eli Algranti!你的回答简化了我的方法。如果我回答了你的问题,你可以考虑点击答案旁边的“V”来标记它;