WildFly中Hibernate连接MySQL报“No database selected”错误的排查咨询
Hibernate在WildFly部署时执行DDL报错:No database selected
错误日志
GenerationTarget encountered exception accepting command : Error executing DDL " alter table exam_table drop foreign key FKgp6h92beial8lknuhckmukak8" via JDBC [No database selected]
相关配置
persistence.xml
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" version="3.0"> <persistence-unit name="control" transaction-type="JTA"> <jta-data-source>java:jboss/datasources/MySQLDS</jta-data-source> <!-- Entity classes --> <class>com.to.Speciality</class> <class>com.to.Exam</class> <class>com.to.Student</class> <class>com.to.Session</class> <!-- Hibernate Provider Properties --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.use_sql_comments" value="false" /> <!-- Connection Pooling (Optional) --> <property name="hibernate.connection.pool_size" value="10" /> </properties> </persistence-unit> </persistence>
standalone.xml(数据源部分)
<subsystem xmlns="urn:jboss:domain:datasources:7.2"> <datasources> <datasource jndi-name="java:jboss/datasources/MySQLDS" pool-name="MySQLDS" enabled="true" use-java-context="true"> <connection-url>jdbc:mysql://localhost:3306/examdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false</connection-url> <driver>com.mysql</driver> <pool> <min-pool-size>5</min-pool-size> <max-pool-size>20</max-pool-size> </pool> <security user-name="root" password="pwd"/> <validation> <check-valid-connection-sql>USE examdb; SELECT 1</check-valid-connection-sql> <background-validation>true</background-validation> <background-validation-millis>10000</background-validation-millis> </validation> </datasource> <drivers> <driver name="com.mysql" module="com.mysql"> <driver-class>com.mysql.cj.jdbc.Driver</driver-class> <datasource-class>com.mysql.cj.jdbc.MysqlDataSource</datasource-class> </driver> </drivers> </datasources> </subsystem>
已尝试操作
- 确认MySQL中
examdb数据库存在 - 验证standalone.xml的连接URL已指定
examdb - 确认persistence.xml正确引用JTA数据源
java:jboss/datasources/MySQLDS - 确认MySQL JDBC驱动已在WildFly中正确配置为模块
问题
Hibernate执行DDL时无法找到数据库,报错No database selected,请问可能原因是什么?如何修复?
解答
可能原因
- 连接验证SQL干扰连接状态:standalone.xml中配置的
check-valid-connection-sql使用USE examdb; SELECT 1,多条语句的执行可能导致连接池管理的连接丢失默认数据库关联,尤其是MySQL JDBC驱动对多语句执行的处理方式可能引发该问题。 - Hibernate方言版本不兼容:当前使用的
org.hibernate.dialect.MySQLDialect是旧版方言,对于MySQL 8.0+版本存在适配问题,导致DDL执行时未正确绑定数据库。 - 冗余的连接池配置冲突:persistence.xml中配置的
hibernate.connection.pool_size与WildFly内置的连接池管理逻辑冲突,干扰了连接的初始化状态。
修复步骤
简化连接验证SQL
连接URL已指定默认数据库,无需额外执行USE语句,修改standalone.xml中的验证SQL:<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>更新Hibernate方言
若使用MySQL 8.0及以上版本,替换为适配的方言:<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />移除冗余的连接池配置
应用服务器的连接池已负责连接管理,删除persistence.xml中的以下配置:<property name="hibernate.connection.pool_size" value="10" />重启服务器并重新部署
保存配置后重启WildFly,确保新配置生效,再重新部署应用。
内容的提问来源于stack exchange,提问作者Mohamed Mahdi
相关产品推荐
相关产品推荐

