亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Tomcat 中的 JDBC Pool

gaosboy / 496人閱讀

摘要:連接池的名稱指定由連接池所創(chuàng)建的連接的自動(dòng)提交狀態(tài)。由連接池所創(chuàng)建的連接對(duì)數(shù)據(jù)庫(kù)的只讀屬性指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別。以毫秒表示的當(dāng)連接池中沒有可用連接時(shí)等待可用連接返回的時(shí)間,超時(shí)則拋出異常,值為時(shí)無(wú)限期等待。

什么是連接池

什么是 Connection Pool -- 連接池呢?

我就不解釋了。不太清楚的看這篇文章 [生產(chǎn)級(jí)別Nodejs開發(fā)實(shí)踐-使用連接池](這篇文章的前半部分講述了什么是連接池)

Tomcat中的jdbc連接池

它的英文文檔在:[The Tomcat JDBC Connection Pool]

Tomcat 不僅是非常受歡迎的 Servlet 容器,也是同時(shí)為我們提供了很多非常實(shí)用組件。 jdbc pool 就是其中一個(gè)非常實(shí)用且高效的 jdbc 連接池的實(shí)現(xiàn). Tomcat 官方大概列出了15條tomcat相對(duì)于其他連接池的優(yōu)點(diǎn),我這里就不在詳細(xì)解釋了。

jdbc pool 組件存在于 tomcat8 release 版本的 lib/tomcat-jdbc.jar 包中。

我們所使用的到所有類都存在于 org.apache.tomcat.jdbc.pool 包名下。

依賴

這里面我們以 mysql 作為數(shù)據(jù)庫(kù)來(lái)演示
添加 mysql-connector 依賴

xml
    mysql
    mysql-connector-java
    5.1.34

當(dāng)然也少不了我們的 tomcat-jdbc

xml
    org.apache.tomcat
    tomcat-jdbc
    8.0.15

要注意的是 tomcat-jdbc 依賴 tomcat-juli 包,這個(gè)包是在tomcat中的日志框架。幾乎被所有tomcat包所依賴。如果使用maven安裝依賴的話,就不用理會(huì),因?yàn)槭菚?huì)被自動(dòng)安裝的,如果多帶帶下載jar包的話,還是要下載這個(gè)jar包到CLASS_PATH。

用代碼來(lái)描述

廢話到這兒,該上點(diǎn)代碼了。
怎么創(chuàng)建一個(gè) jdbc 連接池池實(shí)例呢?

javaimport java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;

// main
// 創(chuàng)建連接池屬性對(duì)象
PoolProperties poolProps = new PoolProperties();
poolProps.setUrl("jdbc:mysql://localhost:3306/test");

poolProps.setDriverClassName("com.mysql.jdbc.Driver");

poolProps.setUsername("root");

poolProps.setPassword("123456");

// 創(chuàng)建連接池, 使用了 tomcat 提供的的實(shí)現(xiàn),它實(shí)現(xiàn)了 javax.sql.DataSource 接口
DataSource dataSource = new DataSource();
// 為連接池設(shè)置屬性
dataSource.setPoolProperties(poolProps);

try (Connection conn = dataSource.getConnection()) {

    PreparedStatement state = conn.prepareStatement("select * from book");

    ResultSet result = state.executeQuery();

    StringBuilder stringBuilder = new StringBuilder();

    while ( result.next() ) {
            stringBuilder.append("[ id: "+ result.getInt("id") + ", ").append("name: " + result.getString("name") + ",	").append("publisher: " + result.getString("publisher")).append(" ]
");
    }

    System.out.println(stringBuilder.toString());

} 
catch (SQLException e) 
{
    e.printStackTrace();
}

通過代碼可以看出,連接池的創(chuàng)建很簡(jiǎn)單。PoolProperties 類是管理著連接池屬性。我們配置連接池,都是通過這個(gè)類。

來(lái)看看這個(gè)類的屬性,以下有 50 個(gè)屬性,來(lái)控制著連接池和池中的連接的工作狀態(tài)和生命周期。接下來(lái)我會(huì)對(duì)常用的屬性進(jìn)行解釋。

java    private volatile Properties dbProperties = new Properties();
    private volatile String url = null;
    private volatile String driverClassName = null;
    private volatile Boolean defaultAutoCommit = null;
    private volatile Boolean defaultReadOnly = null;
    private volatile int defaultTransactionIsolation = DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION;
    private volatile String defaultCatalog = null;
    private volatile String connectionProperties;
    private volatile int initialSize = 10;
    private volatile int maxActive = DEFAULT_MAX_ACTIVE;
    private volatile int maxIdle = maxActive;
    private volatile int minIdle = initialSize;
    private volatile int maxWait = 30000;
    private volatile String validationQuery;
    private volatile int validationQueryTimeout = -1;
    private volatile String validatorClassName;
    private volatile Validator validator;
    private volatile boolean testOnBorrow = false;
    private volatile boolean testOnReturn = false;
    private volatile boolean testWhileIdle = false;
    private volatile int timeBetweenEvictionRunsMillis = 5000;
    private volatile int numTestsPerEvictionRun;
    private volatile int minEvictableIdleTimeMillis = 60000;
    private volatile boolean accessToUnderlyingConnectionAllowed = true;
    private volatile boolean removeAbandoned = false;
    private volatile int removeAbandonedTimeout = 60;
    private volatile boolean logAbandoned = false;
    private volatile String name = "Tomcat Connection Pool["+(poolCounter.addAndGet(1))+"-"+System.identityHashCode(PoolProperties.class)+"]";
    private volatile String password;
    private volatile String username;
    private volatile long validationInterval = 30000;
    private volatile boolean jmxEnabled = true;
    private volatile String initSQL;
    private volatile boolean testOnConnect =false;
    private volatile String jdbcInterceptors=null;
    private volatile boolean fairQueue = true;
    private volatile boolean useEquals = true;
    private volatile int abandonWhenPercentageFull = 0;
    private volatile long maxAge = 0;
    private volatile boolean useLock = false;
    private volatile InterceptorDefinition[] interceptors = null;
    private volatile int suspectTimeout = 0;
    private volatile Object dataSource = null;
    private volatile String dataSourceJNDI = null;
    private volatile boolean alternateUsernameAllowed = false;
    private volatile boolean commitOnReturn = false;
    private volatile boolean rollbackOnReturn = false;
    private volatile boolean useDisposableConnectionFacade = true;
    private volatile boolean logValidationErrors = false;
    private volatile boolean propagateInterruptState = false;
    private volatile boolean ignoreExceptionOnPreLoad = false;

url, driverClassName, username, password 這些屬性知道jdbc的同學(xué),我就不解釋了。

name
連接池的名稱

defaultAutoCommit
指定由連接池所創(chuàng)建的連接的自動(dòng)提交(auto-commit)狀態(tài)。

DefaultReadOnly
由連接池所創(chuàng)建的連接對(duì)數(shù)據(jù)庫(kù)的只讀屬性

DefaultTransactionIsolation
指定由連接池所創(chuàng)建的連接的事務(wù)級(jí)別(TransactionIsolation)。可用值為下列之一:(詳情可見javadoc)
NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE

MinEvictableIdleTimeMillis

JmxEnabled
開啟jmx的管理功能

TestWhileIdle
會(huì)使用測(cè)試線程,測(cè)試池中連接是否能夠正常使用。

ValidationQuery
指定連接進(jìn)入空閑狀態(tài)時(shí)是否經(jīng)過空閑對(duì)象驅(qū)逐進(jìn)程的校驗(yàn)(如果存在空閑對(duì)象驅(qū)逐進(jìn)程)。如果校驗(yàn)未通過,則該連接被連接池?cái)嗟簟?br> 注意:要想值為true時(shí)該設(shè)置生效,則validationQuery參數(shù)必須為一個(gè)非空字串。

TestOnBorrow
指定連接被調(diào)用時(shí)是否經(jīng)過校驗(yàn)。如果校驗(yàn)未通過,則該連接被連接池?cái)嗟?,并由連接池嘗試調(diào)用另一個(gè)連接。
指定連接返回到池中時(shí)是否經(jīng)過校驗(yàn)。
注意:要想值為true時(shí)該設(shè)置生效,則validationQuery參數(shù)必須為一個(gè)非空字串。

TestOnReturn
指定連接返回到池中時(shí)是否經(jīng)過校驗(yàn)。
注意:要想值為true時(shí)該設(shè)置生效,則validationQuery參數(shù)必須為一個(gè)非空字串。

ValidationInterval
以毫秒為單位驗(yàn)證時(shí)間間隔。

TimeBetweenEvictionRunsMillis
以毫秒表示的空閑對(duì)象驅(qū)逐進(jìn)程由運(yùn)行狀態(tài)進(jìn)入休眠狀態(tài)的數(shù)值。值為非正數(shù)時(shí)表示不運(yùn)行任何空閑對(duì)象驅(qū)逐進(jìn)程。

MaxActive
池中 工作連接的最大個(gè)數(shù),此值為非正數(shù)是表述不限制

InitialSize
以毫秒表示的當(dāng)連接池中沒有可用連接時(shí)等待可用連接返回的時(shí)間,超時(shí)則拋出異常,值為-1時(shí)無(wú)限期等待。

MaxWait
以毫秒表示的當(dāng)連接池中沒有可用連接時(shí)等待可用連接返回的時(shí)間,超時(shí)則拋出異常,值為-1時(shí)無(wú)限期等待。

MinIdle
池中最小空閑連接數(shù),當(dāng)連接數(shù)少于此值時(shí),池會(huì)創(chuàng)建連接來(lái)補(bǔ)充到該值的數(shù)量

MaxIdle
池中允許的最大連接數(shù),值為非正數(shù)時(shí)表示不限制

NumTestsPerEvictionRun
連接池檢查每個(gè)空閑對(duì)象驅(qū)逐進(jìn)程的對(duì)象數(shù)量(如果存在空閑對(duì)象驅(qū)逐進(jìn)程)

MinEvictableIdleTimeMillis
以毫秒表示的連接被空閑對(duì)象驅(qū)逐進(jìn)程驅(qū)逐前在池中保持空閑狀態(tài)的最小時(shí)間(如果存在空閑對(duì)象驅(qū)逐進(jìn)程)。

LogAbandoned
當(dāng)清除無(wú)效連接時(shí)是否在日志中記錄清除信息的標(biāo)志。 記錄無(wú)效的語(yǔ)句和連接,并附加每個(gè)連接開啟或新建一個(gè)語(yǔ)句的系統(tǒng)開銷。如果你啟用了“removeAbandoned”,可能會(huì)導(dǎo)致被設(shè)為無(wú)效的連接被連接池回收。
這個(gè)機(jī)制將會(huì)在滿足下列兩個(gè)條件時(shí)啟動(dòng):(getNumIdle() < 2) 和 (getNumActive() > getMaxActive() - 3)
例如:假設(shè)maxActive=20,而當(dāng)前已經(jīng)擁有18個(gè)活動(dòng)連接,1個(gè)空閑連接,“removeAbandoned”機(jī)制將會(huì)啟動(dòng)。 但是只有在活動(dòng)連接沒有使用的時(shí)長(zhǎng)超過“removeAbandonedTimeout”(默認(rèn)為300秒)的連接被清除。在遍歷結(jié)果集時(shí),所使用的連接不會(huì)被標(biāo)為活動(dòng)連接。

RemoveAbandoned
是否清除已經(jīng)超過“removeAbandonedTimout”設(shè)置的無(wú)效連接。
如果值為“true”則超過“removeAbandonedTimout”設(shè)置的無(wú)效連接將會(huì)被清除。設(shè)置此屬性可以從那些沒有合適關(guān)閉連接的程序中恢復(fù)數(shù)據(jù)庫(kù)的連接。
記錄無(wú)效的語(yǔ)句和連接,并附加每個(gè)連接開啟或新建一個(gè)語(yǔ)句的系統(tǒng)開銷。

RemoveAbandonedTimeout
以秒表示的清除無(wú)效連接的時(shí)限。

JdbcInterceptors
設(shè)置 tomcat jdbc 連接池的攔截器。
內(nèi)置的攔截器: org.apache.tomcat.jdbc.pool.interceptor.ConnectionState
追蹤自動(dòng)提交、只讀狀態(tài)、catalog和事務(wù)隔離等級(jí)等狀態(tài)

org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
追蹤打開的statement,當(dāng)連接被歸還時(shí)關(guān)閉它們.

多個(gè)攔截器用;分割,例如:

javapoolProps.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

dataSourceJNDI
指定一個(gè) jndi 作為數(shù)據(jù)源

accessToUnderlyingConnectionAllowed

以上屬性當(dāng)你我無(wú)法理解的時(shí)候,最好保持默認(rèn)值。

以下待續(xù)。。。

xml 配置 (Use in tomcat) 高級(jí)使用 (Advanced usage) 使用增強(qiáng)功能 (Enhanced) 攔截器 (Interceptor) 如何編譯 (Build)

tomcat源碼svn倉(cāng)庫(kù)

本文是筆者翻閱tomcat官網(wǎng)jdbc-pool專欄,并將內(nèi)容以筆者自己的語(yǔ)言重新組織,可以直接點(diǎn)擊[tomcat-jdbc]查看官網(wǎng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64226.html

相關(guān)文章

  • spring-boot-plus 常見問題解決 FAQ(十二)

    摘要:常見問題解決編譯錯(cuò)誤問題日志編譯錯(cuò)誤編譯提示等日志錯(cuò)誤解決檢查是否安裝插件安裝安裝運(yùn)行錯(cuò)誤問題錯(cuò)誤不能連接解決檢查服務(wù)是否啟動(dòng)檢查地址和端口號(hào)未知數(shù)據(jù)庫(kù)解決檢查是否新建數(shù)據(jù)庫(kù)默認(rèn)的數(shù)據(jù)庫(kù)為,可在不同環(huán)境的配置文件中更改例如中 spring-boot-plus 常見問題解決 FAQ 編譯錯(cuò)誤問題 log日志編譯錯(cuò)誤 編譯提示log.info等日志錯(cuò)誤 解決 檢查是否安裝lombok插件...

    RayKr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<