Java RDBMS中的并发选择和记录创建

Java RDBMS中的并发选择和记录创建,java,mysql,concurrency,rdbms,Java,Mysql,Concurrency,Rdbms,在创建url shortner时,我有两个不同的客户端实例来查询一个微小的url,如果找不到,则在rdbms中创建一个记录,并将其分配给客户端发送的url。我使用弹性搜索来查询微小的url。我的问题是跨两个不同实例的并发管理,当两个实例同时查询相同的tiny url时,由于找不到它,它将创建一个记录,将相同的tiny url分配给两个不同的url,这是错误的。如何避免这种情况 关于,你应该考虑代码中的一个排他性锁,在其中检查微小URL的存在。例如: private final static Ob

在创建url shortner时,我有两个不同的客户端实例来查询一个微小的url,如果找不到,则在rdbms中创建一个记录,并将其分配给客户端发送的url。我使用弹性搜索来查询微小的url。我的问题是跨两个不同实例的并发管理,当两个实例同时查询相同的tiny url时,由于找不到它,它将创建一个记录,将相同的tiny url分配给两个不同的url,这是错误的。如何避免这种情况


关于

,你应该考虑代码中的一个排他性锁,在其中检查微小URL的存在。例如:

private final static Object LOCK = new Object();//it should be defined as a shared variable between threads. 
synchronize(LOCK) {
    //check if tiny url exists or not. 
}

或者,您可以使用内存中的数据库(如Redis)而不是Elasticsearch来检查微小URL的存在

第一件事是在数据库中添加一个约束来防止这个问题。至少,这将为第二次插入生成一个异常。请注意,这可能会花费大量时间。特别是如果问题不经常出现,您可能会使用单线程来解决1/1.000.000请求。这取决于您将在代码的同步块中执行的操作。在所描述的问题中,检查url的存在不会花费那么多。此外,这取决于您如何设计您的体系结构,通过该体系结构,您将以更低的成本完成这样的操作。但一般来说,在正常情况下,这种操作的成本不会对性能造成任何严重问题。那么,“原子操作”需要是一个
SELECT
和可选的
INSERT
。两个I/O操作,根据服务器、索引数量等,这很容易需要100毫秒,。。。将URL管理量减少到每秒10个。这就是为什么我提出了另一种使用异常的方法。但基于使用情况,这可能会起作用,因为我自己不会执行这样的实现,将所有这样的IO放在我的同步块中。一种可能的优化实现:在块中设置一个布尔变量,然后根据该变量在块外执行适当的操作。