深入理解Spring Boot數據源與連接池原理

  • ? Create by yster@foxmail.com 2018-8-2

一:開始

在使用Spring Boot數據源之前,我們一般會導入相關依賴。其中數據源核心依賴就是spring‐boot‐starter‐jdbc
如下

<dependency><groupId>org.springframework.boot</groupId> ???????????<artifactId>spring‐boot‐starter‐jdbc</artifactId> ???????????
</dependency> ???????
<dependency> ???????<groupId>mysql</groupId> ???????????<artifactId>mysql‐connector‐java</artifactId> ???????????<scope>runtime</scope> ???????????
</dependency> 

或者你使用的是JPA:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

查看JPA的依賴關系,如圖,其中已經包含JDBC。

1136672-20180802190956917-105926603.png

二:數據源

配置我們的Mysql數據庫連接信息:

spring:datasource:username:?rootpassword:?123456url:?jdbc:mysql://192.168.15.22:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=falsedriver‐class‐name:?com.mysql.jdbc.Driver

1.如何查看當前數據源?

編寫單元測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class RobotsApplicationTests {@AutowiredDataSource dataSource;@Testpublic void test(){System.out.println(dataSource.getClass());}}

查看打印:

class org.apache.tomcat.jdbc.pool.DataSource

總結

所以這段配置的效果就是,默認是用org.apache.tomcat.jdbc.pool.DataSource作為數據源,

且數據源的相關配置都在DataSourceProperties里面,如下:

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourcePropertiesimplements BeanClassLoaderAware, EnvironmentAware, InitializingBean {...private String name = "testdb";private String driverClassName;private String url;private String username;private String password;.....

2.自動配置原理

找到org.springframework.boot.autoconfigure.jdbc包下的DataSourceConfiguration

abstract class DataSourceConfiguration {@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)static class Tomcat extends DataSourceConfiguration {@Bean@ConfigurationProperties(prefix = "spring.datasource.tomcat")public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class);DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());String validationQuery = databaseDriver.getValidationQuery();if (validationQuery != null) {dataSource.setTestOnBorrow(true);dataSource.setValidationQuery(validationQuery);}return dataSource;}}......

以上就是自動配置代碼,原理大概是如果在classpath下存在org.apache.tomcat.jdbc.pool.DataSource.class類,并且在配置文件中指定spring.datasource.type的值為org.apache.tomcat.jdbc.pool.DataSource,或者不寫都會認為可以通過。只有通過才會進入這段配置代碼,才能注入DataSourceBean。

SpringBoot默認可以支持;

org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、

當然了,除了Tomcat數據源依賴自帶,其他都是缺少狀態。

3.自定義數據源

找到這個類的最下面,如果spring.datasource.type的值不屬于上面的幾個,那么可以自己定義數據源:

@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type")static class Generic {@Beanpublic DataSource dataSource(DataSourceProperties properties) {//使用DataSourceBuilder創建數據源,利用反射創建響應type的數據源,并且綁定相關屬性return properties.initializeDataSourceBuilder().build();}}

4.自動執行SQL語句

打開DataSourceAutoConfiguration自動配置類,在自動配置DataSource時會注入DataSourceInitializer,繼續打開該類,

1136672-20180802191043849-640111764.png

1136672-20180802191101982-80004440.png

我們發現該類有一個方法被注解@PostConstruct,這個注解用于需要在依賴注入完成后執行任何初始化的方法上。該初始化方法調用了runSchemaScripts();

1136672-20180802191115632-921036606.png

該方法的第一句就調用 getScripts()方法,獲取SQL腳本,如圖:

1136672-20180802191126343-785360673.png

所以我們想要初始化一些數據庫腳本,可以依照這個規則

schema‐*.sql、data‐*.sql

例如:

schema.sql,schema‐all.sql;

也可以使用如下指定具體位置

??schema: ???‐?classpath:department.sql

作用:

1)、runSchemaScripts();運行建表語句;

2)、runDataScripts();運行插入數據的sql語句;

5.操作數據庫

自動配置了JdbcTemplate操作數據庫,示例:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RobotsApplicationTests {@AutowiredJdbcTemplate jdbcTemplate;@Testpublic void test(){jdbcTemplate.queryForList("SELECT * FROM user");}}

三:連接池

為什么要把數據源和連接池放在一起講,因為當我們使用了如上所述的默認數據源之后,那么已默認啟用了數據庫鏈接池。 換句話說,你根本不需要關心連接池,它本來就有!

1.默認連接池規則

Tomcat7之前,Tomcat本質應用了DBCP連接池技術來實現的JDBC數據源,但在Tomcat7之后,Tomcat提供了新的JDBC連接池方案,作為DBCP的替換或備選方案,解決了許多之前使用DBCP的不利之處,并提高了性能。詳細請參考:http://wiki.jikexueyuan.com/project/tomcat/tomcat-jdbc-pool.html

Spring Boot為我們準備了最佳的數據庫連接池方案,只需要在屬性文件(例如application.properties)中配置需要的連接池參數即可。

在引入spring-boot-starter-jdbc后,內部包含了tomcat-jdbc包,里面有tomcat連接池.然后通過自動配置DataSourceAutoConfigurer創建DataSource對象。

SpringBoot創建默認DataSource時,規則如下:

  • 優先尋找創建Tomcat連接池

  • 如果沒有Tomcat連接池,會查找創建HikariCP

  • 如果沒有HikariCP連接池,會查找創建dbcp

  • 如果沒有dbcp連接池,會查找創建dbcp2

  • 可以使用spring.datasource.type屬性指定連接池類型

    spring.datasource.type=org.apache.commons.dbcp.BasicDataSource

2.控制連接池行為

在數據源那一講中,我們已經知道Spring data默認使用tomcat-jdbc時,所以直接在application.yml增加配置項spring.datasource.tomcat.*來控制鏈接池的行為。比如如下配置。

spring:datasource:url: jdbc:mysql://localhost:3306/jackieathome?useSSL=falseusername: rootpassword: mypassword# 6.x版本的MySQL JDBC驅動類為com.mysql.cj.jdbc.Driver# 5.X版本的MySQL JDBC驅動類為com.mysql.jdbc.Driverdriver-class-name: com.mysql.cj.jdbc.Drivertomcat:max-wait: 10000max-active: 30test-on-borrow: truemax-idle: 5

3.Tomcat常用屬性

屬性描述
defaultAutoCommit(布爾值)連接池所創建的連接默認自動提交狀態。如果未設置,則默認采用 JDBC 驅動的缺省值(如果未設置,則不會調用 setAutoCommit 方法)。
defaultReadOnly(布爾值)連接池所創建的連接默認只讀狀態。如果未設置,將不會調用 setReadOnly 方法。(有些驅動并不支持只讀模式,比如:informix)
defaultTransactionIsolation(字符串)連接池所創建的連接的默認事務隔離狀態。取值范圍為:(參考 javadoc) NONE``READ_COMMITTED``READ_UNCOMMITTED``REPEATABLE_READ``SERIALIZABLE 如果未設置該值,則不會調用任何方法,默認為 JDBC 驅動。
defaultCatalog(字符串)連接池所創建的連接的默認catalog。
driverClassName(字符串)所要使用的 JDBC 驅動的完全限定的 Java 類名。該驅動必須能從與 tomcat-jdbc.jar 同樣的類加載器訪問
username(字符串)傳入 JDBC 驅動以便建立連接的連接用戶名。注意,DataSource.getConnection(username,password)方法默認不會使用傳入該方法內的憑證,但會使用這里的配置信息。可參看 alternateUsernameAllowed 了解更多詳情。
password(字符串)傳入 JDBC 驅動以便建立連接的連接密碼。注意,DataSource.getConnection(username,password)方法默認不會使用傳入該方法內的憑證,但會使用這里的配置信息。可參看 alternateUsernameAllowed 了解更多詳情。
maxActive(整形值)池同時能分配的活躍連接的最大數目。默認為 100
maxIdle(整型值)池始終都應保留的連接的最大數目。默認為 maxActive:100。會周期性檢查空閑連接(如果啟用該功能),留滯時間超過 minEvictableIdleTimeMillis 的空閑連接將會被釋放。(請參考 testWhileIdle
minIdle(整型值)池始終都應保留的連接的最小數目。如果驗證查詢失敗,則連接池會縮減該值。默認值取自 initialSize:10(請參考 testWhileIdle)。
initialSize(整型值)連接器啟動時創建的初始連接數。默認為 10
maxWait(整型值)在拋出異常之前,連接池等待(沒有可用連接時)返回連接的最長時間,以毫秒計。默認為 30000(30 秒)
testOnBorrow(布爾值)默認值為 false。從池中借出對象之前,是否對其進行驗證。如果對象驗證失敗,將其從池中清除,再接著去借下一個。注意:為了讓 true 值生效,validationQuery參數必須為非空字符串。為了實現更高效的驗證,可以采用 validationInterval
testOnReturn(布爾值)默認值為 false。將對象返回池之前,是否對齊進行驗證。注意:為了讓 true 值生效,validationQuery參數必須為非空字符串。
testWhileIdle(布爾值)是否通過空閑對象清除者(如果存在的話)驗證對象。如果對象驗證失敗,則將其從池中清除。注意:為了讓 true 值生效,validationQuery 參數必須為非空字符串。該屬性默認值為 false,為了運行池的清除/測試線程,必須設置該值。(另請參閱 timeBetweenEvictionRunsMillis
validationQuery(字符串)在將池中連接返回給調用者之前,用于驗證這些連接的 SQL 查詢。如果指定該值,則該查詢不必返回任何數據,只是不拋出 SQLException 異常。默認為 null。實例值為:SELECT 1(MySQL) select 1 from dual(Oracle) SELECT 1(MySQL Server)。
validationQueryTimeout(整型值)連接驗證失敗前的超時時間(以秒計)。通過在執行 validationQuery 的語句上調用 java.sql.Statement.setQueryTimeout(seconds) 來實現。池本身并不會讓查詢超時,完全是由 JDBC 來強制實現。若該值小于或等于 0,則禁用該功能。默認為 -1
validatorClassName(字符串)實現 org.apache.tomcat.jdbc.pool.Validator接口并提供了一個無參(可能是隱式的)構造函數的類名。如果指定該值,將通過該類來創建一個 Validator 實例來驗證連接,代替任何驗證查詢。默認為 null,范例值為:com.mycompany.project.SimpleValidator
timeBetweenEvictionRunsMillis(整型值)空閑連接驗證/清除線程運行之間的休眠時間(以毫秒計)。不能低于 1 秒。該值決定了我們檢查空閑連接、廢棄連接的頻率,以及驗證空閑連接的頻率。默認為 5000(5 秒)
numTestsPerEvictionRun(整型值)Tomcat JDBC 連接池沒有用到這個屬性。
minEvictableIdleTimeMillis(整型值)在被確定應被清除之前,對象在池中保持空閑狀態的最短時間(以毫秒計)。默認為 60000(60 秒)
accessToUnderlyingConnectionAllowed(布爾值)沒有用到的屬性。可以在歸入池內的連接上調用 unwrap來訪問。參閱 javax.sql.DataSource 接口的相關介紹,或者通過反射調用 getConnection,或者將對象映射為 javax.sql.PooledConnection
removeAbandoned(布爾值)該值為標志(Flag)值,表示如果連接時間超出了 removeAbandonedTimeout,則將清除廢棄連接。如果該值被設置為 true,則如果連接時間大于 removeAbandonedTimeout,該連接會被認為是廢棄連接,應予以清除。若應用關閉連接失敗時,將該值設為 true 能夠恢復該應用的數據庫連接。另請參閱 logAbandoned。默認值為 false
removeAbandonedTimeout(整型值)在廢棄連接(仍在使用)可以被清除之前的超時秒數。默認為 60(60 秒)。應把該值設定為應用可能具有的運行時間最長的查詢。
logAbandoned(布爾值)標志能夠針對丟棄連接的應用代碼,進行堆棧跟蹤記錄。由于生成堆棧跟蹤,對廢棄連接的日志記錄會增加每一個借取連接的開銷。默認為 false
connectionProperties(字符串)在建立新連接時,發送給 JDBC 驅動的連接屬性。字符串格式必須為:[propertyName=property;]*。注意:user 與 password 屬性會顯式傳入,因此這里并不需要包括它們。默認為 null。
poolPreparedStatements(布爾值)未使用的屬性
maxOpenPreparedStatements(整型值)未使用的屬性

4.Tomcat JDBC 增強屬性

屬性描述
initSQL字符串值。當連接第一次創建時,運行的自定義查詢。默認值為 null
jdbcInterceptors字符串。繼承自類 org.apache.tomcat.jdbc.pool.JdbcInterceptor的子類類名列表,由分號分隔。關于格式及范例,可參見下文的配置 JDBC 攔截器。 這些攔截器將會插入到 java.sql.Connection 對象的操作隊列中。 預定義的攔截器有: org.apache.tomcat.jdbc.pool.interceptor``ConnectionState——記錄自動提交、只讀、catalog以及事務隔離級別等狀態。org.apache.tomcat.jdbc.pool.interceptor``StatementFinalizer——記錄打開的語句,并當連接返回池后關閉它們。 有關更多預定義攔截器的詳盡描述,可參閱JDBC 攔截器
validationInterval長整型值。為避免過度驗證而設定的頻率時間值(以秒計)。最多以這種頻率運行驗證。如果連接應該進行驗證,但卻沒能在此間隔時間內得到驗證,則會重新對其進行驗證。默認為 30000(30 秒)。
jmxEnabled布爾值。是否利用 JMX 注冊連接池。默認為 true
fairQueue布爾值。假如想用真正的 FIFO 方式公平對待 getConnection 調用,則取值為 true。對空閑連接列表將采用 org.apache.tomcat.jdbc.pool.FairBlockingQueue 實現。默認值為 true。如果想使用異步連接獲取功能,則必須使用該標志。 設置該標志可保證線程能夠按照連接抵達順序來接收連接。 在性能測試時,鎖及鎖等待的實現方式有很大差異。當 fairQueue=true 時,根據所運行的操作系統,存在一個決策過程。假如系統運行在 Linux 操作系統(屬性 os.name = linux)上,為了禁止這個 Linux 專有行為,但仍想使用公平隊列,那么只需在連接池類加載之前,將 org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true添加到系統屬性上。
abandonWhenPercentageFull整型值。除非使用中連接的數目超過 abandonWhenPercentageFull中定義的百分比,否則不會關閉并報告已廢棄的連接(因為超時)。取值范圍為 0-100。默認值為 0,意味著只要達到 removeAbandonedTimeout,就應關閉連接。
maxAge長整型值。連接保持時間(以毫秒計)。當連接要返回池中時,連接池會檢查是否達到 now - time-when-connected > maxAge 的條件,如果條件達成,則關閉該連接,不再將其返回池中。默認值為 0,意味著連接將保持開放狀態,在將連接返回池中時,不會執行任何年齡檢查。
useEquals布爾值。如果想讓 ProxyConnection 類使用 String.equals,則將該值設為 true;若想在對比方法名稱時使用 ==,則應將其設為 false。該屬性不能用于任何已添加的攔截器中,因為那些攔截器都是分別配置的。默認值為 true
suspectTimeout整型值。超時時間(以秒計)。默認值為 0。 類似于 removeAbandonedTimeout,但不會把連接當做廢棄連接從而有可能關閉連接。如果 logAbandoned 設為 true,它只會記錄下警告。如果該值小于或等于 0,則不會執行任何懷疑式檢查。如果超時值大于 0,而連接還沒有被廢棄,或者廢棄檢查被禁用時,才會執行懷疑式檢查。如果某個連接被懷疑到,則記錄下 WARN 信息并發送一個 JMX 通知。
rollbackOnReturn布爾值。如果 autoCommit==false,那么當連接返回池中時,池會在連接上調用回滾方法,從而終止事務。默認值為 false
commitOnReturn布爾值。如果 autoCommit==false,那么當連接返回池中時,池會在連接上調用提交方法,從而完成事務;如果 rollbackOnReturn==true,則忽略該屬性。默認值為 false
alternateUsernameAllowed布爾值。出于性能考慮,JDBC 連接池默認會忽略 DataSource.getConnection(username,password)調用,只返回之前池化的具有全局配置屬性 usernamepassword的連接。 但經過配置,連接池還可以允許使用不同的憑證來請求每一個連接。為了啟用這項在DataSource.getConnection(username,password)調用中描述的功能,只需將 alternateUsernameAllowed 設為 true。 如果你請求一個連接,憑證為 user 1/password 1,而連接之前使用的是 user 2/password 2 憑證,那么連接將被關閉,重新利用請求的憑證來開啟。按照這種方式,池的容量始終以全局級別管理,而不是限于模式(schema)級別。 默認值為 false。 該屬性作為一個改進方案,被添加到了 bug 50025 中。
dataSource(javax.sql.DataSource)將數據源注入連接池,從而使池利用數據源來獲取連接,而不是利用 java.sql.Driver接口來建立連接。它非常適于使用數據源(而非連接字符串)來池化 XA 連接或者已建立的連接時。默認值為 null
dataSourceJNDI字符串。在 JNDI 中查找的數據源的 JNDI 名稱,隨后將用于建立數據庫連接。參看 datasource 屬性的介紹。默認值為 null
useDisposableConnectionFacade布爾值。如果希望在連接上放上一個門面對象,從而使連接在關閉后無法重用,則要將值設為 true。這能防止線程繼續引用一個已被關閉的連接,并繼續在連接上查詢。默認值為 true
logValidationErrors布爾值。設為 true 時,能將驗證階段的錯誤記錄到日志文件中,錯誤會被記錄為 SEVERE。考慮到了向后兼容性,默認值為 false
propagateInterruptState布爾值。傳播已中斷的線程(還沒有清除中斷狀態)的中斷狀態。考慮到了向后兼容性,默認值為 false
ignoreExceptionOnPreLoad布爾值。在初始化池時,是否忽略連接創建錯誤。取值為 true時表示忽略;設為 false 時,拋出異常,從而宣告池初始化失敗。默認值為 false

轉載于:https://www.cnblogs.com/yueshutong/p/9409295.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Dapr 集成 Open Policy Agent 實現 接口的訪問控制

大型項目中基本都包含有復雜的訪問控制策略&#xff0c;特別是在一些多租戶場景中&#xff0c;例如Kubernetes中就支持RBAC&#xff0c;ABAC等多種授權類型。Dapr 的 中間件 Open Policy Agent 將Rego/OPA策略應用到傳入的Dapr HTTP請求中。Open Policy AgentOpen Policy Agent…

【Java】BigDecimal

一、前言 在使用Java&#xff0c;double 進行運算時&#xff0c;經常出現精度丟失的問題&#xff0c;總是在一個正確的結果左右偏0.0000**1。 特別在實際項目中&#xff0c;通過一個公式校驗該值是否大于0&#xff0c;如果大于0我們會做一件事情&#xff0c;小于0我們又處理其他…

PHP獲取當前頁面URL

//獲取頁面url function curPageURL() {$pageURL http;if (!empty($_SERVER[HTTPS])) {$pageURL . "s";}$pageURL . "://";if ($_SERVER["SERVER_PORT"] ! "80") {$pageURL . $_SERVER["SERVER_NAME"].":".$_SER…

【招聘(大連)】北森云計算 .NET 專場招聘

為了更好的實現戰略布局&#xff0c;逐步形成以三個產品研發中心&#xff08;北京、成都、大連&#xff09;為主&#xff0c;青島和南京為輔的產品研發團隊配置。北森云第三研發中心&#xff08;大連&#xff09;正式成立&#xff0c;目前大連的人選招聘正式開啟&#xff0c;歡…

PHP強制下載文件

//有時我們不想讓瀏覽器直接打開文件&#xff0c;如PDF文件&#xff0c;而是要直接下載文件&#xff0c;那么以下函數可以強制下載文件 //函數中使用了application/octet-stream頭類型。 function downloads($filename,$dir./) {$filepath $dir.$filename;if (!file_exists($f…

F5基于證書認證的客戶端登錄

1.生成密鑰RSA類型&#xff0c;密碼&#xff1a;123456保存為Openssl格式2.上傳客戶機SecureCRT生成的公鑰 Identity.pub到用戶home目錄下.ssh文件夾中cd .sshmv Identity.pub authorized_keys ##cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys3.更改F5 ssh配置文件tmsh…

C#多線程編程-必知必會

“發現問題的能力&#xff0c;運用技術解決問題的能力&#xff0c;是一個技術人成長的關鍵”圖片故事&#xff1a;洋姜的花&#xff0c;拍攝于2022年7月23日&#xff0c;地點&#xff1a;北京奧林匹克森林公園 &#xff0c;攝影師&#xff1a;劉先生概要&#xff1a;使用C#發起…

理解Go Interface

理解Go Interface1 概述Go語言中的接口很特別&#xff0c;而且提供了難以置信的一系列靈活性和抽象性。接口是一個自定義類型&#xff0c;它是一組方法的集合&#xff0c;要有方法為接口類型就被認為是該接口。從定義上來看&#xff0c;接口有兩個特點:接口本質是一種自定義類型…

『中級篇』Dockerfile詳解(17)

一般的&#xff0c;Dockerfile 分為四部分&#xff1a;基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。 ####官網學習 https://docs.docker.com/engine/reference/builder/#usage ####FROM 必須為第一個命令&#xff0c;指定基礎鏡像 FROM <image> FROM &…

洛谷 1165日志分析

題目描述 M 海運公司最近要對旗下倉庫的貨物進出情況進行統計。目前他們所擁有的唯一記錄就是一個記錄集裝箱進出情況的日志。該日志記錄了兩類操作&#xff1a;第一類操作為集裝箱入庫操作&#xff0c;以及該次入庫的集裝箱重量&#xff1b;第二類操作為集裝箱的出庫操作。這些…

KestrelServer詳解[1]:注冊監聽終結點(Endpoint)

具有跨平臺能力的KestrelServer是最重要的服務器類型。針對KestrelServer的設置均體現在KestrelServerOptions配置選項上&#xff0c;注冊的終結點是它承載的最重要的配置選項。這里所謂的終結點&#xff08;Endpoint&#xff09;與“路由”介紹的終結點不是一回事&#xff0c;…

php截取字符串,帶中文,多余的省略號代替

function subtext($text, $length) {if(mb_strlen($text, utf8) > $length) {return mb_substr($text, 0, $length, utf8)....;} else {return $text;}}$str 我們是family happy family; echo subtext($str,5); //我們是fa...

數據庫添加

<body><form action"herozhuce.php" method"post"> <div>賬號<input type"text" name"account"/></div> <div>密碼<input type"text" name"password"/></div> &…

快來加入阿里云大學【云學院】班級助理招募—機會稍縱即逝,錯過遙遙無期!...

2019獨角獸企業重金招聘Python工程師標準>>> 如果你對云計算、大數據、云安全、人工智能領域感興趣~ 如果你想從事與此相關的工作~~ 如果你又喜歡邊交流邊學習的方式~ 那么&#xff0c;加入我們吧&#xff01; 我們將為你提供一個廣闊的平臺&#xff0c;讓你接觸到云…

深入理解ajax系列第五篇——進度事件

前面的話 一般地&#xff0c;使用readystatechange事件探測HTTP請求的完成。XHR2規范草案定義了進度事件Progress Events規范&#xff0c;XMLHttpRequest對象在請求的不同階段觸發不同類型的事件&#xff0c;所以它不再需要檢査readyState屬性。這個草案定義了與客戶端服務器通…

對象(poco)深度克隆

提供深度克隆對象功能,基于編譯表達式實現&#xff0c;性能與原生代碼幾無差別&#xff0c;遠超 json/binary 序列化實現。1. 簡單示例class Person {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public DateTime Birth { get; s…

php將數字轉化為中文大寫人民幣格式

<?phpfunction cny($ns) {static $cnums array("零","壹","貳","叁","肆","伍","陸","柒","捌","玖"),$cnyunits array("圓","角","分&…

BZOJ1787 [Ahoi2008]Meet 緊急集合 LCA

歡迎訪問~原文出處——博客園-zhouzhendong 去博客園看該題解 題目傳送門 - BZOJ1787 題意概括 有一棵節點為n個(n≤500000)的樹。接下來m次詢問(m≤500000)&#xff0c;每次給出3個點 a,b,c &#xff0c;現在讓你求一個點 p &#xff0c;使得 dis(p,a) dis(p,b) dis(p,c) 最…

Linux之ACL權限控制

ACL權限控制主要目的是提供傳統的owner,group,other的read,wirte,execute權限之外的具體權限設置&#xff0c;可以針對單一用戶或組來設置特定的權限 設置ACL權限&#xff1a;setfacl查看ACL權限&#xff1a;getfacl 比如&#xff1a;某一目錄權限為 drwx------ 2 root root 40…

WIX、Squarespace、WordPress 三者的優劣分別是什么?

層出不窮的智能建站&#xff0c;模板建站&#xff0c;源碼建站&#xff0c;云建站&#xff0c;仿站&#xff0c;各種建站概念都拋灑于紅海之中。到底什么樣的網站適合自己&#xff0c;什么樣的網站值得我們去消費&#xff0c;什么樣的網站能長久&#xff0c;是個非常值得思考的…