2010-03-01 72 views
28

我想設置默認數據庫模式Oracle Connection URL默認架構

jdbc:oracle:thin:@<server>:<port1521>:<sid> 

我的樣本SQL語句:

select monkey_name from animals.monkey 

我需要查詢數據庫,而不架構前綴animals.即當我運行這個聲明

select monkey_name from monkey 

它會用animals架構默認。

我需要在連接URL中指定什麼才能獲得這樣的效果?

謝謝。

回答

29

您不能在連接URL中放入任何東西。

在Oracle中,每個用戶都有自己的模式(即使不包含任何對象),並且這是他們的默認模式。一旦登錄/連接,他們可以更改他們的默認架構

ALTER SESSION SET CURRENT_SCHEMA=animals 

因此,你需要做連接後的額外語句。 可能在用戶和/或數據庫上有一個登錄觸發器,它們將在登錄時運行此操作。我個人更喜歡在應用程序連接時顯式聲明。

+0

這看起來像什麼事情我可以解決它。用這個語句創建登錄觸發器可能是我可能的解決方案。 謝謝。 – netic 2010-03-01 21:43:34

+0

我現在可以看到,這應該是一個解決方案。通過使用此登錄觸發器,我不必修改我的SQL。所以所有通用語句都是可移植的。 – netic 2010-03-02 05:18:45

9

同義詞的使用情況如何?

create synonym monkey for animals.monkey; 

select monkey_name from monkey 
+0

這是個好主意。但是我發現它並不確定,我不確定是否有任何副作用可能會破壞一路上的事情。 – netic 2010-03-01 21:41:57

+4

+該解決方案相當常用,效果良好。 – 2010-03-02 06:03:18

+2

這通常是改變會話的更好選擇,因爲它將問題從行爲方面轉移到結構性問題,這更加穩健。 – mwhs 2014-02-06 16:54:31

9

如果您使用C3PO,您可以在檢查連接時進行此操作。

由於性質:

c3p0.preferredTestQuery=alter session set current_schema=animals 
c3p0.testConnectionOnCheckout=true 

由於Java代碼:

ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
dataSource.setPreferredTestQuery("alter session set current_schema=animals"); 
dataSource.setTestConnectionOnCheckout(true); 

壞處就是會發生這種情況在每次連接時取出池的時間。

如果您正在使用自己的JDBC連接你可能只是這樣做:

Class.forName("oracle.jdbc.driver.OracleDriver"); 
Connection connection = getConnection("jdbc:oracle:thin:@//server:1521/instance", "username", "password"); 
connection.createStatement().execute("alter session set current_schema=animals"));