摘要:連接池的名稱指定由連接池所創(chuàng)建的連接的自動提交狀態(tài)。由連接池所創(chuàng)建的連接對數(shù)據(jù)庫的只讀屬性指定由連接池所創(chuàng)建的連接的事務(wù)級別。以毫秒表示的當連接池中沒有可用連接時等待可用連接返回的時間,超時則拋出異常,值為時無限期等待。
什么是連接池
什么是 Connection Pool -- 連接池呢?
我就不解釋了。不太清楚的看這篇文章 [生產(chǎn)級別Nodejs開發(fā)實踐-使用連接池](這篇文章的前半部分講述了什么是連接池)
Tomcat中的jdbc連接池它的英文文檔在:[The Tomcat JDBC Connection Pool]
Tomcat 不僅是非常受歡迎的 Servlet 容器,也是同時為我們提供了很多非常實用組件。 jdbc pool 就是其中一個非常實用且高效的 jdbc 連接池的實現(xiàn). Tomcat 官方大概列出了15條tomcat相對于其他連接池的優(yōu)點,我這里就不在詳細解釋了。
jdbc pool 組件存在于 tomcat8 release 版本的 lib/tomcat-jdbc.jar 包中。
我們所使用的到所有類都存在于 org.apache.tomcat.jdbc.pool 包名下。
依賴這里面我們以 mysql 作為數(shù)據(jù)庫來演示
添加 mysql-connector 依賴
xmlmysql mysql-connector-java 5.1.34
當然也少不了我們的 tomcat-jdbc
xmlorg.apache.tomcat tomcat-jdbc 8.0.15
要注意的是 tomcat-jdbc 依賴 tomcat-juli 包,這個包是在tomcat中的日志框架。幾乎被所有tomcat包所依賴。如果使用maven安裝依賴的話,就不用理會,因為是會被自動安裝的,如果多帶帶下載jar包的話,還是要下載這個jar包到CLASS_PATH。
用代碼來描述廢話到這兒,該上點代碼了。
怎么創(chuàng)建一個 jdbc 連接池池實例呢?
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)建連接池屬性對象 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 提供的的實現(xiàn),它實現(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)建很簡單。PoolProperties 類是管理著連接池屬性。我們配置連接池,都是通過這個類。
來看看這個類的屬性,以下有 50 個屬性,來控制著連接池和池中的連接的工作狀態(tài)和生命周期。接下來我會對常用的屬性進行解釋。
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的同學,我就不解釋了。
name
連接池的名稱
defaultAutoCommit
指定由連接池所創(chuàng)建的連接的自動提交(auto-commit)狀態(tài)。
DefaultReadOnly
由連接池所創(chuàng)建的連接對數(shù)據(jù)庫的只讀屬性
DefaultTransactionIsolation
指定由連接池所創(chuàng)建的連接的事務(wù)級別(TransactionIsolation)。可用值為下列之一:(詳情可見javadoc)
NONE, READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE
MinEvictableIdleTimeMillis
JmxEnabled
開啟jmx的管理功能
TestWhileIdle
會使用測試線程,測試池中連接是否能夠正常使用。
ValidationQuery
指定連接進入空閑狀態(tài)時是否經(jīng)過空閑對象驅(qū)逐進程的校驗(如果存在空閑對象驅(qū)逐進程)。如果校驗未通過,則該連接被連接池斷掉。
注意:要想值為true時該設(shè)置生效,則validationQuery參數(shù)必須為一個非空字串。
TestOnBorrow
指定連接被調(diào)用時是否經(jīng)過校驗。如果校驗未通過,則該連接被連接池斷掉,并由連接池嘗試調(diào)用另一個連接。
指定連接返回到池中時是否經(jīng)過校驗。
注意:要想值為true時該設(shè)置生效,則validationQuery參數(shù)必須為一個非空字串。
TestOnReturn
指定連接返回到池中時是否經(jīng)過校驗。
注意:要想值為true時該設(shè)置生效,則validationQuery參數(shù)必須為一個非空字串。
ValidationInterval
以毫秒為單位驗證時間間隔。
TimeBetweenEvictionRunsMillis
以毫秒表示的空閑對象驅(qū)逐進程由運行狀態(tài)進入休眠狀態(tài)的數(shù)值。值為非正數(shù)時表示不運行任何空閑對象驅(qū)逐進程。
MaxActive
池中 工作連接的最大個數(shù),此值為非正數(shù)是表述不限制
InitialSize
以毫秒表示的當連接池中沒有可用連接時等待可用連接返回的時間,超時則拋出異常,值為-1時無限期等待。
MaxWait
以毫秒表示的當連接池中沒有可用連接時等待可用連接返回的時間,超時則拋出異常,值為-1時無限期等待。
MinIdle
池中最小空閑連接數(shù),當連接數(shù)少于此值時,池會創(chuàng)建連接來補充到該值的數(shù)量
MaxIdle
池中允許的最大連接數(shù),值為非正數(shù)時表示不限制
NumTestsPerEvictionRun
連接池檢查每個空閑對象驅(qū)逐進程的對象數(shù)量(如果存在空閑對象驅(qū)逐進程)
MinEvictableIdleTimeMillis
以毫秒表示的連接被空閑對象驅(qū)逐進程驅(qū)逐前在池中保持空閑狀態(tài)的最小時間(如果存在空閑對象驅(qū)逐進程)。
LogAbandoned
當清除無效連接時是否在日志中記錄清除信息的標志。 記錄無效的語句和連接,并附加每個連接開啟或新建一個語句的系統(tǒng)開銷。如果你啟用了“removeAbandoned”,可能會導致被設(shè)為無效的連接被連接池回收。
這個機制將會在滿足下列兩個條件時啟動:(getNumIdle() < 2) 和 (getNumActive() > getMaxActive() - 3)
例如:假設(shè)maxActive=20,而當前已經(jīng)擁有18個活動連接,1個空閑連接,“removeAbandoned”機制將會啟動。 但是只有在活動連接沒有使用的時長超過“removeAbandonedTimeout”(默認為300秒)的連接被清除。在遍歷結(jié)果集時,所使用的連接不會被標為活動連接。
RemoveAbandoned
是否清除已經(jīng)超過“removeAbandonedTimout”設(shè)置的無效連接。
如果值為“true”則超過“removeAbandonedTimout”設(shè)置的無效連接將會被清除。設(shè)置此屬性可以從那些沒有合適關(guān)閉連接的程序中恢復數(shù)據(jù)庫的連接。
記錄無效的語句和連接,并附加每個連接開啟或新建一個語句的系統(tǒng)開銷。
RemoveAbandonedTimeout
以秒表示的清除無效連接的時限。
JdbcInterceptors
設(shè)置 tomcat jdbc 連接池的攔截器。
內(nèi)置的攔截器: org.apache.tomcat.jdbc.pool.interceptor.ConnectionState
追蹤自動提交、只讀狀態(tài)、catalog和事務(wù)隔離等級等狀態(tài)
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer
追蹤打開的statement,當連接被歸還時關(guān)閉它們.
多個攔截器用;分割,例如:
javapoolProps.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
dataSourceJNDI
指定一個 jndi 作為數(shù)據(jù)源
accessToUnderlyingConnectionAllowed
以上屬性當你我無法理解的時候,最好保持默認值。
以下待續(xù)。。。
xml 配置 (Use in tomcat) 高級使用 (Advanced usage) 使用增強功能 (Enhanced) 攔截器 (Interceptor) 如何編譯 (Build)tomcat源碼svn倉庫
本文是筆者翻閱tomcat官網(wǎng)jdbc-pool專欄,并將內(nèi)容以筆者自己的語言重新組織,可以直接點擊[tomcat-jdbc]查看官網(wǎng)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64226.html
摘要:常見問題解決編譯錯誤問題日志編譯錯誤編譯提示等日志錯誤解決檢查是否安裝插件安裝安裝運行錯誤問題錯誤不能連接解決檢查服務(wù)是否啟動檢查地址和端口號未知數(shù)據(jù)庫解決檢查是否新建數(shù)據(jù)庫默認的數(shù)據(jù)庫為,可在不同環(huán)境的配置文件中更改例如中 spring-boot-plus 常見問題解決 FAQ 編譯錯誤問題 log日志編譯錯誤 編譯提示log.info等日志錯誤 解決 檢查是否安裝lombok插件...
閱讀 1432·2021-11-25 09:43
閱讀 2029·2021-07-26 23:38
閱讀 741·2019-08-30 15:53
閱讀 2281·2019-08-30 15:43
閱讀 1169·2019-08-29 18:40
閱讀 1970·2019-08-26 13:28
閱讀 1975·2019-08-23 18:20
閱讀 544·2019-08-23 15:07