hrnext / it-dgc-verificac19-spring

Java Spring Digital Green Certificate SDK
Apache License 2.0
4 stars 6 forks source link

problema tabella keys #7

Closed enrico-mc closed 2 years ago

enrico-mc commented 2 years ago

Buongiorno, ho un errore sulla tabella keys:

16:12:15,102 INFO  [stdout] (ServerService Thread Pool -- 80)     select

16:12:15,102 INFO  [stdout] (ServerService Thread Pool -- 80)         count(*) as col_0_0_ 

16:12:15,102 INFO  [stdout] (ServerService Thread Pool -- 80)     from

16:12:15,102 INFO  [stdout] (ServerService Thread Pool -- 80)         keys key0_

16:12:15,135 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ServerService Thread Pool -- 80) SQL Error: 1064, SQLState: 42000
16:12:15,135 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ServerService Thread Pool -- 80) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'keys key0_' at line 1
16:12:15,165 ERROR [it.dgc.verificac19.data.VerifierRepositoryImpl] (ServerService Thread Pool -- 80) Fetch validation rules / certificates error: org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

il mio DB è mysql, la tabella blacklist viene usata correttamente, ma sulla keys mi da questo errore. Lo script di creazione è:

CREATE TABLE `keys` (
  `kid` varchar(500) NOT NULL,
  `value` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`kid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

ho già provato anche con:

CREATE TABLE `keys` (
  `kid` varchar(500) NOT NULL,
  `value` BLOB DEFAULT NULL,
  PRIMARY KEY (`kid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Chiedo anche se, per velocizzare test e startup, sia possibile evitare le operazioni iniziali di delete e insert nella blacklist.

Grazie mille in anticipo

marcoserafini2 commented 2 years ago

Ciao @enrico-mc puoi condividermi la configurazione delle proprietà dell'applicativo?

enrico-mc commented 2 years ago

Certo, eccole:

config.base_url=https://get.dgc.gov.it/v1/dgc/
config.server_host=get.dgc.gov.it
config.certificate_sha=sha256/7cZJIDPacG8FS3pq6Mvxg+7yBDM/VYc2alOcbVe/e74=

spring.datasource.url=jdbc:mysql://localhost:3306/verifica-c19
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.data.jpa.repositories.enabled=true
spring.jpa.database-platform=rg.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.jpa.properties.hibernate.format_sql=true

spring.h2.console.enabled=true
logging.level.it.dgc.verificac19.data.remote=DEBUG
marcoserafini2 commented 2 years ago

Purtroppo l'SDK è stato testato solo su H2 & SQLServer & Oracle

Su MySQL come puoi vedere dalla documentazione ufficiale la keyword "keys" è riservata.

La query generate da Hibernate dunque utilzza una keyword riservata mandando in errore l'esecuzione: select count(*) as col_0_0_ from keys key0_

Puoi risolvere utilizzando una proprietà di Hibernate che permette automaticamente di effettuare un backquote di tutte le tabelle / colonne.

Aggiungi questo nel tuo file di configurazione: spring.jpa.properties.hibernate.globally_quoted_identifiers=true

enrico-mc commented 2 years ago

Grazie mille, questo problema è risolto. Ora sto litigando con i timeout di avvio, se riuscirò a risolvere aggiornerò la issue con quanto fatto per configurare l'app su wildfly. Nel frattempo chiedo, è normale che il tempo di avvio dell'applicazione sia così elevato?

marcoserafini2 commented 2 years ago

I test applicativi sono stati fatti utilizzando appunto Spring Boot e quindi l'applicazione viene deployata in un Tomcat embeddato nell'applicazione stessa. Non è stato provato il deploy su un Application Server come Wildfly.

I tempi di start sono immediati non c'è tanta logica applicativa (se non l'inizializzazione dei beans di Spring) Forse il tempo a cui ti riferisci è il task di sincronizzazione dei dati definito nella classe it.dgc.verificac19.worker.LoadKeysWorker Ad SDK avviato, il processo è schedulato ogni 24H (a mezzanotte) come da specifiche di verificac19. Per rendere subito utilizzabile l'applicazione ho aggiunto un primo task di sincronizzazione anche in fase di startup.

Chiudo comunque questa issue relativa a MySQL e la tabella keys, visto che il problema è stato risolto. Se riesci a risolvere i problemi su Wildfly, fai pure una pull request aggiungendo un paragrafo nel file di README per il deploy su Wildfly, o se non riesci a risolvere i problemi di timeout, apri pure una nuova issue.

enrico-mc commented 2 years ago

Perfetto, grazie mille.