繁体   English   中英

如何指定jdbc / DataSource?

[英]How to specify jdbc/DataSource?

我正在尝试使用如下示例代码建立与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数据中似乎没有任何相关性。 对不起,如果这个问题很愚蠢或者没有意义,那我就是新手了。

谢谢!

经过几周的研究,最终解决了以下问题。 希望这可以帮助其他人,以防他们面临同样的问题。

我是将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设置取决于属性文件,

谢谢奥拉夫的大力帮助!

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

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

原因:这是由大多数LDAP / AD系统上“设置”选项卡中指定的错误前缀引起的。 这可能意味着您根本没有指定前缀,这意味着LDAP / AD服务器没有从CPS接收完整的DN,或者您没有指定正确的前缀,例如CN而不是UID,从而导致LDAP / AD服务器未从CPS接收正确的DN。 也可能是由于后缀开头缺少逗号或后缀末尾有一个额外的逗号。 此错误还可能意味着身份验证类型不正确。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM