配置高併發jdbc連線池
簡單的MySQL連線池
- <Resourcetype="javax.sql.DataSource"
- name="jdbc/TestDB"
- factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/mysql"
-
username="mysql_user"
- password="mypassword123"
- />
當tomcat讀到type="javax.sql.DataSource"屬性時會自動重新安裝DBCP,除非你指定不同的factory。factory object 本身就是建立和配置連線池的。
在Apache Tomcat中有兩種方式配置 Resource elements
配置全域性連線池
編輯conf/server.xml
-
<
- <Resourcetype="javax.sql.DataSource"
- name="jdbc/TestDB"
- factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/mysql"
-
username="mysql_user"
- password="mypassword123"
- />
- </GlobalNamingResources>
然後你需要建立一個ResourceLink element使這個連線池對於web應用是可用的。如果你想要用同一個名字讓連線池對於所有的應用有效,最簡單的方法就是編輯conf/context.xml檔案
- <Context>
- <ResourceLinktype="javax.sql.DataSource"
- name="jdbc/LocalTestDB"
- global="jdbc/TestDB"
- />
- <Context>
注意,如果你不想要全域性的連線池,可以從server.xml移除Resource element到你的web應用的context.xml 檔案。
然後從剛配置好的連線池中獲得連線,簡單java程式碼:
- Context initContext = new InitialContext();
- Context envContext = (Context)initContext.lookup("java:/comp/env");
- DataSource datasource = (DataSource)envContext.lookup("jdbc/LocalTestDB");
- Connection con = datasource.getConnection();
使用java很簡單
還可以使用Java syntax
- DataSource ds = new DataSource();
- ds.setDriverClassName("com.mysql.jdbc.Driver");
- ds.setUrl("jdbc:mysql://localhost:3306/mysql");
- ds.setUsername("root");
- ds.setPassword("password");
- PoolProperties pp = new PoolProperties();
- pp.setDriverClassName("com.mysql.jdbc.Driver");
- pp.setUrl("jdbc:mysql://localhost:3306/mysql");
- pp.setUsername("root");
- pp.setPassword("password");
- DataSource ds = new DataSource(pp);
設定連線池
我們將使用下面這些屬性設定連線池
- initialSize
- maxActive
- maxIdle
- minIdle
去了解這些屬性是很重要的,它們看起來很明顯但又有一些神祕
- <Resourcetype="javax.sql.DataSource"
- name="jdbc/TestDB"
- factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/mysql"
- username="mysql_user"
- password="mypassword123"
- initialSize="10"
- maxActive="100"
- maxIdle="50"
- minIdle="10"
- />
initialSize=10 設定連線池建立時連線的數目
- 當連線池定義在GlobalNamingResources中,連線池在Tomcat啟動時創鍵
- 當連線池定義在Context中,連線池在第一次查詢JNDI時建立
maxActive=100 連線資料庫的最大連線數。這個屬性用來限制連線池中能夠開啟連線的數量,可以方便資料庫做連線容量規劃。
minIdle=10 連線池中存在的最小連線數目。連線池中連線數目可以變很少,如果使用了maxAge屬性,有些空閒的連線會被關閉因為離它最近一次連線的時間過去太久了。但是,我們看到的開啟的連線不會少於minIdle。
maxIdle屬性有一點麻煩。它的不同的行為取決於是否使用了pool sweeper。pool sweeper是一個可以在連線池正在使用的時候測試空閒連線和重置連線池大小的後臺執行緒。還負責檢測連線洩露。 pool sweeper 通過如下方式定義的:
- public boolean isPoolSweeperEnabled() {
- boolean timer = getTimeBetweenEvictionRunsMillis()>0;
- boolean result = timer && (isRemoveAbandoned() && getRemoveAbandonedTimeout()>0);
- result = result || (timer && getSuspectTimeout()>0);
- result = result || (timer && isTestWhileIdle() && getValidationQuery()!=null);
- return result;
- }
sweeper每timeBetweenEvictionRunsMillis milliseconds執行一次。
maxIdle定義如下
- Pool sweeper關閉,如果空閒連線池大於maxIdle,返回的連線將被關閉。
- Pool sweeper開啟,空閒的連線數可以超過maxIdle,但如果連線空閒的時間已經超過minEvictableIdleTimeMillis,能縮小到minIdle。聽起來很奇怪連線池為什麼不關閉連線當空閒連線數量大於maxIdle。想想下面的情況:
- 100個執行緒處理100個併發請求
- 在一個請求中每個執行緒請求一個連線3次
在這種場景下,如果我們設定maxIdle=50,那麼我們會關閉和開啟50*3的連線數。這樣增加了資料庫的負重並且減慢了應用的速度。當達到連線高峰時,我們希望能夠充分利用連線池中的所有連線。因此,我們強烈希望開啟pool sweeper 。我們將在下一個部分探討具體的事項。我們在這裡額外說明maxAge這個屬性。maxAge定義連線能夠開啟或者存在的時間,單位為毫秒。當一個連線返回到了連線池,如果這個連線已經使用過,並且距離它第一次被使用的時間大於maxAge時,這個連線會被關閉。
正如我們所看到的 isPoolSweeper演算法實現,sweeper 將會被開啟,當以下任一條件滿足時
- timeBetweenEvictionRunsMillis>0 AND removeAbandoned=true ANDremoveAbandonedTimeout>0
- timeBetweenEvictionRunsMillis>0 AND suspectTimeout>0
- timeBetweenEvictionRunsMillis>0 AND testWhileIdle=true AND validationQuery!=null
As of version 1.0.9 the following condition has been added
- timeBetweenEvictionRunsMillis>0 AND minEvictableIdleTimeMillis>0
(timer && getMinEvictableIdleTimeMillis()>0);
因此設定最理想的連線池,我們最好修改我們的配置滿足這些條件
- <Resourcetype="javax.sql.DataSource"
- name="jdbc/TestDB"
- factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
- driverClassName="com.mysql.jdbc.Driver"
- url="jdbc:mysql://localhost:3306/mysql"
- username="mysql_user"
- password="mypassword123"
- initialSize="10"
- maxActive="100"
- maxIdle="50"
- minIdle="10"
- suspectTimeout="60"
- timeBetweenEvictionRunsMillis="30000"
-
相關推薦
配置高併發jdbc連線池
簡單的MySQL連線池 <Resourcetype="javax.sql.DataSource" name="jdbc/TestDB" factory="org.apache.tomcat
Tomcat使用執行緒池配置高併發連線
1:配置executor屬性 開啟/conf/server.xml檔案,在Connector之前配置一個執行緒池: <Executor name="tomcatThreadPool" namePrefix="tomcatThreadPool-" max
tomcat配置jdbc連線池
1.為什麼要使用jdbc連線池呢 使用jdbc連線資料庫時,drivermanager得到資料庫連線物件需要與資料庫進行多次認證,影響到了應用系統的效能,那麼我們應當儘量減少不停建立新的
quartz 2.2.1 jdbc 連線池引數配置
線上資料庫出現mysql 8小時異常.需要增加如下配置: org.quartz.dataSource.QRTZ_DS.idleConnectionValidationSeconds=60 org.quartz.dataSource.QRTZ_DS.valida
Spring整合jdbc-連線池&JDBC模板&Dao配置到spring容器_
Spring整合jdbc-連線池&JDBC模板&Dao配置到spring容器_ 一、導包 二、建立資料庫 三、寫好類 3.1 使用者類 package cn.itheima; public class User { private Integ
spring jdbc連線池的配置
ORACLE <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassN
JDBC連線池技術(c3p0)配置警告問題
學習JDBC技術時,發現老提示 Tue Jan 10 20:47:11 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended
自定義資料結構設計JDBC連線池提高效能
// 後面貼上原始碼 之前寫一個小工具,發現了一個問題,發現部署到雲端計算上面,由於需要操作其他環境的資料庫,發現獲取66 175環境的獲取連線非常緩慢。 通過列印日誌,然後部署到伺服器,發現獲取175環境的資料庫連線池居然要6s?? 獲取66環境需
JDBC連線池BoneCP
public class ExampleDataSource { public static void main(String[] args) { Connection connection = null; try
jdbc連線池c3p0連線
public class DataSource { private static DataSource datasource; private ComboPooledDataSource cpds; private DataSource() throws IOExcept
Mybatis配置C3p0 和Druid連線池
普通java工程配置Mybatis 連線池 整體結構 匯入jar 包: 連結:https://pan.baidu.com/s/1aEpDPO9xRK1_shVsUpOEZA 提取碼:16nf Mybatis 配置檔案: <?xml version="
java配置多資料來源多連線池的工具類,這裡是mysql和mongoDB
public class DBManager { private static final String PREFIX="jdbc:apache:commons:dbcp:"; private static Log log =LogFactory.getLog(DBManager.clas
jdbc連線池實現
2、連線池實現 下面給出連線池類和連線池管理類的主要屬性及所要實現的基本介面: public class DBConnectionPool implements TimerListener{ private int checkedOut;//已被分配出去的連線數 private ArrayLis
【設計模式】之物件池模式--JDBC連線池簡單實現案例
文章目錄 物件池設計模式 物件池設計模式的目標 問題 討論 結構 示例 核驗單 經驗法則 連線池模式示例程式碼 ObjectPool.java
JDBC-連線池之裝飾者和動態代理
前言 通過裝飾者模式來定義連線池 定義Connection實現 定義DataSource實現的實現 通過動態代理來定義連線池
five, mySQL ,JDBC 連線池
JDBC連線池 一 preparedStatement 1.1回顧上一篇的登入案例 我可以不輸入密碼就可以登入 Select * from user where username=’tom’#’and password=’’; 輸入引數與字串連線,傳送給資料
spark的JDBC連線池(Scala版)
一個Scala版的連線池,並在使用Spark Streaming進行Word Count時,把每批資料都存到mySql中 import java.sql.{Connection, DriverManager} import java.util object J
idea配置阿里Druid資料連線池在SSM框架中使用
阿里Druid資料連線池在SSM框架中的配置使用 一、Druid資料連線池簡介 Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 效能好,同時自帶監控頁面,可以實時監控應用的連線池情況以及其中效能差的sql,方便我們找出應用中連線池方面的問題。
Spring學習(四)Jdbc連線池交個spring管理和事務操作
一、連線池的配置交給Spring管理 1,新增jar包 2,spring的jdbc連線池配置 <!-- 配置連線池 --> <bean id="dataSource" class="org.spring
ngnix配置高併發
原文章地址:https://blog.csdn.net/xqsy2008/article/details/72677373 一、一般來說nginx 配置檔案中對優化比較有作用的為以下幾項: 1. worker_processes 8; nginx 程序數,建議按照cpu 數目