内容提要
本文介绍了Hypersistence Optimizer工具,旨在自动检测Spring、Jakarta EE或Java EE应用中的性能问题,特别是在JPA和Hibernate数据访问层。通过启用Hibernate的JAVA_TIME_USE_DIRECT_JDBC设置,可以直接使用Java 8的日期时间对象,从而提升性能。但需注意,不同数据库对这些对象的支持情况不同。
延伸解读
启用方式与配置要点
该设置可通过编程方式在Spring配置中设置,例如在JPA属性中添加AvailableSettings.JAVA_TIME_USE_DIRECT_JDBC为true;也可在Spring Boot的application.properties中声明spring.jpa.properties.hibernate.type.java_time_use_direct_jdbc=true。启用后,Hibernate将使用SetObjectBinder,通过PreparedStatement.setObject方法直接绑定Ja
数据库兼容性差异
不同数据库对Java 8日期时间对象的支持程度不同。Oracle JDBC驱动允许直接传递LocalDateTime、OffsetDateTime和ZonedDateTime。但SQL Server、PostgreSQL和MySQL不支持将ZonedDateTime绑定到TIMESTAMP_WITH_TIMEZONE列。此外,MySQL JDBC驱动8.0.33不支持Types.TIMESTAMP_WITH_TIMEZONE,因此无法使用OffsetDateTime或ZonedDateTime属性。
使用前的检查建议
在启用JAVA_TIME_USE_DIRECT_JDBC设置前,应检查当前JDBC驱动是否支持绑定所有Java日期/时间对象到SQL语句。如果实体包含ZonedDateTime属性且运行在SQL Server、PostgreSQL或MySQL上,则不应启用该设置。对于MySQL,还需注意驱动版本对TIMESTAMP_WITH_TIMEZONE的支持情况。
Q&A
Hibernate的JAVA_TIME_USE_DIRECT_JDBC设置有什么作用?
该设置允许Hibernate直接使用Java 8的日期时间对象,从而提升性能。
如何在Spring中启用JAVA_TIME_USE_DIRECT_JDBC设置?
可以通过在Spring配置中设置属性spring.jpa.properties.hibernate.type.java_time_use_direct_jdbc=true来启用该设置。
不同数据库对Java 8日期时间对象的支持情况如何?
SQL Server、PostgreSQL和MySQL不支持将ZonedDateTime绑定到TIMESTAMP_WITH_TIMEZONE列。
启用JAVA_TIME_USE_DIRECT_JDBC设置前需要注意什么?
在启用该设置之前,需检查当前JDBC驱动程序是否支持绑定所有Java日期/时间对象。
Hibernate默认如何处理Java 8日期时间对象?
Hibernate默认使用PreparedStatement.setTimestamp方法绑定LocalDateTime、OffsetDateTime和ZonedDateTime对象。
使用JAVA_TIME_USE_DIRECT_JDBC设置后,Hibernate如何绑定日期时间对象?
启用该设置后,Hibernate可以使用PreparedStatement.setObject方法直接绑定Java 8日期时间对象。