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

时间:2013-12-31 16:27:01

标签: java tomcat jdbc datasource 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();
    }

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

哦,我明白了!而不是在GlobalNamingResources中添加它

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

我在NamingResources

中添加了它
Context rootCtx = tomcat.addContext("", base.getAbsolutePath());
//...
rootCtx.getNamingResources().addResource(resource);

它有效!

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

答案 1 :(得分:0)

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

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