如何指定jdbc / DataSource?

时间:2012-01-12 20:07:14

标签: java oracle ldap websphere

我正在尝试使用如下示例代码建立与oracle数据库的连接:

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?

我很困惑,因为我使用类似上面的代码给了一个工作项目,但无处可告诉DataSource是什么。 我想知道jdbc / DataSource是否应该是LDAP中的DN,但我发现在我给定的ldap数据中似乎没有任何相关性。对不起,如果这个问题很愚蠢或者没有意义,那我就是新手了。

谢谢!

3 个答案:

答案 0 :(得分: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设置取决于属性文件,

谢谢奥拉夫的大力帮助!

答案 1 :(得分:0)

来自http://kb2.adobe.com/cps/195/tn_19576.html

  

错误:来自LDAP源的绑定出错:[LDAP:错误代码34 - 无效   DN] javax.naming.InvalidNameException

     

原因:这是由“设置”标签中指定的错误前缀引起的,   在大多数LDAP / AD系统上。这可能意味着您没有指定前缀   完全,这意味着LDAP / AD服务器没有收到完整的DN   CPS或您没有指定正确的前缀,例如CN   UID,导致LDAP / AD服务器无法接收正确的DN   来自CPS。也可能是由于开头缺少逗号造成的   后缀末尾的后缀或额外的逗号。这个错误   也可能意味着身份验证类型不正确。

答案 2 :(得分:0)

如果您的代码曾经在WebSphere中工作,我猜测jdbc上下文可能位于jee:jndi-lookup上下文中。你能尝试查找“jee:jndi-lookup / jdbc / DataSource”或“java:comp / env / jdbc / DataSource”吗?

您应该尝试使用GUI目录浏览器浏览OpenLDAP目录,以找出您的DataSource定义的上下文。