現象
啓動org.hibernate.tool.hbm2ddl.TableMetadata 一直在家在什麼東西,特別浪費時間,日誌如下:
09:54:39 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.LOGIN
, 09:54:39 org.hibernate.tool.hbm2ddl.TableMetadata columns: [username, password]
, 09:54:39 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:54:39 org.hibernate.tool.hbm2ddl.TableMetadata indexes: [sys_c0013515]
, 09:54:53 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.NEWMEDIALOGIN
, 09:54:53 org.hibernate.tool.hbm2ddl.TableMetadata columns: [username, email, state, type, password]
, 09:54:53 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:54:53 org.hibernate.tool.hbm2ddl.TableMetadata indexes: [sys_c0029664]
, 09:56:53 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.NEWS_INFO
, 09:56:53 org.hibernate.tool.hbm2ddl.TableMetadata columns: [site, fetchtime, keywords, updatetime, pubdate, plate, url, pubtime, content, contenthtml, title, source, commentshow, commenttotal]
, 09:56:53 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:56:53 org.hibernate.tool.hbm2ddl.TableMetadata indexes: [news_info_index, news_info_primary]
, 09:57:08 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.QZONE_STATISTICS_AGE
, 09:57:08 org.hibernate.tool.hbm2ddl.TableMetadata columns: [createtime, id, numbers, age]
, 09:57:08 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:57:08 org.hibernate.tool.hbm2ddl.TableMetadata indexes: []
, 09:57:24 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.QZONE_STATISTICS_CAREER
, 09:57:24 org.hibernate.tool.hbm2ddl.TableMetadata columns: [createtime, id, numbers, career]
, 09:57:24 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:57:24 org.hibernate.tool.hbm2ddl.TableMetadata indexes: [sys_c0029421]
, 09:57:38 org.hibernate.tool.hbm2ddl.TableMetadata table found: P2PDB.QZONE_STATISTICS_GENDER
, 09:57:38 org.hibernate.tool.hbm2ddl.TableMetadata columns: [createtime, id, numbers, gender]
, 09:57:38 org.hibernate.tool.hbm2ddl.TableMetadata foreign keys: []
, 09:57:38 org.hibernate.tool.hbm2ddl.TableMetadata indexes: [sys_c0029
分析
hibernate配置文件中是否有
<property name="hibernate.hbm2ddl.auto">update</property>
這個配置
其它幾個參數的意思:
- validate 加載hibernate時,驗證創建數據庫表結構
- create 每次加載hibernate,重新創建數據庫表結構
- create-drop 加載hibernate時創建,退出是刪除表結構
- update 加載hibernate自動更新數據庫結構
感覺你在啓動時,去創建或者更新了數據庫中的表而導致啓動時間很長。
如果有,把這行配置去掉試試。
總結:
create:表示啓動的時候先drop,再create
create-drop: 也表示創建,只不過再系統關閉前執行一下drop
- update: 這個操作啓動的時候會去檢查schema是否一致,如果不一致會做scheme更新
- validate: 啓動時驗證現有schema與你配置的hibernate是否一致,如果不一致就拋出異常,並不做更新
在本機開發調試初始化數據的時候可以選擇create、update等。
但是網站發佈正式版本的時候,對數據庫現有的數據或表結構進行自動的更新是很危險的。此時此刻應該由DBA同志通過手工的方式進行後臺的數據庫操作。
hibernate.hbm2ddl.auto的值建議是“none”或“validate”。“validate”應該是最好的選擇:這樣 spring在加載之初,如果model層和數據庫表結構不同,就會報錯,這樣有助於技術運維預先發現問題。