myeclipse配置数据库连接池本质是利用tomcat的jndi机制在容器层面统一管理连接,核心三步:放驱动(项目web-inf/lib和tomcat/lib双路径)、写meta-inf/context.xml定义datasource资源、在web.xml中声明resource-ref;代码通过initialcontext.lookup("java:comp/env/jdbc/mydb")获取datasource,调用conn.close()归还连接而非关闭。

MyEclipse 配置数据库连接池,本质是借助 Tomcat 容器的 JNDI 机制,在应用服务器层面统一管理数据库连接,避免每次请求都新建/关闭连接。核心在于三步:放驱动、写 context.xml、声明 resource-ref。不依赖代码加载驱动,也不用 DriverManager,而是通过 JNDI 查找 DataSource。
把 JDBC 驱动 JAR 放对位置
驱动包(如 mysql-connector-java-8.0.33.jar 或适配你 MySQL 版本的 jar)必须放在两个地方:
- 项目 WEB-INF/lib 目录下:确保编译期和运行时类路径可访问;
-
Tomcat 的 lib 目录下(例如
tomcat/lib):因为 connection pool 由容器管理,Tomcat 启动时需能加载驱动类;
仅放项目里会导致 JNDI 查找失败(常见报错:ClassNotFoundException: com.mysql.cj.jdbc.Driver)。
在 META-INF/context.xml 中定义连接池
在 Web 项目的 WebContent/META-INF/context.xml(若无此目录则手动创建)中写入如下配置(以 MySQL 为例):
<?xml version="1.0" encoding="UTF-8"?><context><resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverclassname="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=GMT%2B8&characterEncoding=utf8" username="root" password="123456" maxactive="20" maxidle="10" minidle="5" initialsize="5" maxwait="10000" validationquery="SELECT 1" testonborrow="true" removeabandonedonborrow="true" logabandonedonborrow="true"></resource></context>
注意关键点:
-
name="jdbc/mydb" 是 JNDI 名,后续 lookup 时用
java:comp/env/jdbc/mydb; -
factory 推荐显式指定 Tomcat 自带的连接池工厂(比旧版
BasicDataSourceFactory更稳定); -
url 参数要完整:MySQL 8+ 必须含
serverTimezone和useSSL=false(或配证书),否则连接拒绝; - validationQuery + testOnBorrow 可自动剔除失效连接,防止“Connection closed”异常。
在 web.xml 中声明资源引用
在 WebContent/WEB-INF/web.xml 的 <web-app></web-app> 内末尾添加:
<resource-ref><description>MySQL DataSource</description><res-ref-name>jdbc/mydb</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>
这一步告诉容器:“本应用要用名为 jdbc/mydb 的容器托管数据源”,缺了它,JNDI lookup 会抛 NameNotFoundException。
Java 代码中获取连接(Servlet/JSP 示例)
不再用 Class.forName() 和 DriverManager.getConnection(),改用标准 JNDI 方式:
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/mydb");
Connection conn = ds.getConnection();
// 执行查询或更新...
conn.close(); // 归还连接到池,不是真正关闭
} catch (NamingException | SQLException e) {
e.printStackTrace();
}
调用 conn.close() 不会断开物理连接,而是将连接对象返还给池,下次可复用——这是连接池高效的关键。











