




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第詳解Spring不同數(shù)據(jù)庫異常如何抽象的//SQLErrorCodesFactory構(gòu)造方法中,生成的errorCodesMap,map的內(nèi)容來自org/springframework/jdbc/support/sql-error-codes.xml文件
protectedSQLErrorCodesFactory(){
MaperrorCodes;
try{
DefaultListableBeanFactorylbf=newDefaultListableBeanFactory();
lbf.setBeanClassLoader(this.getClass().getClassLoader());
XmlBeanDefinitionReaderbdr=newXmlBeanDefinitionReader(lbf);
Resourceresource=this.loadResource("org/springframework/jdbc/support/sql-error-codes.xml");
if(resource!=nullresource.exists()){
bdr.loadBeanDefinitions(resource);
}else{
("Defaultsql-error-codes.xmlnotfound(shouldbeincludedinspring-jdbcjar)");
resource=this.loadResource("sql-error-codes.xml");
if(resource!=nullresource.exists()){
bdr.loadBeanDefinitions(resource);
logger.debug("Foundcustomsql-error-codes.xmlfileattherootoftheclasspath");
errorCodes=lbf.getBeansOfType(SQLErrorCodes.class,true,false);
if(logger.isTraceEnabled()){
logger.trace("SQLErrorCodesloaded:"+errorCodes.keySet());
}catch(BeansExceptionvar5){
logger.warn("ErrorloadingSQLerrorcodesfromconfigfile",var5);
errorCodes=Collections.emptyMap();
this.errorCodesMap=errorCodes;
}
sql-error-codes.xml文件中配置了各個數(shù)據(jù)庫的主要的錯誤碼
這里列舉了MYSQL部分,當(dāng)然還有其他部分,我們可以看到唯一性約束錯誤碼是1062,就可以翻譯成DuplicateKeyException異常了
beanid="MySQL"
propertyname="databaseProductNames"
list
valueMySQL/value
valueMariaDB/value
/list
/property
propertyname="badSqlGrammarCodes"
value1054,1064,1146/value
/property
propertyname="duplicateKeyCodes"
value1062/value
/property
propertyname="dataIntegrityViolationCodes"
value630,839,840,893,1169,1215,1216,1217,1364,1451,1452,1557/value
/property
propertyname="dataAccessResourceFailureCodes"
value1/value
/property
propertyname="cannotAcquireLockCodes"
value1205,3572/value
/property
propertyname="deadlockLoserCodes"
value1213/value
/property
/bean
你已經(jīng)看到,比如上面的錯誤碼值列舉了一部分,如果出現(xiàn)了一個不在其中的錯誤碼肯定是匹配不到,Spring當(dāng)然能想到這種情況了
*@公-眾-號:程序員阿牛
*在AbstractFallbackSQLExceptionTranslator中,看到如果查找失敗會獲取下一個后續(xù)轉(zhuǎn)換器
@Nullable
publicDataAccessExceptiontranslate(Stringtask,@NullableStringsql,SQLExceptionex){
Assert.notNull(ex,"CannottranslateanullSQLException");
DataAccessExceptiondae=this.doTranslate(task,sql,ex);
if(dae!=null){
returndae;
}else{
SQLExceptionTranslatorfallback=this.getFallbackTranslator();
returnfallback!=nullfallback.translate(task,sql,ex):null;
}
SQLErrorCodeSQLExceptionTranslator的后置轉(zhuǎn)換器是什么?
//構(gòu)造方法中已經(jīng)指定,SQLExceptionSubclassTranslator
publicSQLErrorCodeSQLExceptionTranslator(){
this.setFallbackTranslator(newSQLExceptionSubclassTranslator());
}
SQLExceptionSubclassTranslator的轉(zhuǎn)換方法邏輯如下:
*@公-眾-號:程序員阿牛
*可以看出實(shí)際按照子類類型來判斷,返回相應(yīng)的錯誤類,如果匹配不到,則找到下一個處理器,這里的處理其我們可以根據(jù)構(gòu)造方法青松找到*SQLStateSQLExceptionTranslator
@Nullable
protectedDataAccessExceptiondoTranslate(Stringtask,@NullableStringsql,SQLExceptionex){
if(exinstanceofSQLTransientException){
if(exinstanceofSQLTransientConnectionException){
returnnewTransientDataAccessResourceException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLTransactionRollbackException){
returnnewConcurrencyFailureException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLTimeoutException){
returnnewQueryTimeoutException(this.buildMessage(task,sql,ex),ex);
}elseif(exinstanceofSQLNonTransientException){
if(exinstanceofSQLNonTransientConnectionException){
returnnewDataAccessResourceFailureException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLDataException){
returnnewDataIntegrityViolationException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLIntegrityConstraintViolationException){
returnnewDataIntegrityViolationException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLInvalidAuthorizationSpecException){
returnnewPermissionDeniedDataAccessException(this.buildMessage(task,sql,ex),ex);
if(exinstanceofSQLSyntaxErrorException){
returnnewBadSqlGrammarException(task,sql!=nullsql:"",ex);
if(exinstanceofSQLFeatureNotSupportedException){
returnnewInvalidDataAccessApiUsageException(this.buildMessage(task,sql,ex),ex);
}elseif(exinstanceofSQLRecoverableException){
returnnewRecoverableDataAccessException(this.buildMessage(task,sql,ex),ex);
returnnull;
}
SQLStateSQLExceptionTranslator的轉(zhuǎn)換方法:
*@公-眾-號:程序員阿牛
*可以看出根據(jù)SQLState的前兩位來判斷異常,根據(jù)匹配結(jié)果返回相應(yīng)的異常信息
@Nullable
protectedDataAccessExceptiondoTranslate(Stringtask,@NullableStringsql,SQLExceptionex){
StringsqlState=this.getSqlState(ex);
if(sqlState!=nullsqlState.length()=2){
StringclassCode=sqlState.substring(0,2);
if(this.logger.isDebugEnabled()){
this.logger.debug("ExtractedSQLstateclass'"+classCode+"'fromvalue'"+sqlState+"'");
if(BAD_SQL_GRAMMAR_CODES.contains(classCode)){
returnnewBadSqlGrammarException(task,sql!=nullsql:"",ex);
if(DATA_INTEGRITY_VIOLATION_CODES.contains(classCode)){
returnnewDataIntegrityViolationException(this.buildMessage(task,sql,ex),ex);
if(DATA_ACCESS_RESOURCE_FAILURE_CODES.contains(classCode)){
returnnewDataAccessResourceFailureException(this.buildMessage(task,sql,ex),ex);
if(TRANSIENT_DATA_ACCESS_RESOURCE_CODES.contains(classCode)){
returnnewTransientDataAccessResourceException(this.buildMessage(task,sql,ex),ex);
if(CONCURRENCY_FAILURE_CODES.contains(classCode)){
returnnewConcurrencyFailureException(this.buildMessage(task,sql,ex),ex);
returnex.getClass().getName().contains("Timeout")newQueryTimeoutException(this.buildMessage(task,sq
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 提升2025公文寫作能力的考試攻略試題及答案
- 城市區(qū)域規(guī)劃與市政學(xué)試題及答案
- 2025年行政管理心理學(xué)職場挑戰(zhàn)試題及答案
- 管理心理學(xué)在組織文化建設(shè)中的定位試題及答案
- 管理者影響力對團(tuán)隊文化的塑造試題及答案
- 現(xiàn)代管理學(xué)的動態(tài)管理理論試題及答案
- 行政管理中的公文執(zhí)行力解析試題及答案
- 親戚兄弟之間借錢合同范例
- 農(nóng)業(yè)設(shè)備送貨合同范例
- 行政管理自考知識應(yīng)用探討試題及答案解析
- 北師大版《相遇問題》公開課課件
- QC-R 596-2017高速鐵路板式無砟軌道自密實(shí)混凝土高清-無水印
- 2023高中學(xué)業(yè)水平合格性考試歷史重點(diǎn)知識點(diǎn)歸納總結(jié)(復(fù)習(xí)必背)
- 鄰補(bǔ)角、對頂角、同位角、內(nèi)錯角、同旁內(nèi)角經(jīng)典習(xí)題-一對一專用
- HP系列培訓(xùn)手冊
- 常見病媒生物分類鑒定
- 畢業(yè)論文-原油電脫水方法與機(jī)理的研究
- 陜西省2022年普通高中學(xué)業(yè)水平考試(真題)
- 事故池管理的有關(guān)規(guī)定
- 2021-2022學(xué)年甘肅省天水市第一中學(xué)高一下學(xué)期第二階段考物理試題(原卷版)
- 混凝土結(jié)構(gòu)課程設(shè)計244
評論
0/150
提交評論