Java >> Java tutorial >  >> Tag >> mybatis

Håndtering af meget store mængder data i MyBatis

myBatis KAN streame resultater. Det, du har brug for, er en tilpasset resultatbehandler. Med denne kan du tage hver række separat og skrive den til din XML-fil. Den overordnede ordning ser således ud:

session.select(
    "mappedStatementThatFindsYourObjects",
    parametersForStatement,
    resultHandler);

Hvor resultHandler er en forekomst af en klasse, der implementerer ResultHandler-grænsefladen. Denne grænseflade har kun én metode handleResult . Denne metode giver dig et ResultContext-objekt. Fra denne kontekst kan du hente den række, der aktuelt læses, og gøre noget ved den.

handleResult(ResultContext context) {
  Object result = context.getResultObject();
  doSomething(result);
}

Nej, mybatis har ikke fuld mulighed for at streame resultater endnu .

REDIGERING 1: Hvis du ikke har brug for indlejrede resultattilknytninger, kan du implementere en tilpasset resultathåndtering til at streame resultater. på aktuelle frigivne versioner af MyBatis. (3.1.1) Den aktuelle begrænsning er, når du skal lave kompleks resultatkortlægning. NestedResultSetHandler tillader ikke brugerdefinerede resultatbehandlere. En rettelse er tilgængelig, og det ser ud til, at den i øjeblikket er målrettet mod 3.2. Se udgave 577.

Kort sagt, for at streame store resultatsæt ved hjælp af MyBatis har du brug for.

  1. Implementer din egen ResultSetHandler.
  2. Forøg hentestørrelsen. (som nævnt nedenfor af Guillaume Perrot)
  3. For indlejrede resultatkort skal du bruge den rettelse, der er beskrevet i udgave 577. Denne rettelse løser også nogle hukommelsesproblemer med store resultatsæt.

handleResult modtager lige så mange poster, som forespørgslen får, ingen pause.

Når der er for mange poster til at behandle, brugte jeg sqlSessionFactory.getSession().getConnection(). Derefter som normal JDBC, få en Statement, få Resultset, og behandle posterne en efter en. Glem ikke at lukke sessionen.


Java tag