讓Hibernate輸出SQL語句參數配置

在J2ee應用中,若是採用Hibernate框架,能夠自動創建數據庫實體與Java實體類的映射關係,大大方便Java程序進行持久化對象訪問和操做,從而明顯提升企業應用開發效率,減輕Java程序與後臺數據庫的依賴性。 html

 但 是,有時候若是操做不慎,可能形成映射關係不完整(特別是存在外鍵連接的時候),形成訪問數據庫對象時程序有Bug。這時,能夠經過參數配置,讓 Hibernate在每次須要從數據庫查詢記錄或者每次插入、更新數據庫記錄時,將相應的SQL語句輸出到控制檯,從而瞭解具體的數據庫操做,更好地進行 程序調試。 java

 方法是:
 一、Show_SQL 參數,輸入值爲True 。
  mysql


二、保存hibernate.cfg.xml。 web

 這時,再次運行你的程序,在控制檯視圖中將會顯示相應的SQL語句。 spring

 另外,若是按照一樣的步驟,分別加入如下參數,可讓SQL語句更加完美:
 1)參數:format_sql=true                      使SQL語句格式更加美觀統一;
 
2)參數:use_sql_comments=true       使SQL語句中自動注入註釋,增長可讀性 sql

 除此以外,Hibernate還有不少參數,經過合理配置這些參數,能夠對提升Hibernate框架下對象的效率,從而實現對J2ee應用的優化。
 這些參數以下:
Java,IdeaGrace,web,開發,技術,交流,教程 - http://www.ideagrace.com 數據庫

 

參數 用途 緩存

 

hibernate.dialect tomcat

一個Hibernate Dialect 類名容許Hibernate針對特定的關係數據庫生成優化的SQL. 取值full.classname.of.Dialect
  安全


hibernate.show_sql

輸出全部SQL語句到控制檯. 有一個另外的選擇是把org.hibernate.SQL 這個log category設爲debug 。 eg.true | false
 


hibernate.format_sql

在log和console中打印出更漂亮的SQL。 取值true | false

 

hibernate.default_schema

在生成的SQL中, 將給定的schema/tablespace附加於非全限定名的表名上. 取值SCHEMA_NAME

 

hibernate.default_catalog

在生成的SQL中, 將給定的catalog附加於非全限定名的表名上. 取值CATALOG_NAME

 

hibernate.session_factory_name

SessionFactory 建立後,將自動使用這個名字綁定到JNDI中. 取值jndi/composite/name

 

hibernate.max_fetch_depth

爲單向關聯(一對一, 多對一)的外鏈接抓取(outer join fetch)樹設置最大深度. 值爲0 意味着將關閉默認的外鏈接抓取. 取值 建議在0 到3 之間取值

 

hibernate.default_batch_fetch_size

爲Hibernate關聯的批量抓取設置默認數量. 取值 建議的取值爲4 , 8 , 和16

 

hibernate.default_entity_mode

爲由這個SessionFactory 打開的全部Session指定默認的實體表現模式. 取值dynamic-map , dom4j , pojo

 

hibernate.order_updates

強制Hibernate按照被更新數據的主鍵,爲SQL更新排序。這麼作將減小在高併發系統中事務的死鎖。 取值true | false

 

hibernate.generate_statistics

若是開啓, Hibernate將收集有助於性能調節的統計數據. 取值true | false

 

hibernate.use_identifer_rollback

若是開啓, 在對象被刪除時生成的標識屬性將被重設爲默認值. 取值true | false

 

hibernate.use_sql_comments

若是開啓, Hibernate將在SQL中生成有助於調試的註釋信息, 默認值爲false . 取值true | false

 

表 3.4. Hibernate JDBC和鏈接(connection)屬性

 

屬性名 用途

 

hibernate.jdbc.fetch_size

非零值,指定JDBC抓取數量的大小 (調用Statement.setFetchSize() ).

 

hibernate.jdbc.batch_size

非零值,容許Hibernate使用JDBC2的批量更新. 取值 建議取5 到30 之間的值

 

hibernate.jdbc.batch_versioned_data

若是你想讓你的JDBC驅動從executeBatch() 返回正確的行計數 , 那麼將此屬性設爲true (開啓這個選項一般是安全的). 同時,Hibernate將爲自動版本化的數據使用批量DML. 默認值爲false . eg.true | false
 


hibernate.jdbc.factory_class

選擇一個自定義的Batcher . 多數應用程序不須要這個配置屬性. eg.classname.of.Batcher

 

hibernate.jdbc.use_scrollable_resultset

容許Hibernate使用JDBC2的可滾動結果集. 只有在使用用戶提供的JDBC鏈接時,這個選項纔是必要的, 不然Hibernate會使用鏈接的元數據. 取值true | false
 


hibernate.jdbc.use_streams_for_binary

在JDBC讀寫binary (二進制) 或serializable (可序列化) 的類型時使用流(stream)(系統級屬性). 取值true | false

 

hibernate.jdbc.use_get_generated_keys

在數據插入數據庫以後,容許使用JDBC3 PreparedStatement.getGeneratedKeys() 來獲取數據庫生成的key(鍵)。須要JDBC3+驅動和JRE1.4+, 若是你的數據庫驅動在使用Hibernate的標 識生成器時遇到問題,請將此值設爲false. 默認狀況下將使用鏈接的元數據來斷定驅動的能力. 取值true|false
 


hibernate.connection.provider_class

自定義ConnectionProvider 的類名, 此類用來向Hibernate提供JDBC鏈接. 取值classname.of.ConnectionProvider
 


hibernate.connection.isolation

設置JDBC事務隔離級別. 查看java.sql.Connection 來了解各個值的具體意義, 但請注意多數數據庫都不支持全部的隔離級別. 取值1, 2, 4, 8
 


hibernate.connection.autocommit

容許被緩存的JDBC鏈接開啓自動提交(autocommit) (不建議). 取值true | false

 

hibernate.connection.release_mode

指定Hibernate在什麼時候釋放JDBC鏈接. 默認狀況下,直到Session被顯式關閉或被斷開鏈接時,纔會釋放JDBC鏈接. 對於應用程序服務器的JTA數據源, 你應當使用after_statement , 這樣在每次JDBC調用後,都會主動的釋放鏈接. 對於非JTA的鏈接, 使用after_transaction 在每一個事務結束時釋放鏈接是合理的. auto 將爲JTA和CMT事務策略選擇after_statement , 爲JDBC事務策略選擇after_transaction . 取值on_close | after_transaction | after_statement | auto
 


hibernate.connection.<propertyName>

將JDBC屬性propertyName 傳遞到DriverManager.getConnection() 中去.

 

hibernate.jndi.<propertyName>

將屬性propertyName 傳遞到JNDI InitialContextFactory 中去.

 

表 3.5. Hibernate緩存屬性

 

屬性名 用途

 

hibernate.cache.provider_class

自定義的CacheProvider 的類名. 取值classname.of.CacheProvider

 

hibernate.cache.use_minimal_puts

以頻繁的讀操做爲代價, 優化二級緩存來最小化寫操做. 在Hibernate3中,這個設置對的集羣緩存很是有用, 對集羣緩存的實現而言,默認是開啓的. 取值true|false
 


hibernate.cache.use_query_cache

容許查詢緩存, 個別查詢仍然須要被設置爲可緩存的. 取值true|false

 

hibernate.cache.use_second_level_cache

能用來徹底禁止使用二級緩存. 對那些在類的映射定義中指定<cache> 的類,會默認開啓二級緩存. 取值true|false

 

hibernate.cache.query_cache_factory

自定義實現QueryCache 接口的類名, 默認爲內建的StandardQueryCache . 取值classname.of.QueryCache

 

hibernate.cache.region_prefix

二級緩存區域名的前綴. 取值prefix

 

hibernate.cache.use_structured_entries

強制Hibernate以更人性化的格式將數據存入二級緩存. 取值true|false

 

表 3.6. Hibernate事務屬性

 

屬性名 用途

 

hibernate.transaction.factory_class

一個TransactionFactory 的類名, 用於Hibernate Transaction API (默認爲JDBCTransactionFactory ). 取值classname.of.TransactionFactory
 


jta.UserTransaction

一個JNDI名字,被JTATransactionFactory 用來從應用服務器獲取JTA UserTransaction . 取值jndi/composite/name
 


hibernate.transaction.manager_lookup_class

一個TransactionManagerLookup 的類名 - 當使用JVM級緩存,或在JTA環境中使用hilo生成器的時候須要該類. 取值classname.of.TransactionManagerLookup
 


hibernate.transaction.flush_before_completion

若是開啓, session在事務完成後將被自動清洗(flush)。 如今更好的方法是使用自動session上下文管理。取值true | false

 

hibernate.transaction.auto_close_session

若是開啓, session在事務完成後將被自動關閉。 如今更好的方法是使用自動session上下文管理。取值true | false

 

表 3.7. 其餘屬性

 

屬性名 用途

 

hibernate.current_session_context_class

爲"當前" Session 指定一個(自定義的)策略。eg.jta | thread | custom.Class

 

hibernate.query.factory_class

選擇HQL解析器的實現. 取值org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory
 


hibernate.query.substitutions

將Hibernate查詢中的符號映射到SQL查詢中的符號 (符號多是函數名或常量名字). 取值hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
 


hibernate.hbm2ddl.auto

在SessionFactory 建立時,自動檢查數據庫結構,或者將數據庫schema的DDL導出到數據庫. 使用 create-drop 時,在顯式關閉SessionFactory 時,將drop掉數據庫schema. 取值validate | update | create | create-drop
 


hibernate.cglib.use_reflection_optimizer

開啓CGLIB來替代運行時反射機制(系統級屬性). 反射機制有時在除錯時比較有用. 注意即便關閉這個優化, Hibernate仍是須要CGLIB. 你不能在hibernate.cfg.xml 中設置此屬性. 取值true | false
 

 

 

3.4.1. SQL方言

你應當老是爲你的數據庫將hibernate.dialect 屬性設置成正確的 org.hibernate.dialect.Dialect 子類. 若是你指定一種方言, Hibernate將爲上面列出的一些屬性使用合理的默認值, 爲你省去了手工指定它們的功夫.


表 3.8. Hibernate SQL方言 (hibernate.dialect )

 

RDBMS 方言

 

DB2
 
org.hibernate.dialect.DB2Dialect

 

DB2 AS/400
 
org.hibernate.dialect.DB2400Dialect

 

DB2 OS390
 
org.hibernate.dialect.DB2390Dialect

 

PostgreSQL
 
org.hibernate.dialect.PostgreSQLDialect

 

MySQL
 
org.hibernate.dialect.MySQLDialect

 

MySQL with InnoDB
 
org.hibernate.dialect.MySQLInnoDBDialect

 

MySQL with MyISAM
 
org.hibernate.dialect.MySQLMyISAMDialect

 

Oracle (any version)
 
org.hibernate.dialect.OracleDialect

 

Oracle 9i/10g
 
org.hibernate.dialect.Oracle9Dialect

 

Sybase
 
org.hibernate.dialect.SybaseDialect

 

Sybase Anywhere
 
org.hibernate.dialect.SybaseAnywhereDialect

 

Microsoft SQL Server
 
org.hibernate.dialect.SQLServerDialect

 

SAP DB
 
org.hibernate.dialect.SAPDBDialect

 

Informix
 
org.hibernate.dialect.InformixDialect

 

HypersonicSQL
 
org.hibernate.dialect.HSQLDialect

 

Ingres
 
org.hibernate.dialect.IngresDialect

 

Progress
 
org.hibernate.dialect.ProgressDialect

 

Mckoi SQL
 
org.hibernate.dialect.MckoiDialect

 

Interbase
 
org.hibernate.dialect.InterbaseDialect

 

Pointbase
 
org.hibernate.dialect.PointbaseDialect

 

FrontBase
 
org.hibernate.dialect.FrontbaseDialect

 

Firebird
 
org.hibernate.dialect.FirebirdDialect

 

表 3.9. Hibernate日誌類別

 

類別 功能

 

org.hibernate.SQL

在全部SQL DML語句被執行時爲它們記錄日誌

 

org.hibernate.type

爲全部JDBC參數記錄日誌

 

org.hibernate.tool.hbm2ddl

在全部SQL DDL語句執行時爲它們記錄日誌

 

org.hibernate.pretty

在session清洗(flush)時,爲全部與其關聯的實體(最多20個)的狀態記錄日誌

 

org.hibernate.cache

爲全部二級緩存的活動記錄日誌

 

org.hibernate.transaction

爲事務相關的活動記錄日誌

 

org.hibernate.jdbc

爲全部JDBC資源的獲取記錄日誌

 

org.hibernate.hql.AST

在解析查詢的時候,記錄HQL和SQL的AST分析日誌

 

org.hibernate.secure

爲JAAS認證請求作日誌

 

org.hibernate

爲任何Hibernate相關信息作日誌 (信息量較大, 但對查錯很是有幫助)


表 3.10. JTA TransactionManagers

 

Transaction工廠類 應用程序服務器

 

org.hibernate.transaction.JBossTransactionManagerLookup

JBoss
 


org.hibernate.transaction.WeblogicTransactionManagerLookup

Weblogic
 


org.hibernate.transaction.WebSphereTransactionManagerLookup

WebSphere
 


org.hibernate.transaction.WebSphereExtendedJTATransactionLookup

WebSphere 6
 


org.hibernate.transaction.OrionTransactionManagerLookup

Orion
 


org.hibernate.transaction.ResinTransactionManagerLookup

Resin
 


org.hibernate.transaction.JOTMTransactionManagerLookup

JOTM
 


org.hibernate.transaction.JOnASTransactionManagerLookup

JOnAS
 


org.hibernate.transaction.JRun4TransactionManagerLookup

JRun4
 


org.hibernate.transaction.BESTransactionManagerLookup

Borland ES
 

 

(完)
 

採用p6spy完整顯示hibernate的SQL語句

    雖然在hibernate中有show_sql選項,可是顯示出來的語句大多相似
     select * from xxx where value=?
     可是有時候咱們須要獲得完整的SQL語句,怎麼辦呢?使用P6SPY就能夠完成這個任務
 
    p6spy是一個開源軟件,它能夠跟蹤任何使用jdbc的應用產生的數據庫操做。特別適合於監控ejb服務器產生的 sql statements。
     官方網址:http://www.p6spy.com/
    目前p6spy 適用的應用服務器包括jboss, atg, orion, jonas, iplanet, weblogic, websphere, resin and tomcat.
 
下面我介紹一下p6spy在tomcat應用程序上安裝的步驟:
 (1)http://www.p6spy.com/download.html ,下載zip包
 (2)解壓出p6spy.jar spy.properties兩個文件
 (3)將p6spy.jar 放入應用程序的WEB-INF/lib目錄,將spy.properties放入WEB-INF/classes目錄
 (4)修改spy.properties
 
    realdriver  =com.mysql.jdbc.Driver  將這行前面的#去掉
     logfile     = c:/spy.log  修改一個你須要的日誌文件名
    
(5)修改hibernate.xml,修改connection.driver_class的值爲com.p6spy.engine.spy.P6SpyDriver
 (6)重啓tomcat
 (7)這樣在c:/下的spy.log記錄了數據庫的訪問狀況。
 
 
 
 
 
-----------------------------------------
 
1.下載附件的p6psy.jar以及spy.properties文件
 
2.將p6spy .jar放到應用的lib目錄下,將spy.properties放到WEB-INF\classes目錄下
 
3.修改spy.properties樣本的第41行。改爲須要的數據庫信息
修改spy.properties樣本的第54行 。改爲須要的數據庫信息

 修改spy.properties樣本的第168行,將spy.log放到比較好找的位置:
例如:logfile = E:/spy.log
 
4.驅動程序加載前後的問題解決
  若是spy.log裏出現
  你的程序的數據庫驅動名稱 is a real driver in spy.properties, but it has been loaded before p6spy . p6spy will not wrap these connections. Either prevent the driver from loading, or try setting 'deregisterdrivers' to true in spy.properties
  請把spy.properties文件裏的deregisterdrivers=false改成deregisterdrivers=true,從新運行便可。
 
5.在spring 配置文件中配置以下:
 1. <!-- P6SPY dataSource target -->       
2.      < bean id = "dataSourceTarget" class = "org.spring framework.jdbc.datasource.DriverManagerDataSource" >      
 3.          < property name = "driverClassName"      
 4.              value = "oracle.jdbc.OracleDriver" />      
 5.          < property name = "url"      
 6.              value = "jdbc:oracle:thin:@localhost :1521:testdb" />        7.          < property name = "username" value = "tet" />        8.          < property name = "password" value = "test" />        9.      </ bean >        10.             11.      <!--   dataSource -->        12.      < bean id = "dataSource4develop" class = "com.p6spy .engine.spy.P6DataSource" destroy-method = "close" >           13.          < constructor-arg >           14.              < ref local = "dataSourceTarget" />           15.          </ constructor-arg >           16.      </ bean >  

相關文章
相關標籤/搜索