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

Spring DataSource 配置三大方式:JNDI、連接池、DriverManager 全解析

     編輯:Java 相關知識

三種獲取 DataSource 的途徑

方式適用場景優點缺點
JNDI生產環境、應用服務器管理連接池統一資源管理、支援集群、安全隔離依賴容器配置、開發調試稍繁
第三方連接池 (DBCP/C3P0/HikariCP)獨立部署、Spring 管理池配置靈活、性能可控、無容器依賴需自行調優參數
DriverManagerDataSource測試、極簡場景零依賴、配置最簡無連接池,生產禁用

方式一:JNDI 數據源

Spring 配置

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/myDataSource"/>
    <!-- 可選:資源引用為真,預期類型 -->
    <property name="resourceRef" value="true"/>
    <property name="expectedType" value="javax.sql.DataSource"/>
</bean>

Tomcat context.xml / server.xml 配置

<Resource name="jdbc/myDataSource"
          auth="Container"
          type="javax.sql.DataSource"
          maxActive="100" maxIdle="30" maxWait="10000"
          username="app_user" password="secret"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/app_db?useSSL=false"
          validationQuery="SELECT 1"
          testOnBorrow="true"/>

web.xml 資源引用(可選,Spring 通常不需要)

<resource-ref>
    <res-ref-name>jdbc/myDataSource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

方式二:第三方連接池

Apache DBCP (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/app_db"/>
    <property name="username" value="app_user"/>
    <property name="password" value="secret"/>
    <!-- 核心池參數 -->
    <property name="maxActive" value="100"/>
    <property name="maxIdle" value="30"/>
    <property name="maxWait" value="10000"/>
    <property name="defaultAutoCommit" value="false"/>
    <!-- 連接驗證 -->
    <property name="validationQuery" value="SELECT 1"/>
    <property name="testOnBorrow" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>

C3P0

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/app_db"/>
    <property name="user" value="app_user"/>
    <property name="password" value="secret"/>
    <property name="maxPoolSize" value="100"/>
    <property name="minPoolSize" value="10"/>
    <property name="maxIdleTime" value="300"/>
    <property name="preferredTestQuery" value="SELECT 1"/>
    <property name="testConnectionOnCheckout" value="true"/>
</bean>

HikariCP (現代首選,Spring Boot 2 默認)

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/app_db"/>
    <property name="username" value="app_user"/>
    <property name="password" value="secret"/>
    <property name="maximumPoolSize" value="20"/>
    <property name="minimumIdle" value="5"/>
    <property name="connectionTimeout" value="30000"/>
    <property name="idleTimeout" value="600000"/>
    <property name="maxLifetime" value="1800000"/>
    <property name="connectionTestQuery" value="SELECT 1"/>
</bean>

方式三:DriverManagerDataSource (僅測試)

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/app_db"/>
    <property name="username" value="app_user"/>
    <property name="password" value="secret"/>
</bean>

警告:每次 getConnection() 都物理建立新連接,無池化,高併發下極其低效且易耗盡數據庫連接數。生產環境嚴禁使用。

連接池核心參數調優指南

參數含義建議起始值
maxActive / maximumPoolSize最大連接數CPU 核心數 * 2 + 磁盤數 (或 20-50)
maxIdle / minimumIdle空閒保持數10-20
maxWait / connectionTimeout獲取連接超時(ms)5000-10000
validationQuery / connectionTestQuery驗證 SQLSELECT 1 (MySQL), SELECT 1 FROM DUAL (Oracle)
testOnBorrow借用時驗證true
testWhileIdle / idleTimeout空閒驗證/回收true / 10-30 分鐘
removeAbandoned / maxLifetime洩漏回收true / 30 分鐘

與 Hibernate/MyBatis 整合

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

選型原則:生產首選 HikariCP(性能最優、參數最少)、容器管理選 JNDI、舊專案維護用 DBCP/C3P0。DataSource 單例化,統一交給 Spring 管理生命週期。

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