多线程访问数据库的安全性

31 篇文章 0 订阅
12 篇文章 0 订阅

环境:Linux + oracle 10g + C

方法:多线程环境下对数据库(Pro*C)进行检索,使用游标。

 DBReturn ProcHandle::Test (IN string &sRuleID)
 {
  struct sqlca sqlca; /*define local sqlca for thread-safe */ 
  EXEC SQL WHENEVER SQLERROR GOTO error;
  EXEC SQL WHENEVER NOT FOUND GOTO notfound;
  EXEC SQL CONTEXT USE :ctx[m_ctx_index];
  EXEC SQL BEGIN DECLARE SECTION;
   ......
  EXEC SQL END DECLARE SECTION;
  .......
  EXEC SQL
   DELETE FROM Test WHERE RULEID = :s_RuleID;
  EXEC SQL COMMIT;
  if(sqlca.sqlcode==0)
  {
   rv = DB_OK;
   return rv;
  }
  return rv;
error:
  rv = sql_error();
  return rv;
notfound:
  EXEC SQL ROLLBACK;
  return DB_NotFound;
 }

我们使用多线程来对Test进行并发调用,当并发量达到10w后如果没有  struct sqlca sqlca;这条语句就将会频繁报错误。

错误内容如下(截取关键部分):

- ORA-01403: no data found

- ORA--1002: Message -1002 not found;  product=RDBMS; facility=ORA

- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- ORA--2114: Message -2114 not found;  product=RDBMS; facility=ORA

- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor
- SQL-02114: Invalid SQL Cursor usage: trying to CLOSE a CLOSEd cursor

结果分析:

如果不在函数入口处重新定义sqlca,系统将使用系统全局定义的sqlca作为数据库连接域,而这种情况下,在多任务的模式下线程是不安全的,很可能被其他线程close掉。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,使用多线程进行数据库访问是非常常见的需求。Spring Boot提供了多种方式来实现多线程下的数据库访问。 首先,可以利用Java的线程池Executor来管理线程,通过使用@Async注解将方法标记为异步执行的。在这种情况下,当调用标记为@Async的方法时,Spring会自动创建一个新的线程并执行该方法,而不会阻塞主线程。在异步方法中可以执行数据库访问的操作,例如从数据库中读取数据或更新数据等。通过这种方式,可以在多个线程之间实现并行的数据库访问。 另一种方式是使用Spring的异步任务支持。可以在应用程序的配置文件中开启异步任务的支持,然后使用@Async注解标记需要异步执行的方法。Spring Boot会自动创建一个线程池来执行这些方法,并将它们放入任务队列中进行处理。这种方式适用于较为复杂的、可能涉及多个数据库操作的情况。 在多线程下进行数据库访问时,需要注意一些问题。首先,要确保数据库连接是线程安全的。Spring Boot的JdbcTemplate和Spring Data JPA等都是线程安全的,可以在多个线程中共享和重用。其次,需要合理管理数据库连接池,避免出现连接泄漏或过多的连接创建导致数据库性能下降的情况。此外,还要考虑事务管理的问题,确保多线程下的数据库操作的一致性和完整性。 综上所述,Spring Boot提供了多种方式来实现多线程下的数据库访问。通过合理利用线程池、异步任务等技术,可以在多个线程之间实现数据库访问的并行操作,提高系统的性能和响应速度。同时,需要注意线程安全、连接池管理和事务管理等问题,确保数据库操作的正确性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值