Tomcat:如何以编程方式在GlobalNamingResources中定义数据源资源并将其链接到应用程序

Tomcat:如何以编程方式在GlobalNamingResources中定义数据源资源并将其链接到应用程序,tomcat,datasource,tomcat9,Tomcat,Datasource,Tomcat9,我使用Tomcat9部署共享同一数据源连接池的多个应用程序。我通过以下方式达到了目的: 将数据源作为资源元素添加到conf/server.xml中的GlobalNamingResources下 使用conf/context.xml中的ResourceLink元素链接全局JNDI资源,使其可供所有web应用程序使用,以及 从web应用程序使用JNDI访问数据源 它正在按预期工作 但是,我需要避免编辑任何xml(server.xml或conf/context.xml或app-specific-con

我使用Tomcat9部署共享同一数据源连接池的多个应用程序。我通过以下方式达到了目的:

  • 将数据源作为资源元素添加到conf/server.xml中的GlobalNamingResources下
  • 使用conf/context.xml中的ResourceLink元素链接全局JNDI资源,使其可供所有web应用程序使用,以及
  • 从web应用程序使用JNDI访问数据源
  • 它正在按预期工作

    但是,我需要避免编辑任何xml(server.xml或conf/context.xml或app-specific-context.xml),并尝试以编程方式实现步骤1和步骤2。如果是这样,那么优点是,只需要修改需要添加到/lib中的jar,以支持新的数据源,而不需要对任何xml进行任何修改(或者可以在server.xml中进行最低配置)


    有没有办法实现将资源定义为GlobalNamingResources并通过ResourceLink(全部通过Java)将其链接到web应用程序的要求

    通过tomcat javadocs,我已经达到了我的要求。详情如下:

    1。将数据源添加为GlobalNamingSource

    为此,创建服务器生命周期侦听器,创建数据源并将其添加到JNDI GlobalNamingContext

    公共类GlobalDatasourceCreator实现LifecycleListener{
    @凌驾
    公共无效生命周期事件(生命周期事件){
    if(服务器的event.getSource()实例){
    Context namingContext=((服务器)事件.getSource()).getGlobalNamingContext();
    if(Lifecycle.START\u EVENT.equals(EVENT.getType())){
    bindDatasources(namingContext);
    }else if(Lifecycle.STOP_EVENT.equals(EVENT.getType())){
    取消绑定数据源(namingContext);
    }
    }
    } 
    私有void bindDatasources(上下文namingContext){
    if(createSubContext(namingContext)){
    试一试{
    DataSource ds=getDatasource();//TODO:实现它
    namingContext.rebind(“jdbc/myds_global”,ds);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    }
    私有布尔createSubContext(上下文namingContext){
    试一试{
    namingContext.createSubcontext(“jdbc”);
    }catch(namealReadyBounde异常){
    }捕获(NamingE例外){
    返回false;
    }
    返回true;
    }
    私有void解除绑定数据源(上下文namingContext){
    试一试{
    unbind(“jdbc/myds_global”);
    }捕获(NamingE例外){
    e、 printStackTrace();
    }
    }
    
    然后将此类作为侦听器添加到conf/server.xml

    <Listener className="com.test.GlobalDatasourceCreator" />
    
    然后将该类作为侦听器添加到conf/context.xml

    <Listener className="com.test.GlobalDatasourceCreator" />
    
    
    
    创建一个包含这两个类的jar,并将其放在/lib文件夹中


    优点:添加任意数量的数据源不需要进一步修改xml。只需修改java代码以添加新的数据源,更新库中的jar文件夹并重新启动服务器,这完全符合我的项目要求。这也解决了在x中以纯文本形式公开数据源凭据的问题ml(虽然不是100%的风险防范)。

    当然,你可以这样做。但它需要你构建一个“嵌入式”应用程序,在其中编写Tomcat的启动脚本,配置通常在
    conf/server.xml
    中配置的所有内容。在我看来,这并不值得。这是一个非常奇怪的要求:“避免编辑任何xml”。您可以将它(
    conf/server.xml
    )放入修订控制中,而不必维护自己的代码来配置数据源。为什么要让事情变得更难呢?