[英]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.