MySQL 驅動 JAR (mysql-connector-java) 必須放入類路徑(Tomcat common/lib、專案 WEB-INF/lib 或 Maven 依賴)。
META-INF/context.xml<Context>
<Resource name="jdbc/chaoshi" auth="Container"
type="javax.sql.DataSource"
maxActive="50" maxIdle="30" maxWait="10000"
username="root" password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/DBName" />
</Context>
conf/context.xml<Context> <Resource name="jdbc/test" ... url="jdbc:mysql://localhost:3306/testdb" /> </Context>
server.xml 虛擬主機 <Context> 內<Context path="/WebRoot" docBase="E:/workspace/..." reloadable="true"> <Resource name="jdbc/test" ... /> </Context>
| 屬性 | 含義 |
|---|---|
| maxActive | 最大活躍連接數 |
| maxIdle | 最大空閒連接數 |
| maxWait | 獲取連接最長等待毫秒數 |
| logAbandoned | 記錄棄用連接(防洩漏) |
Context init = new InitialContext();
Context env = (Context) init.lookup("java:/comp/env");
DataSource ds = (DataSource) env.lookup("jdbc/test");
Connection conn = ds.getConnection(); // 非 null 即成功
注意:非容器環境 (main 方法、JUnit) 直接跑會拋 NoInitialContextException。
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/db</property> <property name="connection.username">root</property> <property name="connection.password">pwd</property>
hibernate.cfg.xml 直接配置)<!-- DBCP --> <property name="dbcp.maxActive">100</property> <property name="dbcp.maxWait">60000</property> <property name="dbcp.maxIdle">10</property> <!-- C3P0 --> <property name="c3p0.min_size">5</property> <property name="c3p0.max_size">30</property> <property name="c3p0.time_out">1800</property> <property name="c3p0.max_statement">50</property> <!-- Proxool (需額外 XML) --> <property name="proxool.pool_alias">dbpool</property> <property name="proxool.xml">ProxoolConf.xml</property> <property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
<property name="hibernate.connection.datasource">java:comp/env/jdbc/crm</property>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dbname"/> <property name="username" value="root"/> <property name="password" value="******"/> <property name="maxActive" value="100"/> <property name="maxWait" value="1000"/> <property name="maxIdle" value="30"/> <property name="defaultAutoCommit" value="true"/> <property name="removeAbandoned" value="true"/> <!-- 自動回收棄用連接 --> <property name="removeAbandonedTimeout" value="60"/> </bean>
public class ConnectionPool {
private static BasicDataSource bds;
public static DataSource setupDataSource() {
bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/databasename");
bds.setUsername("root");
bds.setPassword("root");
bds.setInitialSize(50);
bds.setMaxActive(-1); // -1 無限制
bds.setMaxIdle(-1);
bds.setMinIdle(0);
bds.setMaxWait(-1);
return bds;
}
public static void shutdownDataSource(DataSource ds) throws SQLException {
((BasicDataSource) ds).close();
}
}
使用:DataSource ds = ConnectionPool.setupDataSource(); Connection conn = ds.getConnection();
| 場景 | 推薦方案 |
|---|---|
| 多應用共享、運維統一管理 | Tomcat JNDI |
| Hibernate 專案、不想引入 Spring | Hibernate + C3P0 |
| Spring 生態、靈活控制、AOP 事務 | Spring Bean DataSource |
| 獨立應用、無容器、輕量嵌入 | 代碼式 / HikariCP (現代首選) |
現代專案強烈建議使用 HikariCP (Spring Boot 2.x 預設),效能優於 DBCP/C3P0,配置更簡潔。