在項目中經常會需要連接數據庫,可以使用的數據庫有很多,平時我們還用連接池來管理數據庫,現在學習了spring,我們知道了,spring的核心功能就是對象創建依賴注入
而我們在使用連接池時,連接對象也是通過DataSource接口獲取的,那么怎樣使用spring來注入數據庫連接信息呢?
學習了spring之后,我們可以將數據庫連接對象Connection的創建和關閉交給spring來管理
在spring中默認提供了很多種數據庫連接
1.DriverMangerDataSource spring自帶數據源
2.DBCP數據源
3.C3P0數據源
4.JNDI數據源
這四種都是spring默認的數據庫連接,不過我們平時使用的比較多的還是阿里的druid連接池
下面依次介紹這幾種數據源
為了方便我們使用.properties文件來配置連接池信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.username=root
jdbc.password=123456
1.DriverMangerDataSource
這是spring自帶的數據源,它與之前我們使用jdbc創建連接對象時使用的DriverManger一樣,只能創建一個對象,不支持連接池
2.DBCP數據源
dbcp數據源依賴兩個jar包:
<!--配置dbcp連接池--> <!--BasicDataSource提供了close()方法關閉數據源,所以必須設定destroy-method=”close”屬性, 以便Spring容器關閉時,數據源能夠正常關閉。--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--設置連接池屬性--> <!--設置初始連接數--> <property name="initialSize" value="10"/> <!--最大連接數--> <property name="maxActive" value="15"/> <!--maxActive:最大連接數據庫連接數,設置為0時,表示沒有限制;--> <property name="maxWait" value="60000"/> <!--defaultAutoCommit:設置從數據源中返回的連接是否采用自動提交機制,默認值為 true;--> <property name="defaultAutoCommit" value="true"/> <!--defaultReadOnly:設置數據源是否僅能執行只讀操作, 默認值為 false;--> <property name="defaultReadOnly" value="false"/> <!--maxIdle:最大等待連接中的數量,設置為0時,表示沒有限制;--> <property name="maxIdle" value="15"/> <!--validationQuery:用於驗證連接是否成功的查詢SQL語句,SQL語句必須至少要返回一行數據, 如你可以簡單地設置為:“select count(*) from emp”;--> <property name="validationQuery" value="select count(*) from emp"/> <!--removeAbandoned:是否自我中斷,默認是 false;--> <property name="removeAbandoned" value="false"/> <!--removeAbandonedTimeout:幾秒后數據連接會自動斷開,在removeAbandoned為true,提供該值;--> <!--<property name="removeAbandonedTimeout" value=""/>--> <!--logAbandoned:是否記錄中斷事件, 默認為 false;--> <property name="logAbandoned" value="false"/> </bean>
3.C3P0數據源
c3p0是一個開源的jdbc數據源實現項目,依賴於c3p0.jar
<bean id="dataSource" class="com.mchange.v2.c3p0.jboss.C3P0PooledDataSource" destroy-method="close"> <!--內部屬性與dbcp一樣--> </bean>
4.JNDI數據源
JNDI:Java命名和目錄的服務接口
作用:將一些資源(數據源),以目錄的形式提供給程序訪問
如果應用配置在高性能的應用服務器(如WebLogic或Websphere等)上,我們可能更希望使用應用服務器本身提供的數據源。應用服務器的數據源 使用JNDI開放調用者用,Spring為此專門提供引用JNDI資源的JndiObjectFactoryBean類。
<bean id="" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="資源路徑"/> </bean>
5.Druid連接池
druid可以做什么?
1.替換DBCP和C3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
2.可以監控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統計SQL的執行性能,這對於線上分析數據庫訪問性能有幫助。
3.數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiver和 DruidDataSource都支持PasswordCallback。
4.SQL執行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應的LogFilter,監控你應用的數據庫訪問情況。
5.擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機制,很方便編寫JDBC層的擴展插件。
<!-- 阿里 druid 數據庫連接池 --> < bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource"destroy-method = "close" > <!-- 數據庫基本信息配置 --> < property name = "url" value = "${url}" /> < property name = "username" value = "${username}" /> < property name = "password" value = "${password}" /> < property name = "driverClassName" value = "${driverClassName}" /> < property name = "filters" value = "${filters}" /> <!-- 最大並發連接數 --> < property name = "maxActive" value = "${maxActive}" /> <!-- 初始化連接數量 --> < property name = "initialSize" value = "${initialSize}" /> <!-- 配置獲取連接等待超時的時間 --> < property name = "maxWait" value = "${maxWait}" /> <!-- 最小空閑連接數 --> < property name = "minIdle" value = "${minIdle}" /> <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> < property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" /> <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 --> < property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" /> < property name = "validationQuery" value = "${validationQuery}" /> < property name = "testWhileIdle" value = "${testWhileIdle}" /> < property name = "testOnBorrow" value = "${testOnBorrow}" /> < property name = "testOnReturn" value = "${testOnReturn}" /> < property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" /> <!-- 打開 removeAbandoned 功能 --> < property name = "removeAbandoned" value = "${removeAbandoned}" /> <!-- 1800 秒,也就是 30 分鍾 --> < property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" /> <!-- 關閉 abanded 連接時輸出錯誤日志 --> < property name = "logAbandoned" value = "${logAbandoned}" /> </ bean >
平時練習可以只要前四條,用在項目上時建議全寫