
點贊再看,養成習慣
今天繼續Java的課題,兩天沒有做任何事情,過了個自在的周末,但是不知道為什么總是有點淡淡的憂桑,
之前游戲服務器的資料源使用的是阿里巴巴的Druid,今天就大概說說資料源,給個實體,
1、什么是資料庫連接池
就是一個容器持有多個資料庫連接,當程式需要操作資料庫的時候直接從池中取出連接,使用完之后再還回去,和執行緒池一個道理,
2、為什么需要連接池,好處是什么?
1、節省資源,如果每次訪問資料庫都創建新的連接,創建和銷毀都浪費系統資源
2、回應性更好,省去了創建的時間,回應性更好,
3、統一管理資料庫連接,避免因為業務的膨脹導致資料庫連接的無限增多,
4、便于監控,
3、都有哪些連接池方案
資料庫連接池的方案有不少,我接觸過的連接池方案有:
1、C3p0
這個連接池我很久之前看到過,但是當時自己還很弱小,并沒有很好的理解,現在用的也很少了,爺爺級的連接池,可以忽略
2、DBCP (Database Connection Pool)
這個名字很直白,資料庫連接池,從Tomcat 5.5開始,Tomcat 內置了DBCP的資料源實作,所以可以非常方便地配置DBCP資料源,
3、Druid
阿里開源的資料源,這個也是前公司使用的資料源,Druid能夠提供強大的監控和擴展功能,強項在于監控,
4、HiKariCP
號稱最快的資料庫連接池,springboot2.0 也已經把默認的資料源改為了HikariCP,強于性能,
4、連接池需要關注的引數
看下Druid 的資料庫連接池的配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="initialSize" value="5"/>
<property name="maxIdle" value="10"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="15"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="180"/>
<property name="maxWait" value="3000"/>
<property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
1、driverClassName 使用的JDBC驅動的完整有效的Java類名,如連接 mysql com.mysql.cj.jdbc.Driver
2、jdbcUrl 資料庫的連接,如 jdbc:mysql://127.0.0.1:3306/mydatabase
3、username 你懂的,資料庫的用戶名,如 root
4、password 太直白了 ,資料庫的用戶密碼,如 p123456
5、initialSize 連接池創建的時候,自動創建的資料庫連接數量,建議 10-50足夠
6、maxIdle 最大空閑連接:連接池中允許保持空閑狀態的最大連接數量,超過的空閑連接將被釋放,如果設定為負數表示不限制,建議設定和 與initialSize相同,減少釋放和創建的性能損耗,
7、minIdle 最小空閑連接:連接池中容許保持空閑狀態的最小連接數量,低于這個數量將創建新的連接,如果設定為0則不創建
8、maxActive 最大同時激活的連接數量,
9、maxWait 如果連接池中沒有可用的連接,最大的等待時間,超時則沒有可用連接,單位毫秒,設定-1時表示無限等待,建議設定為100毫秒
10、testxxx 在對連接進行操作時,是否檢測連接的有效性,如 testOnBorrow 在申請連接的時候會先檢測連接的有效性,執行validationQuery ,建議線上的把此配置設定為false,因為會影響性能,
11、validationQuery 檢查池中的連接是否仍可用的 SQL 陳述句,drui會連接到資料庫執行該SQL, 如果正常回傳,則表示連接可用,否則表示連接不可用,建議 select 1 from dual
4、怎么創建連接池,show me the code
4.1 pom.xml 加入依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
4.2 組態檔
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_user}" />
<property name="password" value="${jdbc_password}" />
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="stat" />
<!-- 配置初始化大小、最小、最大 -->
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="60000" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,并且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="20" />
</bean>
<!--配置jdbcTemplate,如果userDao沒有extends JdbcDaoSupport-->
<<bean id="jdbcTemplate" class="com.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userDao" class="com.caraway.dao.UserDao">
<property name="dataSource" ref="jdbcTemplate"/>
</bean>
4.3 呼叫
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
User user = new User();
user.setUsername("香菜");
user.setPassowrd("root");
userDao.saveUser(user);
}
5、總結
連接池和執行緒池的道理是一樣的,池化資源,降低生成和銷毀的損耗,提高系統的回應,
今天的重點還是要理解執行緒池的原理,并且記住大部分的配置引數,各個執行緒池雖然實作的細節不同,但是道理是相通的,掌握一個就掌握了所有,舉一反三,
好了,今天就到這吧,睡覺,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286279.html
標籤:java
上一篇:Java開發技術:Socket編程埠掃描小程式(完整原始碼)
下一篇:Java小專案另一個水果攤
