sql >> Databasteknik >  >> RDS >> Oracle

Spring JPA Hibernate:långsam SELECT-fråga

Jag har testat olika typer av DAO (jag publicerar inte kod här eftersom den är så smutsig) :

  • Med Hibernate :~200 ms
  • Med (injicerad) Spring JDBCTemplate och RowMapper :~70 ms
  • Med Java Statement :~2 ms
  • Med Java OracleStatement :~5 ms
  • Med Java PreparedStatement :~100 ms
  • Med Java PreparedStatement justerad med Fetch size =5000 :~50 ms
  • Med Java OraclePreparedStatement :~100 ms
  • Med Java OraclePreparedStatement justerad med PreHetch-storlek =5000 :~170 ms

Anmärkningar:

  • DAO injiceras av Spring istället för nya ClientDao() :+30 ms förlorade (-sjuk-)
  • Anslutningstid till DB:46ms

Jag skulle kunna använda :

  • Java-utlåtande med manuellt sanerade fält.
  • Föranslutning vid programstart
  • Använd inte Spring Injection

Men :

  • Inte riktigt säker / säker
  • Snabbt för ett litet antal rader, långsamt att mappa ResultSet till enhet på stort antal rader (jag har också detta användningsfall)

Så :

Spring JDBCTemplate med RowMapper verkar vara den bästa lösningen för att öka prestandan i specifika fall. Och vi kan behålla en säkerhet på SQL-frågor. Men måste skriva specifik RowMapper för att omvandla ResultSet till Entity.

Exempel på Spring JDBCTemplate

@Repository
public class ClientJdbcTemplateDao {


    private final Logger logger = LoggerFactory.getLogger(ClientJdbcTemplateDao.class);

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public List<Client> find() {
        List<Client> c = this.jdbcTemplate.query( "SELECT login FROM Client WHERE LOGIN='xxxx' AND PASSWORD='xxx'", new ClientRowMapper());
        return c;
    }
}

Exempel på Client RowMapper

public class ClientRowMapper implements RowMapper<Client> {

    @Override
    public Client mapRow(ResultSet arg0, int arg1) throws SQLException {
        // HERE IMPLEMENTS THE CONVERTER
        // Sample : 
        // String login = arg0.getString("LOGIN")
        // Client client = new Client(login);
        // return client;
    }
}

Kanske kan bli bättre, alla förslag är välkomna.




  1. Infoga i två orakelbord med en sekvens

  2. ORA-22813:operandvärdet överskrider systemgränserna

  3. 3 sätt att få jobbstegen för ett SQL Server Agent Job (T-SQL)

  4. Vilken är den bästa teckenkodningen för japanska språket för DB-, php- och html-display?