




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第詳解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文件中配置了各個(gè)數(shù)據(jù)庫的主要的錯(cuò)誤碼
這里列舉了MYSQL部分,當(dāng)然還有其他部分,我們可以看到唯一性約束錯(cuò)誤碼是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)看到,比如上面的錯(cuò)誤碼值列舉了一部分,如果出現(xiàn)了一個(gè)不在其中的錯(cuò)誤碼肯定是匹配不到,Spring當(dāng)然能想到這種情況了
*@公-眾-號(hào):程序員阿牛
*在AbstractFallbackSQLExceptionTranslator中,看到如果查找失敗會(huì)獲取下一個(gè)后續(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)換方法邏輯如下:
*@公-眾-號(hào):程序員阿牛
*可以看出實(shí)際按照子類類型來判斷,返回相應(yīng)的錯(cuò)誤類,如果匹配不到,則找到下一個(gè)處理器,這里的處理其我們可以根據(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)換方法:
*@公-眾-號(hào):程序員阿牛
*可以看出根據(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)鼓風(fēng)機(jī)軸瓦市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)隨車急救工具市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)輸箱系統(tǒng)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)花齒墊片市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)組合臺(tái)燈市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)短節(jié)市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)甲基丙烯酯市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)滲透性松銹油市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)水溶鈦項(xiàng)圈市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)木材烘干箱市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- Cpk 計(jì)算標(biāo)準(zhǔn)模板
- 化工原理課程設(shè)計(jì)-用水冷卻煤油產(chǎn)品的列管式換熱器的工藝設(shè)計(jì)
- 初中美術(shù)(湘教版)八年級(jí)下冊(cè)《變廢為寶》單元作業(yè)設(shè)計(jì)
- 熱力學(xué)與統(tǒng)計(jì)物理-試題及答案 2
- 2023-2024學(xué)年四川省雅安市小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)期末高分試卷
- 網(wǎng)絡(luò)游戲代理合同通用版范文(2篇)
- GB/T 6414-1999鑄件尺寸公差與機(jī)械加工余量
- GB/T 27773-2011病媒生物密度控制水平蜚蠊
- GB/T 12817-1991鐵道客車通用技術(shù)條件
- 質(zhì)量風(fēng)險(xiǎn)識(shí)別項(xiàng)清單及防控措施
- 【課件超聲】常見的超聲效應(yīng)與圖象偽差
評(píng)論
0/150
提交評(píng)論