JDBCTemplate tárolt eljárásokhoz

"Probléma"

A JDBC driver minden eljárás előtt meghív egy metadata lekérdezést, amivel lekéri, hogy az eljárások milyen nevű és típusú paramétereket várnak, mit adnak vissza, stb. Lehet olyan eset, amikor ez igencsak erőforrásigényes lehet.

lsd: https://stackoverflow.com/questions/11934749/strange-sql-wasting-my-resources

Megoldás

Legyen egy service amiből lehet új jdbccall-t lekérni, amin be van állítva a withoutProcedureColumnMetaDataAccess

@Component
class JdbcCallFactory(
    private val jdbcTemplate: JdbcTemplate
) {
    fun createJdbcCall(): SimpleJdbcCall = SimpleJdbcCall(jdbcTemplate).withoutProcedureColumnMetaDataAccess()
}

Ha ezt a jdbcCall-t használjuk fel, akkor nem lesz több metadata lekérés. Azonban azt figyelemben kell tartani, hogy ha így pl. rossz adattípust adunk meg, hiányzó paraméterünk van, stb. akkor nem az ORA-0xxx jellegű hibaüzenetek fognak visszajönni (ami esetleg a helyi Oracle mágus munkáját megkönnyítheti), hanem a java probál még értelmezhető üzenetet visszaadni, nyilván tök más leírással.

2024-08-12: Igazából ki kellene próbálni, hogy osztályszinten csak simán példányosítunk 1 db SimpleJdbcCall-t, és azt használjuk. Elvileg a metadata lekérés csak egyszer fut le, és utána a SimpleJdbcCall már tudja, hogy milyen paramétereket vár az adott eljárás. Ezzel a megoldással nem kell külön factory-t létrehozni, és az Oracle üzenetek is rendben lesznek kezelve.