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