首页 > 其他分享 >tomcat配置全局和私有JNDI数据源

tomcat配置全局和私有JNDI数据源

时间:2023-04-14 11:14:00浏览次数:53  
标签:xml web tomcat 数据源 JNDI context 标签

  本人CentOS上部署了tomcat,在配置JNDI数据源时,先后遇到了两种报错。

  第一种,Cannot create JDBC driver of class '' for connect URL 'null',这个根据我个人理解是没有获取到数据源的任何信息,只要根据配置的方式(全局或私有)检查一下配置文件即可;

  第二种,Cannot create PoolableConnectionFactory (IO Error: Got minus one from a read call),查下来说是Oracle连接数问题,简单粗暴的方式是根据配置的方式(全局或私有)检查一下配置文件中是否存在maxIdle和maxActive配置项,将其删除。

(1).全局

  目前找到的全局配置方法有两种。

  1)主修改tomcat根目录下的conf/context.xml文件

    在tomcat根目录下的conf/context.xml文件中<context>标签内添加如下内容:

<Resource name="[自定义数据源名称]"
          auth="Container"
          type="javax.sql.DataSource"
          username="[数据库用户名]"
          password="[数据库密码]"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          url="jdbc:oracle:thin:@[数据库IP地址]:[数据库端口]/[服务名]" />

    注意:driverClassName和url根据数据库类型和jar包而存在差异。首先看Mysql,如下:

driverClassName:
com.mysql.jdbc.Driver    # mysql-connector-java 5.x及之前版本中的
com.mysql.cj.jdbc.Driver # mysql-connector-java 6.x及后续版本中的

url:
jdbc:mysql://[数据库IP地址]:[数据库端口]/[库名]

    再看Orcale,如下:

driverclassName:
oracle.jdbc.driver.OracleDriver    #ojdbc类型的jar包
com.mchange.v2.c3p0.ComboPooledDataSource    #没用过,查到是c3p0类型的jar包

url:
jdbc:oracle:thin:@[数据库IP地址]:[数据库端口]:[SID]
jdbc:oracle:thin:@//[数据库IP地址]:[数据库端口]/[服务名]  #Oracle 11g及以上版本,@后面的//可以省略
jdbc:oracle:thin:@[TNSName]  #oracle 10.2.0.1及以上版本支持TNSName

    其他常见数据库连接可以参考:https://blog.csdn.net/l13880647015/article/details/106571467/。

    接着,在项目目录下WEB-INF/web.xml文件的<webapp>标签内添加如下内容:

<resource-ref>
  <res-ref-name>[数据源名称]</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

    注意:<res-ref-name>标签的值与<Resource>中name参数的值相同。

    最后,重启tomcat程序。

  2)主修改tomcat根目录下的conf/server.xml文件,辅修改tomcat根目录下的conf/context.xml文件

    首先,在tomcat根目录下的conf/server.xml文件的<GlobalNamingResources>标签内添加如下内容:

<Resource name="[自定义资源名称]"
          auth="Container"
          type="javax.sql.DataSource"
          username="[数据库用户名]"
          password="[数据库密码]"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          url="jdbc:oracle:thin:@[数据库IP地址]:[数据库端口]/[服务名]" />

    其次,在tomcat根目录下的conf/context.xml文件的<Context>标签内添加如下内容:

<ResourceLink name="[自定义数据源名称]" global="[资源名称]" type="javax.sql.DataSource" />

    接着,在项目目录下WEB-INF/web.xml文件的<webapp>标签内添加如下内容:

<resource-ref>
  <res-ref-name>[数据源名称]</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

    注意:<ResourceLink>中global参数的值与<Resource>中name参数的值相同,<res-ref-name>标签的值与<ResourceLink>中name参数的值相同。

    最后,重启tomcat程序。

(2).私有

  目前找到的私有配置方法也是两种。

  1)主修改tomcat根目录下的conf/server.xml文件

    首先,在tomcat根目录下的conf/server.xml文件的<Host>标签内添加如下内容:

<Context path="/ygfp" docBase="ygfp" reloadable="true">
  <Resource name="[自定义数据源名称]"
            auth="Container"
            type="javax.sql.DataSource"
            username="[数据库用户名]"
            password="[数据库密码]"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@[数据库IP地址]:[数据库端口]/[服务名]"/>
</Context>    

    接着,在项目目录下WEB-INF/web.xml文件的<webapp>标签内添加如下内容:

<resource-ref>
  <res-ref-name>[数据源名称]</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

    注意:<res-ref-name>标签的值与<Resource>中name参数的值相同。

    最后,重启重启tomcat程序。

  2)创建项目目录的META-INF\context.xml文件

    创建项目目录的META-INF\context.xml文件,并添加如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
  <Resource name="[自定义数据源名称]"
            auth="Container"
            type="javax.sql.DataSource"
            username="[数据库用户名]"
            password="[数据库密码]"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            url="jdbc:oracle:thin:@[数据库IP地址]:[数据库端口]/[服务名]"/>
</Context>

    通过tomcat web管理页面启动项目即可。

(3).补充

  1)项目配置文件或程序中调用的JNDI要与自定义数据源名称保持一致;

  2)补充Resource中参数说明:

    maxIdle:数据库最大空闲连接的数量(待命),设 0 为没有限制。

    maxWait:最大建立连接等待时间,单位为ms,设-1表示无限制。

    maxActive:数据库最大连接数,设0为没有限制。

  3)同时存在多种配置方式且同名,会获取哪一个:

    首先,全局配置大于私有配置,也就是说若全局和私有同时存在,优先获取全局配置的数据源

    全局:在context.xml中,<Resource>和<ResourceLink>(引用server.xml中<GlobalNamingResources> )同时存在,哪个标签在前获取到哪一个,即按顺序获取。

    私有:1. 若只存在<Host>标签中的配置,不存在META-INF中的context.xml,则优先获取<Host>中配置的第一个数据源;2. 若两种私有配置方式都存在,会获取META-INF中context.xml配置的数据源。

  4)为什么web.xml中的配置可有可无,却要加上呢?

    详情见tomcat的docs:jndi-resources-howto.html

    其中有这么一句话:

If a resource has been defined in a <Context> element it is not necessary for that resource to be defined in /WEB-INF/web.xml.
However, it is recommended to keep the entry in /WEB-INF/web.xml to document the resource requirements for the web application.

    也就是说,在web.xml加入的那段代码仅起到说明作用,说明这个Web应用引用了哪些资源!详情请翻阅文档。

 

参考文档:JNDI学习总结(二):tomcat配置全局和私有JNDI数据源的几种方式 - 水狼一族 - 博客园 (cnblogs.com)

     https://blog.csdn.net/digyso888/article/details/3671170

标签:xml,web,tomcat,数据源,JNDI,context,标签
From: https://www.cnblogs.com/diantong/p/17315851.html

相关文章

  • Tomcat
    问题及解决严重[localhost-startStop-1]org.apache.jasper.EmbeddedServletOptions.<init>ThescratchDiryouspecified:[/Users/Jack/Desktop/apache-tomcat-8.5.32/work/Catalina/localhost/host-manager]isunusable.ThescratchDiryouspecifiedisunusable.......
  • Tomcat修改端口号(借鉴)
    tomcat默认端口号是8080,为了不和其他应用设置的端口冲突,可以通过tomcat的配置文件server.xml修改一、找到server.xml文件tomcat安装目录下的conf文件夹:我的是D:\ProgramFiles\ApacheSoftwareFoundation\Tomcat7.0\conf,打开server.xml配置文件。二、修改server.xml文件1,修......
  • Linux环境tomcat安装步骤详细教程
    下载tomcat包:https://tomcat.apache.org/tomcat-10.1-doc/index.html将下载的安装包放至linux环境的/usr/local/tomcat目录下:执行解压命令tar-xvfapache-tomcat-9.0.73.tar.gz将解压出来的目录改名为tomcat9,然后进入tomcat9/bin目录,执行./startup.sh命令启动tomcat:执行启动命令......
  • tomcat 双亲委托机制
    tomcat著名的双亲委托机制就是有类需要加载时就委托父类去加载一直到顶级的Bootstrap都没有自己才加载,自己也没有就报错类加载器BootstrapClassLoader:JVM内置的类加载器,用来加载Java核心类库,例如rt.jar、resources.jar等等。ExtensionClassLoader:用来加载Java扩展类......
  • 如何访问tomcat中的项目
    访问tomcat中web项目将java项目打成war后,放入webapps目录中,然后在bin目录中找到startup.bat,因为我是在windows环境中演示,所以用bat结尾的脚本启动tomcat,关闭的脚本是shutdown.bat。如果是在Linux环境下,则使用startup.sh脚本启动,关闭的脚本是shutdown.sh。将tomcat启动后,tomca......
  • 关于Tomcat服务器的目录
    关于Tomcat服务器的目录bin:这个目录是Tomcat服务器的命令文件存放的目录,比如:启动Tomcat,关闭Tomcat等。conf:这个目录是Tomcat服务器的配置文件存放目录。(server.xml文件中可以看到配置端口号,默认Tomcat端口号8080)lib:这个目录是Tomcat服务器的核心程序目录,因为Tomcat服务器是j......
  • nginx+tomcat双端口实现负载均衡
    nginx基础配置---点击tomcat基础配置---点击上述配置完成之后进行对tomcat配置不同端口tomcat设置端口#移动tomcat设置两个主目录[root@lyxlocal]#mvapache-tomcat-8.5.79tomcat-home[root@lyxlocal]#cp-Rtomcat-hometomcat-8080[root@lyxlocal]#cp-Rtomcat-home......
  • Tomcat彻底卸载干净
    1.首先直接删除原来的文件2.打开注册表 3.全局搜索Tomcat,删除对应的注册表4.之后以管理员身份打开任务管理器,输入scdeletetomcat10删除全部 ......
  • 关于Tomcat9和Tomcat10的了解
    就离谱在我使用Tomcat10之前,我是没有想到9和10的差距可以这么大!习惯了使用Maven项目以及版本9的Tomcat,将相关的依赖习惯于导成javax;使用10的时候,html页面怎么也跳转不到servlet后台里面去,就很麻;找了好久,才找到解决办法:版本不同,导的包需要从原来的javax换乘jakarta全部推翻重......
  • Kotlin Compose 删除条目并刷新数据源 Flow 与Pager3 与 Compose 最佳做法
    删除方式有很多种。。成功的却不多。。分享一下首先在viewModel中创建两个变量privateval_deletedDialogHashs=mutableStateOf(setOf<String>())valdeletedDialogHashs:State<Set<String>>=_deletedDialogHashs在viewModel中声明的删除方法也很简单funremoveFeedDial......