2012-01-12 39 views
3

我試圖使用示例代碼這樣的做出一個oracle數據庫的連接:如何指定jdbc/DataSource?

public static Connection getConnection() throws ClassNotFoundException { 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    Properties env = new Properties(); 
    //env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory"); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldap://192.168.1.1:389/o=myo,dc=mydc,dc=us"); 
    Connection connection = null; 

    try { 
     InitialContext context = new InitialContext(env); 
     DataSource dataSource = (DataSource) context.lookup("jdbc/DataSource"); 
     connection = dataSource.getConnection(); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return connection; 
} 

但它總是拋出異常這樣的:

javax.naming.InvalidNameException: jdbc: [LDAP: error code 34 - invalid DN]; remaining name 'jdbc/DataSource' 

在哪裏,我應該如何規定, JDBC /數據源?

我很困惑,因爲我得到了一個使用類似於上述代碼的工作項目,但沒有告訴DataSource是什麼。 我想知道如果jdbc/DataSource應該是LDAP中的DN,但我發現在我的給定ldap數據中沒有任何關係。對不起,如果這個問題是愚蠢的或沒有意義,我是新來的所有東西。

謝謝!

+0

你在運行的環境是什麼?它是一個獨立的控制檯應用程序嗎?一個Web應用程序?你在某個應用程序服務器上運行嗎? – Olaf 2012-01-12 20:41:40

+0

@Olaf,工作項目是在AIX中運行在websphere上的servlet。我使用OpenLDAP和Oracle在Windows中的控制檯應用程序中測試該代碼。目標是在Windows環境下在Websphere社區版中運行的Servlet中進行連接。 – John 2012-01-12 20:49:29

回答

2

研究了幾個星期,最後做出如下解決方案。希望這可以幫助他人,以防他們面臨同樣的問題。

我將Web應用程序從WebSphere切換到Tomcat,該應用程序從WebSphere中的目錄獲取連接。 Tomcat沒有那個目錄,但是它可以在server.xml/context.xml/web.xml中指定,但是我永遠無法使它工作!所以我的解決辦法是使用基於文件的目錄:

public static Connection getConnection() throws ClassNotFoundException { 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    Properties env = new Properties(); 

    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); 
    env.put(Context.PROVIDER_URL, "file:/C://JNDI"); 

    Connection connection = null; 

    try { 
     InitialContext context = new InitialContext(env); 
     DataSource dataSource = (DataSource) context.lookup("jdbc/DataSource"); 
     connection = dataSource.getConnection(); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return connection; 
} 

只是改變了兩個env.put線和正常工作。但有一些準備工作,以創建基於文件目錄,這裏是創建一個文件C程序:\ JNDI.binding

public static void main(String args[]) throws SQLException, NamingException { 

    Context ctx = null; 
    try { 
     Properties prop = new Properties(); 
     prop.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.fscontext.RefFSContextFactory"); 
     prop.setProperty(Context.PROVIDER_URL, "file:/C:/JNDI"); 
     ctx = new InitialContext(prop); 

     OracleDataSource ds = new OracleDataSource(); 
     ds.setDriverType("thin"); 
     ds.setServerName("123.123.123.123"); 
     ds.setPortNumber(1521); 
     ds.setDatabaseName("xe"); 
     ds.setUser("username"); 
     ds.setPassword("password"); 
     ctx.bind("jdbc/DataSource", ds); 

    } catch (NamingException ne) { 
     System.err.println(ne.getMessage()); 

     ne.printStackTrace(); 
    } 

} 

要使其工作在我的生產WebSphere和測試Tomcat,我只是用不同INITIAL_CONTEXT_FACTORY設置取決於屬性文件,

非常感謝Olaf的幫助!

0

得到這個從http://kb2.adobe.com/cps/195/tn_19576.html

Error: Error in bind from LDAP source: [LDAP: error code 34 - invalid DN] javax.naming.InvalidNameException

Cause: This is caused by a bad prefix specified in the Settings tab, on most LDAP/AD systems. This could mean you did not specify a prefix at all, which means the LDAP/AD server did not receive a full DN from CPS or that you did not specify a correct prefix, such as CN instead of UID, which results in the LDAP/AD server not receiving a correct DN from CPS. Can also be caused by a missing comma at the beginning of the suffix or an extra comma at the end of the suffix. This error could also mean the authentication type is incorrect.

+0

我在想在DN「jdbc/DataSource」的LADP中應該有一些「東西」,但是那個東西應該看起來像什麼? – John 2012-01-13 09:17:04

+0

你在OpenLDAP目錄中指定了哪個jdbc/DataSource資源? – Olaf 2012-01-13 18:16:50

+0

@Olaf,事實證明,信息是LDAP內部的websphere,但我想存儲在LDAP中,但我不知道如何... – John 2012-01-18 10:06:32

0

如果使用代碼在WebSphere工作,我猜的jdbc方面可能是JEE內:JNDI的查找範圍內。你可以嘗試查找「jee:jndi-lookup/jdbc/DataSource」或「java:comp/env/jdbc/DataSource」嗎?

您應該嘗試一個GUI目錄瀏覽器來瀏覽您的OpenLDAP目錄,以找出您的DataSource定義的上下文。

+0

我在您的問題中添加了一個WebSphere標記,以將其暴露給WebSphere專家。也許他們會知道WebSphere JNDI/LDAP集成。我更像是Tomcat的傢伙。 – Olaf 2012-01-14 17:27:46

+0

感謝您的幫助。我剛剛發現jdbc/DataSource被定義爲INSIDE websphere,它可以通過上下文「com.ibm.websphere.naming.WsnInitialContextFactory」進行訪問。我仍在測試如何將該jdbc/DataSource移動到LDAP,而不是使用特定於產品的東西。 – John 2012-01-18 10:02:18

+0

@John:如果您要從Web應用程序訪問您的JDBC源代碼,我相信更好的方法是依賴標準Web服務器配置JDBC源的方式。您應該將其定義爲Web應用程序上下文中的資源。如果你真的想真正用外部應用程序的同名方式來定義它,你確實可以將它存儲在LDAP中,並且只需將你的Web應用程序資源指向通過JNDI使用LDAP,但我相信你應該真的有很好的理由要做到這一點。 – Olaf 2012-01-18 16:42:05