Tomcat:如何以编程方式在GlobalNamingResources中定义数据源资源并将其链接到应用程序
我使用Tomcat9部署共享同一数据源连接池的多个应用程序。我通过以下方式达到了目的: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
有没有办法实现将资源定义为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
)放入修订控制中,而不必维护自己的代码来配置数据源。为什么要让事情变得更难呢?