首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 數據庫連接池配置全攻略:Tomcat、Hibernate、Spring、代碼式四大方案

     編輯:Java 綜合教學

前置準備

MySQL 驅動 JAR (mysql-connector-java) 必須放入類路徑(Tomcat common/lib、專案 WEB-INF/lib 或 Maven 依賴)。

一、Tomcat 容器級數據源 (JNDI)

方式 1:專案專屬 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>

方式 2:全局 conf/context.xml

<Context>
  <Resource name="jdbc/test" ... url="jdbc:mysql://localhost:3306/testdb" />
</Context>

方式 3:server.xml 虛擬主機 <Context> 內

<Context path="/WebRoot" docBase="E:/workspace/..." reloadable="true">
  <Resource name="jdbc/test" ... />
</Context>

屬性對照

屬性含義
maxActive最大活躍連接數
maxIdle最大空閒連接數
maxWait獲取連接最長等待毫秒數
logAbandoned記錄棄用連接(防洩漏)

代碼獲取 (需在 Tomcat 容器內)

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。

二、Hibernate 內建/外掛連接池

1. 內建連接池 (僅開發測試)

<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>

2. DBCP / C3P0 / Proxool (在 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>

3. 從容器獲取 (JNDI)

<property name="hibernate.connection.datasource">java:comp/env/jdbc/crm</property>

三、Spring 管理連接池 (推薦生產)

<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 專案、不想引入 SpringHibernate + C3P0
Spring 生態、靈活控制、AOP 事務Spring Bean DataSource
獨立應用、無容器、輕量嵌入代碼式 / HikariCP (現代首選)

現代專案強烈建議使用 HikariCP (Spring Boot 2.x 預設),效能優於 DBCP/C3P0,配置更簡潔。

原文鏈接:https://blog.sina.com.cn/s/blog_85d71fb70101ab99.html

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved