sql >> Databáze >  >> RDS >> Oracle

Spring JPA Hibernate:pomalý SELECT dotaz

Testoval jsem různé typy DAO (nepublikuji zde kód, protože je tak špinavý):

  • S režimem spánku :~200 ms
  • S (Injected) Spring JDBCTemplate a RowMapper :~70 ms
  • S příkazem Java :~2 ms
  • S Java OracleStatement :~5 ms
  • S Java PreparedStatement :~100 ms
  • S Java PreparedStatement upraveným s velikostí Fetch =5000 :~50 ms
  • S Java OraclePreparedStatement :~100 ms
  • S Java OraclePreparedStatement upravenou pomocí velikosti PreFetch =5000:~170 ms

Poznámky:

  • DAO vložil Spring namísto nové ClientDao() :+30 ms ztraceno (-sick-)
  • Doba připojení k DB:46 ms

Mohl bych použít :

  • Příkaz Java s ručně dezinfikovanými poli.
  • Předběžné připojení při spuštění aplikace
  • Nepoužívejte Spring Injection

Ale :

  • Není skutečně zabezpečeno / bezpečné
  • Rychlé pro malý počet řádků, pomalé mapování ResultSet na entitu na velkém počtu řádků (také mám tento případ použití)

Takže:

Spring JDBCTemplate pomocí RowMapper se zdá být nejlepším řešením pro zvýšení výkonu v konkrétním případě. A můžeme zachovat zabezpečení pro dotazy SQL. Ale k transformaci ResultSet na Entity je potřeba napsat konkrétní RowMapper.

Příklad jarní 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;
    }
}

Příklad klienta 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;
    }
}

Možná to může být lepší, každý návrh je vítán.




  1. Django Import-Export Import Duplicitní hodnota klíče porušuje chybu

  2. EF Core `update-database` na MySql selže s `__EFMigrationsHistory' neexistuje`

  3. Kde je nejbezpečnější místo pro umístění podrobností o připojení MySQL pro PHP

  4. Pokud není zadáno „Pořadí podle“, jaké pořadí vybere dotaz pro vaši sadu záznamů?