Oracle DB에 oracle-enhanced 젬으로 연결 중인데 maximum open cursors exceeded 에러가 발생할 경우
Ruby on rails 프로젝트에 Oracle DB를 연결하여 rake task 로 일회성 자료 추출에 사용하고 있다. 가끔, 처리해야할 갯수가 아주 많은 경우에 한참 수행하다가 maximum open cursors exceeded 발생하며 task 가 종료되곤 한다.
맨처음 마주쳤을때는 검색을 해도 대응책이 눈에 잘 띄지 않아서 select 할때 배치 사이즈를 다음과 같이 지정해서 해당 오류를 회피할 수 있었다.
Article
.includes(:article_content)
.select("id", "type", "status", "reg_dttm")
.where(["TYPE =?", t])
.where(["STATUS =?", s])
.where(["reg_dttm >= ? and reg_dttm <= ?", Date::strptime(m[0], '%Y-%m-%d'), Date::strptime(m[1], '%Y-%m-%d')])
.order(id: :asc)
.find_each(batch_size: 500) do |a|
두번째 마주쳤을때는 위의 방식으로도 회피를 할 수 없어서 oracle-enhanced
저장소의 이슈들을 자세히 읽어보았더니 저번에는 눈에 띄지 않았던 내용이 눈에 들어와서 config/database.yml
에 아래 내용을 추가하였더니 더이상 발생하지 않았다.
statement_limit: 250
open_cursors: 300
참고:
- https://github.com/rsim/oracle-enhanced/issues/1358
- https://github.com/rsim/oracle-enhanced/issues/1426