搞Tomcat的人,十个有八个都被数据库配置坑过。你明明照着网上的教程一步步来,结果项目一启动,报错信息刷屏,什么“Cannot create JDBC driver of class”,什么“Connection refused”,看得人头皮发麻。其实数据库配置这事儿,说白了就是让Tomcat知道怎么连上你的数据库,然后把连接池管理好。但问题在于,Tomcat本身不存数据,它只是个中间人,你得告诉它数据库在哪儿、用户名密码是什么、用哪种驱动。这些信息要么写在全局的context.xml里,要么塞进项目自己的META-INF文件夹,或者干脆在代码里硬编码。最实用的是第一种,因为改配置不用重新打包。

先说说最基础的配置方式:在Tomcat的conf目录下,有个context.xml文件,这是全局配置。你打开它,在
但全局配置有个坑:如果你在服务器上跑了多个项目,每个项目连不同的数据库,全局context.xml里的配置就会被所有项目共享。这时候就得用项目级配置。你在项目的WebContent/META-INF目录下,新建一个context.xml文件,内容结构和全局的一样,但只对这个项目生效。Tomcat启动时,会先加载项目里的context.xml,再加载全局的。如果两者冲突,项目级的会覆盖全局的。这招特别适合开发环境,比如你本地用MySQL,线上用PostgreSQL,各自配各自的,互不干扰。还有个小技巧:项目级context.xml里的资源名字,最好用jdbc/项目名这种格式,避免同名冲突。
配置写好了,怎么在代码里用?最常见的方式是通过JNDI查找。你在web.xml里声明一个
连接池的配置是另一个容易翻车的地方。Tomcat默认用的是DBCP连接池,但版本不同,配置参数也不一样。你需要在
说个真实踩过的坑。有一次项目上线,用户反馈页面偶尔打不开,查日志发现是数据库连接超时。我看配置里maxActive设了100,心想够用了,但没设removeAbandonedTimeout和logAbandoned。结果某些请求执行完没关闭连接,连接池里的连接被慢慢耗尽。后来加上removeAbandonedTimeout="60",意思是60秒还没归还的连接,Tomcat强制回收,再打印一条警告日志。这招虽然暴力,但能救命。还有一次,生产环境的Tomcat和数据库不在同一台机器,防火墙把3306端口给封了,Tomcat报了“Connection refused”。排查了半天才发现是网络问题,跟配置无关。所以数据库配置不光是写代码,还得确认网络通不通、端口开没开、数据库服务有没有启动。
高级一点的玩法是配置多个数据源。比如你有一个项目同时连MySQL和Oracle,或者读库和写库分离。这时候需要在context.xml里声明两个
聊点实战中的习惯。别把数据库密码明文写在配置文件里,尤其是放到Git仓库的时候。Tomcat支持密码加密,你可以用DigestPassword工具生成密文,然后在context.xml里用密文代替明文。或者更简单点,把密码放到环境变量里,在配置里用${DB_PASSWORD}引用。另外,定期检查Tomcat日志里的数据库连接相关警告,很多问题都是慢慢积累的。比如连接泄露,刚开始没事,跑一个月后页面全挂。养成好习惯:每次上线前,把连接池参数调优一遍,测试环境压一把,看看maxActive设多少不报错。数据库配置这事儿,看着是体力活,但细节决定成败。你把这些基础打牢了,遇到问题才不会慌。从入门到实战,说白了就是反复踩坑、填坑的过程。


