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

Posted

技术标签:

【中文标题】以编程方式将数据源添加到嵌入式 tomcat 7 中的 JNDI 上下文【英文标题】:Adding datasource programmatically to JNDI context in embedded tomcat 7 【发布时间】:2014-01-18 13:30:51 【问题描述】:

我试图在服务器启动之前注册一个新的数据源,但在执行查找时我得到了

javax.naming.NameNotFoundException:名称 [jdbc/db] 未绑定在此上下文中。找不到 [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();
    

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

哦,好吧,我想通了!而不是将其添加到 GlobalNamingResources

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

我在 NamingResources 中添加了它

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

它有效!

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

【讨论】:

【参考方案2】:

您没有向我们展示您是如何查找 JNDI 资源的。但是,无论如何,您的资源的完整 JNDI 名称是 java:comp/env/jdbc/db 即您需要查找的名称。

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

【讨论】:

以上是关于以编程方式将数据源添加到嵌入式 tomcat 7 中的 JNDI 上下文的主要内容,如果未能解决你的问题,请参考以下文章

markdown Drupal 7 - 以编程方式将视图模式添加到实体

以编程方式加载嵌入式资源文件

Drupal 7:以编程方式将过滤器添加到视图中

iOS:如何以编程方式将视图添加到情节提要视图

以编程方式停止 H2 数据库

如何使用TdxRichEditControl以编程方式添加和获取富文本?