2013-07-31 62 views
0

我是Groovy的新手,我有一個簡單的類「public static void main」,它通過sql.execute和sql.call語句使用groovy.sql.sql執行SQL,如下所示:進口。我還導入了一個服務,用於檢查Oracle數據庫中現有應用程序中的安全設置。它也執行SQL語句。我的問題是,人們通常如何完成SQL連接?你是否打開每個類的連接,即每個類中的單獨的SQL連接?或者你可以將你的SQL連接信息傳遞給那個類並以某種方式使用相同的連接?現在我有兩個單獨的連接工作,但我不確定這是否是一個很好的方法來完成這一點。Groovy及其類中的Oracle SQL連接

如果上述內容沒有完整意義(因爲我是新手),下面是我的代碼示例。在我的主類我打開並調用SQL這樣的:

//DB connection 
def conn = new DbConnectService()   
def sql = Sql.newInstance(conn.url, conn.username, conn.password, conn.driver) 

然後我想,像這樣的安全檢查類的調用來檢查安全設置:

// Security check 
def sec = new CheckSecurityService() 
sec.SecurityCheck(ProgramName) 

安全檢查後,打開完全相同的數據庫連接如上,做了一些SQL調用是這樣的:

try 
{ 
     sql.call '{call G$_SECURITY.G$_VERIFY_PASSWORD1_PRD(?, ?, ?, ?)}', [$p_object, p_version, sql.VARCHAR, Sql.VARCHAR], { p_pass, p_rol -> 
      p_password = p_pass 
      p_role = p_rol 
     } 

然後如果成功我回到我的主類,做更多的SQL語句,如:

sql.execute("insert into test (key1, text) values (${foo}, ${text1})") 

有關人們通常如何做到這一點的任何信息,謝謝!

+0

沒人?似乎這應該比我做的更容易,但經過多次搜索後我找不到答案。 – tnichol

回答

0

正如你所說,你在main線程中做了所有的事情,我認爲它是一個單線程應用程序。那麼重用連接應該沒關係。理想情況下,在多線程應用程序中,您應該使用DataSource和底層連接池,而不是直接在您的代碼中打開和關閉Connection。

在這裏,您可能會傳遞相同的Sql對象或Connection到您的安全檢查器類,而不實際創建兩個連接。而且,即使你創建兩個連接,這不是一個大問題(除非你正在做的一些循環,或面臨一些性能問題)

一個建議:對於插入準備使用的語法,而不是串插聲明

sql.execute("insert into test (key1, text) values (${foo}, ${text1})")

sql.execute("insert into test (key1, text) values (?, ?)", [foo, text1])

+0

對,絕對是單線程的。我擔心回滾,以及出現錯誤時。我研究了事務參數,這是否也適用於連接池,因此我不必擔心它?根據你的建議使用預先準備好的陳述,是否有你提出這個建議的理由?謝謝! – tnichol

+0

對於單線程應用程序(除非很長的運行過程),我沒有看到需要連接池。事務在連接級別工作,並且Pool僅從一堆池連接返回連接,而不是每次都創建新連接,並且不影響事務。 $ {var}會使查詢容易受到sql注入和其他語法問題的困擾,準備好的語句可以幫助您避免麻煩。 – kunal

+0

有道理,謝謝你的信息。有沒有辦法重用連接而不將sql連接信息傳遞給我從另一個服務調用的每個方法?似乎應該有更好的方法。 – tnichol