Mysql
 sql >> Base de données >  >> RDS >> Mysql

Non-concordance entre les valeurs DATETIME dans les bases de données H2 et MySQL insérées à partir de Java/Kotlin

Il semble donc que le correctif consistait à définir le fuseau horaire UTC pour la connexion JDBC (au lieu de JVM) :

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

et il repose sur l'utilisation de Instant pour conserver la valeur côté Java et avec created_at champ de type DATETIME dans MySQL et H2.

Le code kotlin résultant raccourci est :

@Entity
data class SomeEntity(
    val createdAt: Instant = Instant.now() // default created date is current UTC time
)

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss")

createdAt = LocalDateTime.parse("2012-11-30 16:13:21", dateTimeFormatter).toInstant(ZoneOffset.UTC)

Idées tirées des commentaires de "Joop Eggen", ceci et ceci article.

Bonus

Je suppose que si vous lisez ceci, vous pourriez également avoir besoin d'aide pour le débogage des requêtes SQL.

1. Pour imprimer les requêtes SQL exécutées sur H2, ajoutez TRACE_LEVEL_FILE=2 et TRACE_LEVEL_SYSTEM_OUT=2 à la chaîne de connexion (voir ici ):

spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;

2. Pour activer les journaux d'hibernation :

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type=TRACE

3. Pour activer les journaux de requêtes dans MySQL (l'une des approches, ne pas utiliser sur la base de données de production !) :

SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;