hbm2ddl.auto=update 報錯排查:Schema 更新衝突與資料庫連接池耗盡hbm2ddl.auto=create 正常,改為 update 即報錯(但仍能執行)。10061(連接被拒絕/連接池耗盡)。update 嘗試比對實體與資料庫結構,若實體註解(@Column, @Table)與現有表結構不一致(型別、長度、預設值、外鍵),Hibernate 可能執行 ALTER TABLE 失敗、鎖表、或產生無效 DDL,導致後續 Session 建立失敗。session.close()、sessionFactory.close() 僅在 @After 呼叫,若測試方法拋出異常、@After 未執行,Session 不會關閉,連接不歸還池中,累積導致連接池耗盡(10061)。update 執行 DDL 時可能持有元資料鎖,若事務未提交/回滾,鎖持有至連接關閉,並發測試時互相阻塞。wait_timeout 過短: 連接池閒置連接被 MySQL 主動斷開,Hibernate 未驗證連接有效性(validationQuery),再用時拋錯。<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.generate_statistics">true</property>
觀察 update 產生的 ALTER TABLE 是否報錯。<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property>
或 HikariCP:
<property name="hibernate.hikari.maximumPoolSize">20</property>
<property name="hibernate.hikari.idleTimeout">300000</property>
<property name="hibernate.hikari.connectionTestQuery">SELECT 1</property>
validate 模式驗證: hbm2ddl.auto=validate 僅檢查一致性,**不修改資料庫**,適合生產/測試環境。開發階段用 update,但需配合資料庫遷移工具(Flyway/Liquibase)管理 Schema 版本。try-with-resources (Java 7+) 或 finally 區塊保證 session.close() 執行。@Test
public void testSaveStudents() {
Session session = null;
Transaction tx = null;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
Students s = new Students();
s.setSname("POLY Ma");
// ... set other fields
session.save(s);
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
if (session != null) session.close(); // 必須關閉
}
}
update,生產嚴禁**——改用 Flyway/Liquibase 版本化遷移。try-finally 或 Spring @Transactional 管理。update 產生危險 DDL。參考: CSDN 相關文章