Java 使用JNDI连接到数据库,但不使用任何属性文件

Java 使用JNDI连接到数据库,但不使用任何属性文件,java,jndi,Java,Jndi,我正在尝试使用JNDI apporach连接到数据库服务器。但是我不想使用任何jndi.properties文件或web.xml文件中的任何更改作为参数 我有一个属性的hashMap来连接到数据库服务器,我想这样做 HashMap map = new HashMap(); Hashtable<String, String> authEnv = new Hashtable<String, String>(); authEnv.put(Context.INITIAL_CONT

我正在尝试使用JNDI apporach连接到数据库服务器。但是我不想使用任何jndi.properties文件或web.xml文件中的任何更改作为参数

我有一个属性的hashMap来连接到数据库服务器,我想这样做

HashMap map = new HashMap();
Hashtable<String, String> authEnv = new Hashtable<String, String>();
authEnv.put(Context.INITIAL_CONTEXT_FACTORY, "javax.sql.DataSource");
authEnv.put(Context.PROVIDER_URL, "jdbc:oracle:thin:@xyz.corporate.test.com:9822:mydb");
authEnv.put(Context.SECURITY_PRINCIPAL, "testuser");
authEnv.put(Context.SECURITY_CREDENTIALS, "testpass");
ctx = new InitialContext(authEnv);
ctx.bind("myjndi", "jdbc:oracle:thin:@xyz.corporate.test.com:9822:mydb");
System.out.println("Context is " + ctx);
ds = (DataSource) ctx.lookup("myjndi");
HashMap map=newhashmap();
Hashtable authEnv=新的Hashtable();
authEnv.put(Context.INITIAL_Context_工厂,“javax.sql.DataSource”);
authEnv.put(Context.PROVIDER_URL,“jdbc:oracle:thin:@xyz.corporate.test.com:9822:mydb”);
authEnv.put(Context.SECURITY_主体,“testuser”);
authEnv.put(Context.SECURITY_凭证,“testpass”);
ctx=新的初始上下文(authEnv);
bind(“myjndi”,“jdbc:oracle:thin:@xyz.corporate.test.com:9822:mydb”);
System.out.println(“上下文为”+ctx);
ds=(数据源)ctx.lookup(“myjndi”);
但是我的上下文没有初始化。这就是为什么我没有得到任何数据源对象。 我已经创建了一个对象“myjndi”,并试图用它绑定我的上下文。但它不起作用。
请帮我弄清楚我该如何连接到数据库。

这自始至终都是完全错误的

  • javax.sql.DataSource
    不能用作JNDI初始上下文工厂
  • “jdbc:oracle:thin:@xyz.corporate.test.com:9822:mydb”不是JNDI提供程序URL
  • 将数据库URL放入JNDI也很奇怪

你不能一边走一边弥补。您应该以正常方式使用JDBCAPI或容器的
java:
名称空间。

“未初始化”不是问题描述。您反对像其他人一样将内容放入属性文件或web.xml的具体原因是什么?谢谢您的回复。这意味着在这种情况下,我们应该只使用JDBCAPI,而JNDI连接将无法工作。JNDI是否总是需要属性文件?如果是这样的话,我们就不能通过提供属性的HashMap并将JNDI名称绑定到上下文来使用jndiapi连接到数据库。JNDI名称也将以编程方式创建。如果您发现任何不使用任何外部属性文件而连接到数据库的代码片段,请将其提供给我。JNDI不需要属性文件,但将主机名和密码之类的内容硬编码到外部配置文件中是一种糟糕的做法。我不知道你到底想在这里完成什么,或者为什么。好的,我会告诉你,我已经部署了一个war文件,可以访问URL。现在,这个web产品已经具备了在其中存储一些xml格式的自定义对象的功能。我们可以使用该web产品的JAR的API访问这些对象。我想将我的JNDI属性存储在那个自定义对象中,并想从那个里读取这些属性,然后尝试使用JNDI连接到数据库。您能告诉我如何做到这一点吗?通常,当我们使用JNDI方法进行连接时,我们有类似于ds=(数据源)ctx.lookup(“jdbc/lighthouseCDI”);还是没有意义。您的web产品具有将“某些自定义对象”存储在什么位置的功能?你坚持使用这个自定义对象加上JNDI,为什么?通常的方法是定义一个资源,直接通过java:comp/env在容器的JNDI中查找该资源,从而生成一个数据源。不需要“自定义对象”。你不能仅仅编造任意代码并期望它工作,或者期望其他人为你修复它。