2017-04-07 109 views
1
與JdbcTemplate的選擇,或插入操作

我已經有了一些基本的情況下,我會很感激一些建議,如何處理與...如何處理共享DB

另外還有一個與現有數據庫some_table兩列:

  • 自動遞增的關鍵
  • name描述該條

我有使用Spring 4應用來處理數據庫操作。

  1. 應用程序實例:
    • 搜索與給定的名稱SELECT * FROM some_table WHERE name='name1'
      • 條目;如果找到一個它得到其主要
      • 如果不是,它會創建新條目INSERT INTO some_table (name) VALUES ('name1')
        • 然後它得到它的密鑰
    • 使用檢索到的密鑰以用於進一步處理...
  2. 實例B可以做同樣的在同一時間。

因此,它可能會發生這兩個應用程序在同一時間對不目前存在同名做SELECT然後這些都將有相同的名字和不同的密鑰INSERT新的條目。

如何同步它們 - 這裏的最佳實踐是什麼?應用程序可以鎖定some_table,直到它創建新條目或決定它不是必需的,然後釋放鎖定?是否可以使用Spring jdbcTemplate來做到這一點?怎麼樣?

對我來說,這似乎是一些基本情況,可能有一些模式,我不想重新發明輪子......任何提示?

或者,也許直接由2個應用程序使用一個數據庫實例的整個想法是一個總體設計缺陷?

+0

好吧,如果你可以分享你的代碼,這將有所幫助。你嘗試過'synchronized'塊嗎?如果沒有,你可以添加到您的方法發射sql查詢數據庫? – harshavmb

+0

http://tutorials.jenkov.com/java-concurrency/synchronized.html可能會給你一些'synchronized'塊的概述。 – harshavmb

+0

請記住,這個問題不是關於在一個應用程序中同步代碼/操作塊。有2個應用程序實例使用單個數據庫實例 - 同步必須發生在DB/SQL級別上。我可以引入另一個應用程序,它將作爲DB的接口/代理(它將同步請求),但也許有另一種/更簡單的方法... – alwi

回答

0

插件如果不存在與互斥表做似乎這樣的伎倆在這種情況下,(發現here):

INSERT INTO some_table(name) SELECT (?) FROM mutex LEFT OUTER JOIN some_table ON some_table.name = ? WHERE mutex.i = 1 AND some_table.name is null 

在其中創建mutex如下:現在

create table mutex(
    i int not null primary key 
); 
insert into mutex(i) values (0), (1); 

每個應用程序可以執行:

  • 插入如果不存在whit name ='name1'
  • SELECT where name ='name1',獲取其密鑰並將其用於進一步處理...

只有其中一個會創建新條目,所以不會出現重複。

現在我需要爲其中名稱應爲一個唯一的標識符來產生的情況下,一些解決方案,因此檢索相同的密鑰不應由2應用程序實例中使用...