SSM框架搭建之數據庫鏈接池(三)

SSM框架搭建之數據庫鏈接池(三)

Spring提供了兩個這樣的數據源(都位於org.springframework.jdbc.datasource程序包裏):
DriverManagerDataSource:這個類實現了javax.sql.DataSource接口,但它並無提供池化鏈接的機制,每次調用getConnection()獲取新鏈接時,只是簡單地建立一個新的鏈接。所以,這個數據源類比較適合在單元測試 或簡單的獨立應用中使用,由於它不須要額外的依賴類。
SingleConnectionDataSource:在每一個鏈接請求時都返回同一個鏈接。雖然它不一樣嚴格意義上的池管理數據源,但咱們能夠把它看做只有一個鏈接的池。
對兩個數據源的配置都相似於配置DBCP的BasicDataSource,區別在於因爲DriverManagerDataSource和SingleConnectionDataSource都沒有提供鏈接池,因此在此沒有設置池配置屬性。
雖然這兩個數據源都對於小程序來講是很不錯的,並且還在不斷髮展,但把它們用於生產程序仍是須要認真考慮的。SingleConnectionDataSource只使用一個數據庫鏈接,因此不適合用於多線程程序。
而 DriverMangerDataSource雖然可以支持多線程,但它會在每次鏈接請求時都新建一個鏈接,這是以性能爲代價的。因爲這些限制,咱們強烈 建議應該使用數據源池。
若是應用配置在高性能的應用服務器(如WebLogic或Websphere等)上,咱們可能更但願使用應用服務器自己提供的數據源。應用服務器的數據源 使用JNDI開放調用者使用,Spring爲此專門提供引用JNDI資源的JndiObjectFactoryBean類。css

SSM框架之DriverManagerDataSource--spring-mybatis.xmlhtml

<!-- Spring提供了的數據源,每一個鏈接請求時都新建一個鏈接 -->
     <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${datasource.driverClassName}"></property>
        <property name="url" value="${datasource.url}"></property>
        <property name="username" value="${datasource.userName}"></property>
        <property name="password" value="${datasource.userPassword}"></property>
    </bean>
datasource.driverClassName=com.mysql.cj.jdbc.Driver
datasource.userName=root
datasource.userPassword=123456
datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC

SSM框架之dbcp2鏈接池--spring-mybatis.xml(如果dbcp,個別參數對應不上)java

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${dbcp.driverClassName}" />
        <property name="url" value="${dbcp.url}" />
        <property name="username" value="${dbcp.username}" />
        <property name="password" value="${dbcp.password}" />

        <!--initialSize: 初始化鏈接 -->
        <property name="initialSize" value="${dbcp.initialSize}" />
        <!--maxIdle: 最大空閒鏈接 -->
        <property name="maxIdle" value="${dbcp.maxIdle}" />
        <!--minIdle: 最小空閒鏈接 -->
        <property name="minIdle" value="${dbcp.minIdle}" />
        <!--maxActive: 最大鏈接數量 -->
        <property name="maxTotal" value="${dbcp.maxActive}" />

        <!--removeAbandonedTimeout: 超時時間(以秒數爲單位) -->
        <property name="removeAbandonedTimeout" value="${dbcp.removeAbandonedTimeout}" />
        <!--maxWait: 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->
        <property name="maxWaitMillis" value="${dbcp.maxWait}" />
        <!-- 在空閒鏈接回收器執行週期(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />
        <!-- 在每次空閒鏈接回收器線程(若是有)運行時檢查的鏈接數量 -->
        <property name="numTestsPerEvictionRun" value="${dbcp.numTestsPerEvictionRun}" />
        <!-- 最小空閒時間 -->
        <property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />
        <!-- 驗證連接是否有效的sql語句 -->
        <property name="validationQuery" value="${dbcp.validationQuery}" />
        <!-- 獲取連接以前是否測試連接的可用性 -->
        <property name="testOnBorrow" value="${dbcp.testOnBorrow}" />
    </bean>
#src/config/dbcp.properties
dbcp.driverClassName=com.mysql.cj.jdbc.Driver
dbcp.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
dbcp.username=root
dbcp.password=123456

dbcp.initialSize=3
dbcp.minIdle=5
dbcp.maxIdle=10
dbcp.maxActive=15
dbcp.maxWait=60000
dbcp.numTestsPerEvictionRun=10

dbcp.timeBetweenEvictionRunsMillis=60000
dbcp.minEvictableIdleTimeMillis=300000
dbcp.validationQuery=SELECT 1
dbcp.testOnBorrow=false

dbcp.removeAbandoned=true
dbcp.removeAbandonedTimeout=1800

SSM框架之c3p0鏈接池--spring-mybatis.xmlmysql

<!-- c3p0鏈接池配置 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${c3p0.driverClassName}"/>
        <property name="jdbcUrl" value="${c3p0.jdbcUrl}"/>
        <property name="user" value="${c3p0.user}"/>
        <property name="password" value="${c3p0.password}"/> 

        <!--當鏈接池中的鏈接耗盡的時候c3p0一次同時獲取的鏈接數。Default: 3 -->
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>       
        <!--初始化時獲取三個鏈接,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>

        <!--最大空閒時間,60秒內未使用則鏈接被丟棄。若爲0則永不丟棄。Default: 0 -->
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
         <!--每60秒檢查全部鏈接池中的空閒鏈接。Default: 0 -->
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/> 
        <!-- JDBC的標準參數,用以控制數據源內加載的PreparedStatements數量。但因爲預緩存的statements 屬於單個connection而不是整個鏈接池。
        因此設置這個參數須要考慮到多方面的因素。 若是maxStatements與maxStatementsPerConnection均爲0,則緩存被關閉。Default: 0 -->
        <property name="maxStatements" value="${c3p0.maxStatements}"/>     
        <!-- c3p0是異步操做的,緩慢的JDBC操做經過幫助進程完成。擴展這些操做能夠有效的提高性能 經過 多線程實現多個操做同時被執行。Default: 3 -->
        <property name="numHelperThreads" value="${c3p0.numHelperThreads}"/>
    </bean>
#src/config/c3p0.properties
c3p0.driverClassName=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
c3p0.user=root
c3p0.password=123456

c3p0.acquireIncrement=3
c3p0.initialPoolSize=3
c3p0.idleConnectionTestPeriod=60
c3p0.minPoolSize=5
c3p0.maxPoolSize=100
c3p0.maxStatements=100
c3p0.numHelperThreads=10
c3p0.maxIdleTime=60

SSM框架之Druid鏈接池--spring-mybatis.xmlweb

<!-- druid鏈接池配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        destroy-method="close">
        <!-- 數據庫基本信息配置 -->
        <property name="driverClassName" value="${druid.driverClassName}"></property>
        <property name="url" value="${druid.url}"></property>
        <property name="username" value="${druid.userName}"></property>
        <property name="password" value="${druid.userPassword}"></property>

        <!-- 初始化鏈接數量 -->
        <property name="initialSize" value="${druid.initialSize}" />
        <!-- 最大併發鏈接數 -->
        <property name="maxActive" value="${druid.maxActive}" />
        <!-- 最小空閒鏈接數 -->
        <property name="minIdle" value="${druid.minIdle}" />
        <!-- 配置獲取鏈接等待超時的時間 -->
        <property name="maxWait" value="${druid.maxWait}" />

        <!-- 配置間隔多久才進行一次檢測,檢測須要關閉的空閒鏈接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個鏈接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}" />

        <!-- 打開PSCache,而且指定每一個鏈接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
        <!-- 要啓用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改成true -->
        <property name="maxPoolPreparedStatementPerConnectionSize"
            value="${druid.maxOpenPreparedStatements}" />
        <!-- 用來檢測鏈接是否的sql,要求是一個查詢語句。在mysql中一般設置爲SELECT 'X' -->
        <property name="validationQuery" value="${druid.validationQuery}" />
        <!-- 申請鏈接的時候檢測,若是空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery鏈接是否有效 -->
        <property name="testWhileIdle" value="${druid.testWhileIdle}" />
        <!-- 申請鏈接時執行validationQuery檢測鏈接是否有效 這個配置會下降性能 -->
        <property name="testOnBorrow" value="${druid.testOnBorrow}" />
        <!-- 歸還鏈接時執行validationQuery檢測鏈接是否有效 這個配置會下降性能 -->
        <property name="testOnReturn" value="${druid.testOnReturn}" />

        <!-- 超過期間限制是否回收: 打開removeAbandoned功能 -->
        <property name="removeAbandoned" value="${druid.removeAbandoned}" />
        <!-- 超時時間:1800秒,也就是30分鐘 -->
        <property name="removeAbandonedTimeout" value="${druid.removeAbandonedTimeout}" />
        <!-- 關閉abanded鏈接時輸出錯誤日誌 -->
        <property name="logAbandoned" value="${druid.logAbandoned}" />

        <!-- 監控統計攔截的filters stat是statfilter的別名,log4j是logFilter的別名 -->
        <property name="filters" value="${druid.filters}" />
        <property name="proxyFilters">
            <list>
                <ref bean="stat-filter" />
                <ref bean="log-filter" />
            </list>
        </property>
    </bean>

    <!-- 慢SQL記錄 -->
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        <!-- 開啓合併sql -->
        <property name="mergeSql" value="true" />
        <!-- 用來配置SQL慢的標準,執行時間超過slowSqlMillis的就是慢。slowSqlMillis的缺省值爲3000,也就是3秒。 -->
        <property name="slowSqlMillis" value="1000" />
        <property name="logSlowSql" value="true" />
    </bean>
    <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
        <!-- <property name="resultSetLogEnabled" value="false" /> -->
        <!-- <property name="statementExecutableSqlLogEnable" value="true" /> -->
    </bean>
#src/config/druid.properties
druid.driverClassName=com.mysql.cj.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
druid.userName=root
druid.userPassword=123456

druid.initialSize=0
druid.maxActive=20
druid.minIdle=1
druid.maxIdle=20
druid.maxWait=60000

druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000

druid.poolPreparedStatements=true
druid.maxOpenPreparedStatements=20
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false

druid.removeAbandoned=true
druid.removeAbandonedTimeout=1800
druid.logAbandoned=true

druid.filters=stat,log4j

在web.xml添加以下內容spring

<!-- druid鏈接池監控過濾器 -->
    <filter>
        <filter-name>DruidWebStatFilter</filter-name>
        <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
        <init-param>
            <param-name>exclusions</param-name> <!-- 常常須要排除一些沒必要要的url -->
            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>DruidWebStatFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 這個StatViewServlet的用途包括:提供監控信息展現的html頁面;提供監控信息的JSON API -->
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
        <!-- 白名單 -->
        <!-- <init-param>
            若是是限定指定的子網裏的全部ip均可以訪問,那就是ip/子網掩碼數。例如 192.168.1.120/24 就至關於192.168.1.*
            <param-name>allow</param-name>
            <param-value>127.0.0.1</param-value>
        </init-param> -->
                <!-- 若是不配置用戶名密碼,就是任何人均可以訪問了-->
        <init-param> 
            <!-- 用戶名 --> 
            <param-name>loginUsername</param-name> 
            <param-value>root</param-value> 
        </init-param> 
        <init-param> 
            <!-- 密碼 --> 
            <param-name>loginPassword</param-name> 
            <param-value>root</param-value> 
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>

SSM框架搭建之數據庫鏈接池(三)

輸入用戶名root、密碼root便可登陸
SSM框架搭建之數據庫鏈接池(三)sql

SSM框架搭建之數據庫鏈接池(三)

相關文章
相關標籤/搜索