如何通过Hibernate配置MariaDB驱动属性、Aurora MySQL只读连接及连接池
Let's break down your two key requirements and fix the issues in your current configuration:
1. 配置只读连接以从Aurora副本获取数据
Your current attempt using hibernate.connection.assureReadOnly=true doesn't work because this property only ensures a connection stays in read-only mode once it's been marked as such—it doesn't actually enable read-only behavior on its own. Here's how to properly set this up:
正确配置步骤:
- 启用Hibernate只读连接:添加
hibernate.connection.readOnly=true属性。这会告诉Hibernate将JDBC连接标记为只读,Aurora会利用这个标记,通过集群端点将查询路由到只读副本。 - 可选:通过JDBC URL强制只读:为了进一步确保只读特性,可以直接在JDBC URL中添加
readOnly=true参数,让驱动本身强制连接处于只读模式。 - 保留
assureReadOnly(可选):如果希望Hibernate在使用连接前再次确认其只读状态,可以在设置readOnly=true的同时保留hibernate.connection.assureReadOnly=true。
修改后的连接配置片段:
<!-- Database Connection Settings --> <property name="hibernate.connection.driver_class">org.mariadb.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:aurora://xxxxx:3306/dbname?readOnly=true</property> <property name="hibernate.connection.username">xxxxx</property> <property name="hibernate.connection.password">xxxxx</property> <property name="hibernate.connection.readOnly">true</property> <property name="hibernate.connection.assureReadOnly">true</property> <property name="hibernate.connection.autoReconnect">true</property> <property name="hibernate.connection.autocommit">false</property>
验证方法:
在应用中执行SELECT @@aurora_server_id查询,返回的结果是当前连接的Aurora实例ID。将其与AWS控制台中的副本ID对比,即可确认是否连接到了只读副本。
2. 在Hibernate中使用MariaDB官方连接池
你当前使用的hibernate.connection.pool=true是Hibernate自带的 legacy 连接池,不推荐用于生产环境。MariaDB Connector/J提供了专门的生产级连接池,配置方式如下:
第一步:添加依赖
如果使用Maven,在pom.xml中添加以下依赖(请使用最新稳定版本):
<dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>3.3.3</version> <!-- 替换为最新版本 --> </dependency>
第二步:配置Hibernate使用MariaDB连接池
替换现有池相关配置,设置连接提供者类为MariaDB的池提供者,然后配置池参数:
<!-- MariaDB连接池配置 --> <property name="hibernate.connection.provider_class">org.mariadb.jdbc.MariaDbDataSourcePoolProvider</property> <property name="hibernate.connection.minPoolSize">2</property> <property name="hibernate.connection.maxPoolSize">5</property> <property name="hibernate.connection.poolName">MyConnectionPool</property> <property name="hibernate.connection.maxIdleTime">7000</property> <!-- 删除旧的hibernate.connection.pool=true属性 -->
关键说明:
MariaDbDataSourcePoolProvider告诉Hibernate使用MariaDB原生连接池,而非内置的 legacy 池。- 所有池参数仍使用
hibernate.connection.前缀,直接映射到MariaDB池的配置项。 - 务必删除
hibernate.connection.pool=true,它属于旧池配置,会与MariaDB池冲突。
完整修改后的hibernate.cfg.xml
以下是整合了两个修复后的完整配置文件:
<hibernate-configuration> <session-factory> <!-- SQL Dialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- Database Connection Settings --> <property name="hibernate.connection.driver_class">org.mariadb.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:aurora://xxxxx:3306/dbname?readOnly=true</property> <property name="hibernate.connection.username">xxxxx</property> <property name="hibernate.connection.password">xxxxx</property> <property name="hibernate.connection.readOnly">true</property> <property name="hibernate.connection.assureReadOnly">true</property> <property name="hibernate.connection.autoReconnect">true</property> <property name="hibernate.connection.autocommit">false</property> <!-- MariaDB Connection Pool --> <property name="hibernate.connection.provider_class">org.mariadb.jdbc.MariaDbDataSourcePoolProvider</property> <property name="hibernate.connection.minPoolSize">2</property> <property name="hibernate.connection.maxPoolSize">5</property> <property name="hibernate.connection.poolName">MyConnectionPool</property> <property name="hibernate.connection.maxIdleTime">7000</property> <property name="show_sql">true</property> <!-- Specifying Session Context --> <property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property> <!-- Mapping With Model Class Containing Annotations --> <mapping class="com.xxx.aurora.beans.xxx" /> <mapping class="com.xxx.aurora.beans.User" /> </session-factory> </hibernate-configuration>
内容的提问来源于stack exchange,提问作者Prabha_Catalina

