以编程方式将数据源添加到嵌入式tomcat 7中的JNDI上下文

我正在尝试在服务器启动之前注册一个新的数据源,但是我正在查找执行的查找

javax.naming.NameNotFoundException:名称[jdbc / db]未绑定在此Context中。 无法找到[jdbc]。

这是我启动tomcat的方式:

Tomcat tomcat = new Tomcat(); //... ContextResource resource = new ContextResource(); resource.setName("jdbc/db"); resource.setAuth("Container"); resource.setType("javax.sql.DataSource"); resource.setScope("Sharable"); resource.setProperty("driverClassName", "org.hsqldb.jdbc.JDBCDriver"); resource.setProperty("url", "jdbc:hsqldb:hsql://localhost:1234/mydb1"); tomcat.getServer().getGlobalNamingResources().addResource(resource); tomcat.start(); tomcat.getServer().await(); 

查找:

  Connection conn = null; try { Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/db"); conn = ds.getConnection(); conn.createStatement().... } catch (Exception e) { e.printStackTrace(); } 

我在这里想念的是什么?

哦,我想通了! 而不是在GlobalNamingResources中添加它

 tomcat.getServer().getGlobalNamingResources().addResource(resource); 

我在NamingResources中添加了它

 Context rootCtx = tomcat.addContext("", base.getAbsolutePath()); //... rootCtx.getNamingResources().addResource(resource); 

它的工作原理!

如果有人能告诉我globalNamingResources和(本地)NamingResources之间的区别以及如何查找globalNamingResource,那么请给我留言!

您没有向我们展示您如何查找JNDI资源。 但是,在任何情况下,资源的完整JNDI名称都是java:comp/env/jdbc/db即这就是查​​找所需的内容。

这里还有进一步阅读: https : //stackoverflow.com/a/4099163/131929