如何配置Tomcat数据源连接Oracle_JNDI资源设置
Tomcat连接Oracle JNDI失败主因是ojdbc驱动未放$CATALINA_HOME/lib、JNDI名不匹配或配置文件层级错乱;驱动须由Catalina类加载器加载,代码lookup必须用"ja va:comp/env/"前缀。
遇到Tomcat配置Oracle JNDI数据源失败,先别急着怀疑自己的代码。实际上,十有八九的问题都出在部署环节——要么是驱动放错了地方,要么是名字没对上,再不然就是配置文件层级搞混了。说白了,不是逻辑不对,而是链路断了。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Oracle JDBC 驱动必须放在 $CATALINA_HOME/lib 目录下
这里有个关键点:Tomcat启动时,是由Catalina类加载器负责加载全局资源的。所以,你把ojdbc8.jar(或者ojdbc6.jar)放在应用的WEB-INF/lib里,对JNDI数据源来说,是完全不起作用的。驱动类,不管是老版本的oracle.jdbc.driver.OracleDriver还是新版的oracle.jdbc.OracleDriver,都必须能被Tomcat的系统类加载器找到才行。
如果放错了位置,通常会看到这样的报错:Cannot create JDBC driver of class '' for connect url 'null',或者更直接的ClassNotFoundException: oracle.jdbc.driver.OracleDriver。
- 确认驱动版本:Oracle 12c及以上,推荐使用
ojdbc8.jar;如果是11g,可以用ojdbc6.jar。至于classes12.jar这种老古董,就别再用了。 - 认准唯一路径:必须是
$CATALINA_HOME/lib/ojdbc8.jar。既不是WEB-INF/lib/,也不是$CATALINA_HOME/common/lib/(这个目录在Tomcat 7之后就已经废弃了)。 - 避免冲突:记得把项目里多余的
ojdbc*.jar删掉,否则很容易引发LinkageError或者类加载冲突,到时候排查起来更头疼。
server.xml 里配全局资源,context.xml 里只做引用
配置文件的角色一定要分清。全局数据源的定义,必须放在$CATALINA_HOME/conf/server.xml文件的节点里面。而应用的引用,则统一在$CATALINA_HOME/conf/context.xml(对所有应用生效)或者META-INF/context.xml(只对单个应用生效)里进行。这两者的关系不能颠倒。
一个典型的错误是:直接把写进了context.xml,却忘了指定factory。结果就是,Tomcat会使用默认的DBCP连接池,而它的参数很可能与Oracle驱动不兼容。
- 全局定义示例(
server.xml): - 对应引用(
context.xml): - 别忘了
web.xml的声明:jdbc/oracle ja vax.sql.DataSource Container
Ja va 代码里 lookup 必须带 ja va:comp/env/ 前缀
在代码里进行JNDI查找时,用的名字可不是你在配置文件name属性里写的那个字符串本身,而是容器帮你拼接好的完整路径。前缀写错了,NoInitialContextException或者空指针就找上门了。
这里还有个容易踩的坑:很多开发者习惯在IDE(比如Eclipse)里直接“Run on Server”。这时候,Tomcat读取的其实是workspace下Servers/Tomcat vX.X Server at localhost-config/目录里的配置文件,而不是你本地的$CATALINA_HOME/conf/。改错了地方,等于白忙活一场。
- 正确的lookup写法:
ctx.lookup("ja va:comp/env/jdbc/oracle") - 错误的写法:
ctx.lookup("jdbc/oracle")或者ctx.lookup("ja va:global/jdbc/oracle")(后者是Ja va EE的全局命名空间,别搞混了)。 - 调试小技巧:可以在servlet的init()方法里打印一下
ctx.list(""),看看你定义的名字是否真的成功绑定到了资源上。
最后,再提一个经常被忽略的细节:验证查询(validationQuery)和连接测试时机。Oracle数据库不支持简单的SELECT 1,必须写成SELECT 1 FROM DUAL或者SELECT SYSDATE FROM DUAL。另外,如果你设置了testOnBorrow="true"却没有配置validationQuery,那么连接池很可能会静默地返回一个已经失效的连接,问题就藏得更深了。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
为什么Oracle触发器中不能直接执行Commit操作_解析自治事务应用
ORA-04092错误:触发器中直接COMMIT会报此错,因Oracle禁止在触发器内提交事务,自治事务需显式声明PRAGMA AUTONOMOUS_TRANSACTION并手动COMMIT,否则自动回滚。 Oracle触发器里执行COMMIT会报什么错 如果你在触发器里直接写上 COMMIT 或
怎样实现PHP中高安全的SQL防注入方案_结合PDO驱动与参数绑定
PDO预处理不能防住所有SQL注入,因默认模拟预处理会拼接参数,且参数绑定仅适用于值,不适用于表名、列名、ORDER BY等结构化部分,须白名单校验。 为什么PDO预处理不能直接防住所有SQL注入 不少开发者有个常见的误解,以为只要代码里用上了 PDO::prepare(),SQL注入的风险就彻底解
SQL中如何进行跨行计算_使用LEAD函数分析趋势
SQL窗口函数LEAD:如何优雅地“向前看”做跨行计算 说到数据分析,尤其是趋势洞察,我们常常需要跳出当前行的局限,看看“后面”发生了什么。这时候,LEAD函数就该登场了。它本质上是一个窗口函数,专门用来获取当前行之后第N行的值。它的基本语法是LEAD(column, offset, default
SQL如何统计每个分组中值的范围区间_使用MIN与MAX函数
SQL分组统计:如何精准获取每个类别的数值范围? 在数据分析工作中,一个高频需求是:按某个维度分组后,快速找出每组数据的最大值和最小值,也就是数值的范围区间。这听起来简单,但实际操作时,稍不注意就会踩到数据质量、语法兼容或性能优化的“坑”。今天,我们就来聊聊这个既基础又关键的技术点。 用 MIN()
SQL如何判断字段是否存在值?IFNULL在数据展示中用法
SQL如何判断字段是否存在值?IFNULL在数据展示中用法 SQL里怎么判断字段有没有值?别只盯着NULL 在数据库里,一个字段“没值”可不仅仅是NULL那么简单。它完全有可能是空字符串 、数字0,甚至是布尔值FALSE。到底算不算“无值”,最终还得看业务逻辑怎么定义。 举个例子就明白了:用户昵称
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

