`
星夜的遐想
  • 浏览: 189410 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

无法在service中try catch 数据库异常的的解决方案

阅读更多

 例如有一个批量操作数据库的功能(例如数据导入),当某条数据导入出现数据异常后,希望不影响后面数据的导入,于是我们通常情况会想到用try,catch将异常捕后,继续后面的处理;

 

本来的处理导入的代码是放在Ctroller层的,一直没出现什么问题,数据库异常正常捕获。但是近两天看Ctroller层中的代码太多涉及到业务逻辑的处理,于是进行优化,将导入的处理方法移到Service层,问题就出现了,处理数据库异常捕获的try ,catch失效了,该报异常还是报异常,数据一有错误,导入完全失败。

 

调试代码过程中,发现虽然saveOrUpdate()后并没有发出SQL语句,也就是没有真正执行持久化操作,因此异常还没抛出,当然也就无法捕获了,于是想办法让hibernate立即执行SQL,于是在saveorUpdate()后,加了句baseDao.flush()方法,刷新session缓存,oK,问题解决。

 

写道
public int importSendRecords(List<SendRecord> imports) {
SendRecord srd = null;
int failCount = 0;
SendRecord pRecord = null;
for (SendRecord record : imports) {
pRecord = findSendRecordIfExists(record);
if (pRecord == null) { //判断发行履历客户主表是否存在该客户
String tempCode = findMaxTmpSoldToCode();
record.setSoldToCode(tempCode);
srd = record;

} else {
srd = pRecord;
srd.setCapitalType(record.getCapitalType());
srd.setProfession(record.getProfession());
srd.setTelephone(record.getTelephone());
srd.setFax(record.getFax());
srd.setEmail(record.getEmail());
srd.setPostalCode(record.getPostalCode());
}

try {
baseDao.saveOrUpdate(srd);
baseDao.flush();
} catch (Exception e) {
failCount = failCount + srd.getSendRecordDetailList().size() + 1;
logger.error("发送履历导入过程中:[客户编号=" + srd.getSoldToCode() + "\t客户名称=" + srd.getCustomerNtvName()
+ " \t客户地址=" + srd.getNtvAddress() + "\t客户部门=" + srd.getDepartment() + "\t联系人="
+ srd.getAttention() + "]对应的【主记录】导入失败");
e.printStackTrace();
continue;
}

for (SendRecordDetail srdd : record.getSendRecordDetailList()) {
srdd.setSendRecord(srd);
srdd.setSendCode(constructSendCode());
try {
baseDao.saveOrUpdate(srdd);
baseDao.flush();
} catch (Exception e) {
failCount++;
logger.error("发送履历导入过程中:[客户编号=" + srd.getSoldToCode() + "客户名称=" + srd.getCustomerNtvName()
+ " 客户地址=" + srd.getNtvAddress() + "客户部门=" + srd.getDepartment() + "联系人="
+ srd.getAttention() + "]对应的【子记录】导入失败");
e.printStackTrace();
}

}

}

return failCount;

 

 

    回想之所以在Ctroller层,没有发生这种情况是因为,service方法执行完成后,事务就已经提交了,而在service层方法内部为保证事务的原子性,都是同步提交的,到service方法结束后才执行,因此try,catch中无法捕获数据库异常了,为了让它立刻执行,只有通过flush()刷新缓存了。

 

分享到:
评论

相关推荐

    后端异常统一处理解决方案

    此外,MyBatis的异常处理通常需要在Service层或Mapper层进行,通过try-catch语句捕获数据库操作中的异常,然后转化为业务友好的异常信息。 为了提高可维护性和代码的整洁性,可以将异常处理逻辑封装到单独的服务或...

    servlet+jsp+service+Oracle实现简单的数据库交互

    Oracle数据库是本项目中使用的后端存储解决方案。所有的用户信息都将被存储在这个数据库中。 - **表结构**: 通常我们会为用户信息创建一个表,比如`userlogin`,其中包含字段如`name`、`pwd`和`email`等。 - **安全...

    有关struts中的数据库连接池问题解决

    ### 有关Struts中的数据库连接池问题解决 在开发基于Web的应用程序时,尤其是在使用Struts框架这样的MVC(Model-View-Controller)架构中,数据库连接管理是至关重要的一个环节。由于数据库连接是一种关键、有限且...

    详细整理Spring事务失效的具体场景及解决方案.docx

    使用 try…catch…语句块捕获,而 catch 语句块没有throw new RuntimeExecption 异常、注解@Transactional 中 Propagation 属性值设置错误、mysql 关系型数据库,且存储引擎是 MyISAM 而非 InnoDB。了解这些常见场景...

    java数据库驱动jar包

    而如果涉及到复杂的分布式事务处理,你可能需要寻找一个支持JTA的解决方案,如JDTS,尽管它可能需要额外的配置和适配工作。 总的来说,Java数据库驱动为Java开发者提供了强大的数据库访问能力,无论是在简单的CRUD...

    Jsp中常见异常解答

    - 使用try-catch语句捕获并处理异常,避免程序崩溃。 #### 2. **Page Not Found (404)** 这是最常见的异常之一,通常表示服务器无法找到请求的资源(页面)。 **原因**: - URL输入错误。 - 应用程序部署问题,...

    解决Java 连接MySQL数据库的出现的问题

    本文详细介绍了如何在Java环境中连接MySQL数据库的过程,包括环境配置、代码实现以及常见问题的解决方案。通过遵循上述步骤,您可以轻松地建立稳定的数据库连接,并有效避免各种技术障碍。希望这些信息对您有所帮助...

    C#f服务自动备份MySql数据库

    在IT行业中,数据库管理是至关重要的任务之一,而定期备份数据库是确保数据安全的重要环节。本文将详细探讨如何使用C#编程语言构建一个自动...正确理解和实施这些步骤,可以构建出一个高效、可靠的数据库备份解决方案。

    基于C#连接Oracle数据库Oracle.ManagedDataAccess

    在Visual Studio中,可以通过右键点击解决方案资源管理器中的项目,选择“管理NuGet程序包”,然后在搜索框中输入"Oracle.ManagedDataAccess",找到对应的包并安装。 接下来,我们需要编写代码来建立数据库连接。...

    SSH异常和日志处理方案(开发人员必备)

    4. **指定具体的异常类型**:在catch块中尽量明确指定要捕获的异常类型,避免使用通用的异常类如`Exception`。 5. **避免使用异常控制流程**:异常设计的初衷是处理意外情况,而不是作为程序控制流的一部分。 ###...

    oracle、db2、informix数据库的jdbc包

    在IT行业中,数据库是至关重要的组成部分,用于存储和管理企业级的数据。Oracle、DB2和Informix都是知名的商业关系型数据库管理系统(RDBMS),广泛应用于各种规模的企业和组织。这些数据库系统提供了丰富的功能和高...

    c# asp.net 读取 连接oracle数据库源码(不用安装oracle客户端)

    1. **ODP.NET的安装**:在Visual Studio中,打开解决方案资源管理器,右键点击项目,选择“管理NuGet程序包”,然后搜索“Oracle.DataAccess”,安装最新的Oracle.DataAccess.Client包。 2. **配置连接字符串**:在...

    5Silverlight访问数据库之Access数据库[参照].pdf

    虽然 SQL Server 和 SQL Server Express 是常用的数据库解决方案,但在构建小型应用时,Access 数据库因其轻量级、易于管理和使用的特点,成为了一个不错的选择。然而,Visual Studio 并未直接提供 Silverlight 与 ...

    c#编写端口扫描和数据库密码爆破软件

    `System.ServiceProcess`命名空间提供了解决方案,允许我们创建、安装和控制服务。 总之,C#为开发端口扫描器和密码爆破工具提供了丰富的库和支持。然而,这些工具应谨慎使用,以确保网络安全并遵循法规。在实际...

    java连接oracle数据库

    本文将深入探讨如何使用Java来连接Oracle数据库,包括必要的环境配置、驱动依赖、连接代码以及可能出现的问题与解决方案。 首先,确保你已经安装了Oracle数据库,并且在服务器上运行正常。然后,你需要在Java开发...

    Visual C#.NET数据库开发经典案例解析

    《Visual C#.NET数据库...这些案例覆盖了各种常见业务场景,通过实际操作,读者能够提升在C#.NET环境下设计和实施数据库解决方案的能力。每个案例都提供了详细的步骤和代码示例,有助于读者将理论知识转化为实际技能。

    上传图片到Oracle数据库

    在创建的"InserPicToOracle"解决方案中,通常会有一个主程序类,例如`Program.cs`,在这里编写主要的代码逻辑。在这个类中,我们可以定义方法来连接数据库、读取图片并将其插入到BLOB字段中。 ```csharp using ...

    delphi使用oadc操作oracle数据库Listview

    同时,要处理可能出现的错误,比如通过Try-Catch结构捕获异常。 8. **性能优化**: 考虑到数据库操作的效率,可能需要使用参数化查询(通过TOracleCommand的Parameters属性)避免SQL注入,或者使用存储过程提高...

    Log4net的使用

    当在try块中的代码抛出异常时,控制流会立即跳转到相应的catch块。log4net可以与异常处理结合,将异常信息记录下来,便于调试和问题排查。例如: ```csharp try { // 可能抛出异常的代码 } catch (Exception ex) {...

    JTDS连接SQLSERVER、Sybase数据库

    首先,JTDS驱动是一个轻量级的解决方案,它不依赖于数据库供应商的特定JDBC驱动,因此可以减少应用程序的依赖性,提高部署的灵活性。JTDS提供了一个与Microsoft SQL Server和Sybase ASE兼容的JDBC驱动,使得Java...

Global site tag (gtag.js) - Google Analytics