Ⅰ spring中配置MySql數據源,怎樣配置資料庫信息
spring中配置數據源的幾種常見方式:
#mysql 資料庫配置(jdbc.properties)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/databaseName?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
1.使用spring自帶的數據源org.springframework.jdbc.datasource.DriverManagerDataSource;
方式一:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
p標記需要:xmlns:p="http://www.springframework.org/schema/p"
DriverManagerDataSource源碼實現:
public class DriverManagerDataSource extends AbstractDriverBasedDataSource {
public DriverManagerDataSource() {
}
public DriverManagerDataSource(String url) {
}
public DriverManagerDataSource(String url, String username, String password) {
}
public DriverManagerDataSource(String url, Properties conProps) {
}
public void setDriverClassName(String driverClassName) {
}
protected Connection getConnectionFromDriver(Properties props) throws SQLException {
}
protected Connection (String url, Properties props) throws SQLException {
}
}
Ⅱ spring怎麼連接mysql
1、屬性配置文件(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver12341234
如果使用JNDI,則可以替代 spring.datasource 的 url、username、password,如:
spring.datasource.jndi-name=java:tomcat/datasources/example 11
值得一提的是,無論是Spring Boot默認的DataSource配置還是你自己的DataSource bean,都會引用到外部屬性文件中的屬性配置。所以假設你自定義的DataSource bean,你可以在定義bean時設置屬性,也可以在屬性文件中,以「spring.datasource
Ⅲ spring中mysql多數據源切換 怎麼配置(配置文件)
由於項目需要,需要為我的springMCV項目配置mysql+oracle兩種數據源,運行時進行切換。由於技術水平有限,斷斷續續用了一周時間解決了這個小問題(比較懶),特來發篇博客,為以後需要的朋友提供參考。
首先,這個項目的多數據源配置建立在mysql已經搭建完成的基礎上,這部分的源代碼github上都有,網上也有不少教程,我就不作說明了,直接講如何配置oracle。
oracle我用的版本是11g,具體版本是11.2.0.1.0。下載及安裝,建表過程省略(詳情請網路,建表推薦用pl/sql)
我的項目中,資料庫的賬號密碼都是通過properties文件配置的,首先你需要配置好spring項目中的oracle的url,賬號以及密碼。
dataSource2.driver=oracle.jdbc.driver.OracleDriver
dataSource2.url=jdbc\:oracle\:thin\:@localhost\:1521\:orcl
dataSource2.username=sys as sysdba
dataSource2.password=a123456
driver表示驅動名,username表示登錄oracle的用戶名,這里需要注意的是oracle非常注重資料庫管理員的許可權,因此在登錄時需要指明登錄者的身份,pl/sql以及navicat會讓你選擇以什麼角色登錄,而在spring項目中訪問時,直接輸入 用戶名 + as sysdba 的形式作為用戶名,密碼就是先前安裝oracle時設置的密碼。
接下來配置spring的配置文件,來配置2個數據源,我主要是參考了網上的文章,大致原理是為不同數據源配置不同的sqlSessionFactory以及sqlSessionTemplate,為項目編寫工具類,通過設置不同的鍵值切換數據源。
Ⅳ SpringBoot項目中實現MySQL讀寫分離
但我們仔細觀察我們會發現,當我們的項目都是用的單體資料庫時,那麼就可能會存在如下問題:
為了解決上述提到的兩個問題,我們可以准備兩 (多) 台MySQL,一台主( Master )伺服器,一台從( Slave )伺服器,主庫的 數據變更 (寫、更新、刪除這些操作) ,需要 同步 到從庫中 (主從復制) 。而用戶在訪問我們項目時,如果是 寫操作 (insert、update、delete),則直接操作 主庫 ;如果是 讀操作 (select) ,則直接操作從庫,這種結構就是 讀寫分離 啦。
在這種讀寫分離的結構中,從庫是可以有多個的
MySQL主從復制是一個 非同步 的復制過程,底層是基於Mysql資料庫自帶的 二進制日誌 功能。就是一台或多台MySQL資料庫(slave,即 從庫 )從另一台MySQL資料庫(master,即 主庫 )進行日誌的復制,然後再解析日誌並應用到自身,最終實現 從庫 的數據和 主庫 的數據保持一致。MySQL主從復制是 MySQL資料庫自帶功能,無需藉助第三方工具。
二進制日誌(BINLOG)記錄了所有的 DDL(數據定義語言)語句和 DML(數據操縱語言)語句,但是不包括數據查詢語句。此日誌對於災難時的數據恢復起著極其重要的作用,MySQL的主從復制, 就是通過該binlog實現的。默認MySQL是未開啟該日誌的。
在環境搭建之前,我們需要准備好兩台伺服器,如果生活富裕使用的是兩台雲伺服器的時候記得要開放安全組,即防火牆;如果是比狗子我生活好點但也是用的虛擬機的話,記得別分這么多內存啟動藍屏了(別問怎麼知道的)
這里就不給大家展示資料庫的安裝和防火牆的操作了,這個我感覺網上好多資源都能夠滿足遇到的問題,在搭建主從庫的時候有在網上見到過說MySQL版本要一致的,我也沒太留意直接就在之前的MySQL上操作了,大家可以自己去驗證一下。
伺服器:192.168.150.100(別試了黑不了的,這是虛擬機的ip)
這里有三個方法都能重啟MySQL,最簡單的無疑就是一關一開:
登錄進去MySQL之後才能夠執行下面的命令,因為這是SQL命令,linux不認識這玩意是啥。
這個時候還 不用退出MySQL ,因為下面的命令還是SQL命令,執行下面的SQL,可以拿到我們後面需要的兩個重要參數。
執行完這一句SQL之後,==不要再操作主庫!不要再操作主庫!不要再操作主庫!==重要的事情說三遍,因為再操作主庫之後可能會導致紅框中的 兩個屬性值會發生變化 ,後面如果發生了錯誤可能就和這里有那麼兩毛錢關系了。
伺服器:192.168.150.101(別試了黑不了的,這也是虛擬機的ip)
這里要注意server-id和主庫以及其他從庫都不能相同,否則後面將會配置不成功。
這里有三個方法都能重啟MySQL,最簡單的無疑就是一關一開:
登錄進去MySQL之後才能夠執行下面的命令,因為這是SQL命令
參數說明:
這個時候還 不用退出MySQL ,因為下面的命令還是SQL命令,執行下面的SQL,可以看到從庫的狀態信息。通過狀態信息中的 Slave_IO_running 和 Slave_SQL_running 可以看出主從同步是否就緒,如果這兩個參數全為 Yes ,表示主從同步已經配置完成。
這可能是由於linux 是復制出來的,MySQL中還有一個 server_uuid 是一樣的,我們也需要修改。 vim /var/lib/mysql/auto.cnf
這應該就是各位大牛設置server_id的時候不小心設置相同的id了,修改過來就行,步驟在上面的配置中。
這是狗子在操作過程中搞出來的一個錯誤……
出錯的原因是在主庫中刪除了用戶信息,但是在從庫中同步的時候失敗導致同步停止,下面記錄自己的操作(是在進入MySQL的操作且是從庫)。
在資料庫中操作時,一定要注意當前所在的資料庫是哪個,作為一個良好的實踐:在SQL語句前加 USE dbname 。
Sharding-JDBC定位為 輕量級Java框架 ,在Java的JDBC層提供的額外服務。 它使用客戶端直連資料庫,以 jar包 形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動, 完全兼容JDBC和各種ORM框架 。
使用Sharding-JDBC可以在程序中輕松的實現資料庫 讀寫分離 。
Sharding-JDBC具有以下幾個特點:
下面我們將用ShardingJDBC在項目中實現MySQL的讀寫分離。
在pom.xml文件中導入ShardingJDBC的依賴坐標
在application.yml中增加數據源的配置
這時我們就可以對我們項目中的配置進行一個測試,下面分別調用一個更新介面和一個查詢介面,通過查看日誌中記錄的數據源來判斷是否能夠按照我們預料中的跑。
搞定!!!程序正常按照我們預期的成功跑起來了,成功藉助ShardingJDBC在我們項目中實現了資料庫的讀寫分離。
Ⅳ spring使用mysql默認隔離機制是什麼;oracle默認隔離機制是什麼
先來總體說一下我對這個問題的理解,用一句話概括:
資料庫是可以控制事務的傳播和隔離級別的,Spring在之上又進一步進行了封裝,可以在不同的項目、不同的操作中再次對事務的傳播行為和隔離級別進行策略控制。
注意:Spring不僅可以控制事務傳播行為(PROPAGATION_REQUIRED等),還可以控制事務隔離級別(ISOLATION_READ_UNCOMMITTED等)。
(以下是個人理解,如果有瑕疵請及時指正)
下面我具體解釋一下:
為了大家能夠更好的理解,先來明確幾個知識點:
事務的傳播行為:簡單來說就是事務是手動提交還是自動提交,事務什麼時候開始,什麼時候提交。
事務的隔離級別:簡單來說,就四個,提交讀,提交讀,重復讀,序列化讀。
首先我來描述一下,資料庫(mysql)層面上對於事務傳播行為和隔離級別的配置和實驗方法:
資料庫層面(採用命令行):其實mySql命令行很簡單,希望實驗操作一下:
//連接資料庫,我這里是本地,後面是用戶名密碼,不要打分號,如果指令不行,配置下環境變數,網上有很多。
1. cmd中執行:mysql -hlocalhost -uroot -pmysql
//查看本地資料庫事務傳播行為是手動提交(0),還是自動提交(1)。
2.select @@autocommit;
//如果是0,希望設置為手動提交,這里其實是設置本對話的autocommit,因為如果你再開一個cmd,發現還是沒改回來,如果想修改全局的,網上有global方法。
3.set @@autocommit=0;
//然後查詢本地資料庫中的一條記錄,我本地資料庫為test1;
4.use test1;
5.select * from task where taskid=1;
//同時新開一個窗口cmd,連接資料庫,並且修改這條記錄,update語句我就不寫了,或者直接修改資料庫本條記錄。
//再次執行select * from task where taskid=1;發現值沒變。OK因為此時資料庫隔離級別為repeatable read 重復讀,因為mysql默認的隔離級別是重復讀。
//修改資料庫隔離級別
6.set global transaction isolation level read committed;
//查看一下,可能需要重新連接一下
7.select @@tx_isolation;
//這時在執行一下4,5操作,發現值變了,ok。因為已經改變了資料庫隔離級別,發生了重復讀出不同數據的現象。
(以上操作希望有不明白的上網自學一下,很有用,先把資料庫隔離級別弄明白了)
然後再來講一下,Spring對事務傳播行為和隔離級別的二次封裝。
因為不同項目可能在一個mysql的不同資料庫上,所以可以在項目中配置資料庫的傳播行為和隔離級別:
關於spring的傳播行為(PROPAGATION_REQUIRED、PROPAGATION_REQUIRED等),我《資料庫隔離級別(mysql+Spring)與性能分析 》文章中有講,網上也有很多相關資料,我就不說了。
關於spring的事務隔離級別與資料庫的一樣,也是那四個,多了一個default,我也不仔細講了。
下面主要講一下spring的配置方法:
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED</prop>
</props>
就以find為例,可以配置這么配置,前面是控制傳播行為,後面是控制事務隔離級別的。那麼這時哪怕資料庫層面上是重復讀,但是還是以這里為准,你會發現在同一個事務中兩次查詢的結果是不一樣的。
最後掃除一個盲區,readonly這個屬性,是放在傳播行為中的,一般書都這么歸類,我也嘗試了一下,readonly並不能影響資料庫隔離級別,只是配置之後,不允許在事務中對資料庫進行修改操作,僅此而已。
Ⅵ Spring mysql連接長時間斷掉的問題
維護一個toB智能製造項目的時候,發現mysql偶爾會報錯:
這個錯誤發生時,重新調用介面即可重新連接上,倒是沒有特別大的阻礙,但是偶爾跳出還是煩人。所以我花了點時間研究了下。
這個問題很明顯,就是mysql連接斷了。
網上查到的解決方案無非以下幾種:
試過了,但是後來發現,這個參數僅針對mysql4.x有效果,現如今的mysql穩定版大多是5.7,還有很多同行直接使用mysql8.x,所以這個方法沒有效果。
這個都不用試,標準的spring項目誰會沒事只開一個連接😂,所以也沒啥用。
這個默認就是換了的,因為外網ip不穩定,自己內部鏈接還少些資源。但是並不能從根本性上解決這個問題。
這是我現在使用的方法。等我測試幾天,再回來在評論區告訴大家答案。原理很簡單,spring的連接池默認走的是dbcp,據說這個玩意內部有硬傷,長期空閑連接mysql是會有問題的,所以換成阿里的druid試一試。
還有一點需要各位明白的是,連接池配置是全局有效的,除非你引用的第三方包自己寫死了,但是一般正常的第三方包或者開源包這些配置都是跟著主系統的,或者說主系統的配置是能夠覆蓋的。我這個系統使用了activiti,作為工作流引擎,引入其他的連接池也沒啥問題,照常使用。
綜上,等結果吧~
在此感謝這篇博客:
https://blog.csdn.net/qq_27471405/article/details/80921846
它總結的很全了。