Ibatis之RowHandler

Jun 07, 2016 pm 04:06 PM
ibatis 지휘하다

当用Ibatis进行大数据量Sql查询时(如上百万条,千万条数据),如果按照一般的编程方式(如QueryForList方法)把数据查询出来再做操作则很可能会出现性能问题,如: 1.对JVM内存的大量消耗; 2.大量对象的密集创建对GC带来一定的压力; 3.数据查询和后续的数

当用Ibatis进行大数据量Sql查询时(如上百万条,千万条数据),如果按照一般的编程方式(如QueryForList方法)把数据查询出来再做操作则很可能会出现性能问题,如:
1.对JVM内存的大量消耗;
2.大量对象的密集创建对GC带来一定的压力;
3.数据查询和后续的数据操作无法并行执行等

为应对这样的场景,Ibatis提供了RowHandler接口,以回调的方式,允许用户对查询结果集进行自定义的处理,用户通过自定义实现handleRow方法一次处理一条数据,从而提高框架的灵活性。

/**
 * Event handler for row by row processing.
 * <p/>
 * The RowHandler interface is used by the SqlMapSession.queryWithRowHandler() method.
 * Generally a RowHandler implementation will perform some row-by-row processing logic
 * in cases where there are too many rows to efficiently load into memory.
 * <p/>
 * Example:
 * <pre class="brush:php;toolbar:false">
 * sqlMap.queryWithRowHandler ("findAllEmployees", null, new MyRowHandler()));
 * 
로그인 후 복사
*/ public interface RowHandler { /** * Handles a single row of a result set. *

* This method will be called for each row in a result set. For each row the result map * will be applied to build the value object, which is then passed in as the valueObject * parameter. * * @param valueObject The object representing a single row from the query. * @see com.ibatis.sqlmap.client.SqlMapSession */ void handleRow(Object valueObject); }

简单举例来说RowHandler的作用:
在大数据量的场景下,如:银行每天对账户的“计提”操作,如果有一千万个账户,则需要查询出一千万条账号,然后做一千万次更新(如果可以用addbatch那就肯定不用一千万次了)。为了尽可能提升性能:
1.必须防止对象爆发式的创建,因为爆发式创建会让内存急剧上升,如果没有很好的设计,还会导致对象爆发式的销毁(即:对最后一条数据处理完才会让所有对象失效,而在进行这一千万次更新期间这些内存都是被占用的)。通过自定义RowHandler,可以对数据逐条进行处理,在handleRow方法中执行更新操作,更新完之后立刻释放对象,这样便对操作进行了“离散化”,降低了对内存的占用。
2.上面通过“离散化”解决了内存占用的问题,但查询和数据处理的总时间是没有减少的,为了达到更高的效率,还需要进行“异步化”处理。在handleRow方法中,将valueObject发送到异步队列中,让查询和执行进行并行处理,进而降低总时间。其实总时间的降低体现出的只是一个优点,还有一个优点就是:进行“异步化”之后的查询时间和直接调用QueryForList的查询时间相差不会太大,查询完之后就快速释放连接了,减轻了数据库的压力。


注意事项:
当应用RowHandler时,可能仍然会发现内存急剧上升,这是因为底层JDBC返回的ResultMap仍然会一次性把数据全部返回的缘故。通过设置fetchsize可以解决这一问题,fetchsize是JDBC提供的一个配置变量,JDBC驱动按照该变量的配置值从数据库中循环取数据,而不是一次性load到内存中,这样便允许用户根据自己的实际情况做最优的参数设置,ibatis的select标签将此属性暴露了出来,可以针对某个特定的语句做独立的设置,以达到最优的性能。但是fetchsize也不能太小,否则会带来java和数据库之间频繁的交互,内存问题倒是解决了,但是频繁交互带来的性能问题又出现了,所以fetchsize的值需要以具体场景和实验数据为依据进行灵活设置。
关于fetchsize的几个链接:
http://www.2cto.com/database/201305/209625.html
http://www.java3z.com/cwbwebhome/article/article8/828.html?id=2244
http://www.smithfox.com/?e=153
http://stackoverflow.com/questions/3870500/ibatis-querywithrowhandler-still-seems-to-fetch-all-rows
http://docs.aws.amazon.com/redshift/latest/dg/jdbc-fetch-size-parameter.html

利用rowhandler还可以实现对象关联关系的创建,解决“N+1 Select“的问题,此处不详述,备忘一下,详见《Ibatis in Action》一书的相关章节。
rowhandler可以做的事情其实很多,它是一种公用的机制,只是经常被用来解决效率问题,当Ibatis框架不能满足我们的需求时,可以考虑发挥该接口的作用。
至于性能,本文说的都是偏理论的、一般性的场景,具体的解决方案需要因场景而异,经验结合需求才能得到最好的设计。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

iBatis vs. MyBatis: 어느 것이 당신에게 더 좋나요? iBatis vs. MyBatis: 어느 것이 당신에게 더 좋나요? Feb 19, 2024 pm 04:38 PM

iBatis vs. MyBatis: 무엇을 선택해야 할까요? 소개: Java 언어의 급속한 발전으로 인해 많은 지속성 프레임워크가 등장했습니다. iBatis와 MyBatis는 두 가지 인기 있는 지속성 프레임워크로, 둘 다 간단하고 효율적인 데이터 액세스 솔루션을 제공합니다. 이 기사에서는 iBatis와 MyBatis의 기능과 장점을 소개하고 적절한 프레임워크를 선택하는 데 도움이 되는 몇 가지 특정 코드 예제를 제공합니다. iBatis 소개: iBatis는 오픈 소스 지속성 프레임워크입니다.

iBatis와 MyBatis: 비교 및 ​​장점 분석 iBatis와 MyBatis: 비교 및 ​​장점 분석 Feb 18, 2024 pm 01:53 PM

iBatis 및 MyBatis: 차이점 및 장점 분석 소개: Java 개발에서 지속성은 일반적인 요구 사항이며 iBatis와 MyBatis는 널리 사용되는 두 가지 지속성 프레임워크입니다. 유사점이 많지만 몇 가지 중요한 차이점과 장점도 있습니다. 이 기사에서는 이 두 프레임워크의 기능, 사용법 및 샘플 코드에 대한 자세한 분석을 통해 독자에게 보다 포괄적인 이해를 제공할 것입니다. 1. iBatis 기능: iBatis는 SQL 매핑 파일을 사용하는 오래된 지속성 프레임워크입니다.

이바티스와 마이바티스의 차이점은 무엇인가요? 이바티스와 마이바티스의 차이점은 무엇인가요? Jan 10, 2024 am 11:25 AM

ibatis와 mybatis의 차이점: 1. 서로 다른 기본 정보, 2. 서로 다른 개발 시간, 3. 기능 및 사용 편의성, 5. 입력 매개변수 유형 및 출력 매개변수 유형, 7, 문법적 차이 8. 데이터베이스 방언 지원 9. 플러그인 지원 11. 세계화 지원; 자세한 소개: 1. 기본 정보가 다릅니다. iBatis는 SQL 맵 및 데이터 액세스 개체 등을 포함한 지속성 계층 프레임워크를 제공합니다.

iBatis와 MyBatis: 역사와 현재 상황의 비교 평가 iBatis와 MyBatis: 역사와 현재 상황의 비교 평가 Feb 19, 2024 am 10:42 AM

iBatis 및 MyBatis: 역사에서 현재 상태까지의 평가 및 비교 소개: 소프트웨어 개발 분야의 급속한 발전으로 인해 데이터베이스 액세스 프레임워크에 대한 요구 사항이 점점 더 높아졌습니다. iBatis와 MyBatis는 많은 관심을 받고 있는 두 가지 Java 지속성 계층 프레임워크입니다. 둘 다 관계형 데이터베이스에 액세스하는 간단하고 유연한 방법을 제공합니다. 이 기사에서는 이 두 프레임워크에 대한 역사적 검토를 제공하고 현재 상태를 평가 및 비교할 것입니다. 1. 역사적 검토 iBatisiBatis는 Clinton이 개발했습니다.

iBatis와 MyBatis의 유사점과 차이점 비교: 주류 ORM 프레임워크 비교 iBatis와 MyBatis의 유사점과 차이점 비교: 주류 ORM 프레임워크 비교 Feb 19, 2024 pm 07:08 PM

iBatis와 MyBatis는 두 가지 주류 ORM(Object-Relational Mapping) 프레임워크입니다. 디자인과 사용 면에서 많은 유사점이 있지만 미묘한 차이점도 있습니다. 이 기사에서는 iBatis와 MyBatis의 유사점과 차이점을 자세히 비교하고 구체적인 코드 예제를 통해 이들의 특징을 설명합니다. 1. iBatis와 MyBatis의 역사와 배경 iBatis는 Apache Software Foundat이다.

'검은 신화: 오공' Xbox 버전이 '메모리 누수'로 인해 지연되었으며, PS5 버전 최적화 진행 중 '검은 신화: 오공' Xbox 버전이 '메모리 누수'로 인해 지연되었으며, PS5 버전 최적화 진행 중 Aug 27, 2024 pm 03:38 PM

최근 'Black Myth: 오공'은 각 플랫폼의 동시 접속자 수가 새로운 최고치를 기록하며 전 세계적으로 큰 주목을 받고 있습니다. 이 게임은 여러 플랫폼에서 큰 상업적 성공을 거두었습니다. 'Black Myth: Wukong'의 Xbox 버전 출시가 연기되었습니다. 'Black Myth: Wukong'은 PC와 PS5 플랫폼으로 출시되었지만 Xbox 버전에 대한 확실한 소식은 없습니다. 관계자는 '검은 신화:오공'이 엑스박스 플랫폼으로 출시될 것임을 확인한 것으로 알려졌다. 하지만 아직 구체적인 출시 날짜는 발표되지 않았습니다. 최근 Xbox 버전의 출시가 기술적인 문제로 인해 지연된 것으로 알려졌습니다. 관련 블로거에 따르면, 그는 Gamescom에서 개발자 및 "Xbox 내부자"와의 커뮤니케이션을 통해 "Black Myth: Wukong"의 Xbox 버전이 존재한다는 사실을 알게 되었습니다.

Python을 사용한 RFM 분석 Python을 사용한 RFM 분석 Sep 03, 2023 pm 12:45 PM

Python은 데이터 분석 및 기계 학습 분야에서 널리 사용되는 다목적 프로그래밍 언어입니다. 단순성, 가독성 및 풍부한 라이브러리 덕분에 복잡한 데이터 작업을 처리하는 데 이상적입니다. 이러한 강력한 응용 프로그램 중 하나는 구매 행동을 기반으로 고객을 분류하기 위해 마케팅에 사용되는 기술인 RFM 분석입니다. 이 튜토리얼에서는 Python을 사용하여 RFM 분석을 구현하는 과정을 안내합니다. 먼저 RFM 분석의 개념과 마케팅에서의 중요성에 대해 설명하겠습니다. 그런 다음 Python을 사용하여 RFM 분석의 실제적인 측면을 점차적으로 살펴보겠습니다. 기사의 다음 부분에서는 최신성, 빈도 및 값을 고려하여 Python을 사용하여 각 고객의 RFM 점수를 계산하는 방법을 보여줍니다.

새로운 완장을 함께 써 보세요. '월드 오브 워쉽” 세계 중국의 날 이벤트가 진행됩니다. 새로운 완장을 함께 써 보세요. '월드 오브 워쉽” 세계 중국의 날 이벤트가 진행됩니다. Apr 24, 2024 pm 05:25 PM

모든 단어가 그림이 되고, 모든 문장이 시가 됩니다. '월드 오브 워쉽'의 세계 중국의 날 활동이 진행됩니다. 투표에 참여하여 게임과 중국어의 아름다움을 가장 잘 표현하는 한자를 선택해 향후 전 세계의 더 많은 선장들이 중국 문화를 이해할 수 있도록 완장으로 게임에 추가될 예정입니다. 동시에 특별 전투 임무를 완료하여 영구 페인트를 획득할 수도 있습니다. 이제 '월드 오브 워쉽'과 관련되고 중국 문화적 의미를 지닌 20개의 한자가 선장의 선택을 기다리고 있습니다. 선장은 공식 홈페이지 지정 페이지에서 투표에 참여하고 자신이 좋아하는 한자를 선택할 수 있다. 가장 많은 표를 얻은 한자는 향후 새로운 완장으로 게임에 추가될 예정입니다! "하늘", "땅", "도", "공격", "방어", "대포"와 같은 한자가 완장으로 게임에 추가될지는 주장에 의해 결정됩니다. 투표 페이지: h

See all articles