<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

     

    在J2ee應用中,如果采用Hibernate框架,可以自動建立數據庫實體與Java實體類的映射關系,大大方便Java程序進行持久化對象訪問和操作,從而明顯提高企業應用開發效率,減輕Java程序與后臺數據庫的依賴性。

    但是,有時候如果操作不慎,可能造成映射關系不完整(特別是存在外鍵鏈接的時候),造成訪問數據庫對象時程序有Bug。這時,可以通過參數配置,讓Hibernate在每次需要從數據庫查詢記錄或者每次插入、更新數據庫記錄時,將相應的SQL語句輸出到控制臺,從而了解具體的數據庫操作,更好地進行程序調試。

    方法是:
    1、打開hibernate.cfg.xml文件編輯界面,在Properties窗口處,點擊Add按鈕,選擇Show_SQL參數,輸入值為True。如下圖:


    2、保存hibernate.cfg.xml。

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

    另外,如果按照同樣的步驟,分別加入以下參數,可以讓SQL語句更加完美:
    1)參數:format_sql=true                      使SQL語句格式更加美觀統一;
    2)參數:use_sql_comments=true       使SQL語句中自動注入注釋,增加可讀性
    下圖是輸出結果的例子:


    除此之外,Hibernate還有很多參數,通過合理配置這些參數,可以對提高Hibernate框架下對象的效率,從而實現對J2ee應用的優化。
    這些參數如下:
    Java,IdeaGrace,web,開發,技術,交流,教程 - http://www.ideagrace.com
    參數 用途
    hibernate.dialect 一個Hibernate Dialect類名允許Hibernate針對特定的關系數據庫生成優化的SQL. 取值 full.classname.of.Dialect
    hibernate.show_sql 輸出所有SQL語句到控制臺. 有一個另外的選擇是把org.hibernate.SQL這個log category設為debugeg. 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意味著將關閉默認的外連接抓取. 取值 建議在03之間取值
    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的批量更新. 取值 建議取530之間的值
    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


    (完)

        雖然在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.springframework.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> 
    posted on 2008-02-18 14:33 蘆葦 閱讀(18116) 評論(3)  編輯  收藏 所屬分類: Hibernate

    Feedback

    # re: 讓Hibernate輸出SQL語句以便更加深入調試程序----參數配置 2013-12-26 13:48 liangO
    寫得挺好的啊.

    圖片沒有顯示出來哦.  回復  更多評論
      

    # re: 讓Hibernate輸出SQL語句以便更加深入調試程序----參數配置 2015-05-25 09:44 asd
    dasdsacdsa  回復  更多評論
      

    # re: 讓Hibernate輸出SQL語句以便更加深入調試程序----參數配置 2015-05-25 09:44 asd
    zxcerfasdasd  回復  更多評論
      

    主站蜘蛛池模板: 午夜免费福利小电影| 2022免费国产精品福利在线| 免费网站看av片| 日本亚洲视频在线| 99久久婷婷免费国产综合精品| 免费在线观看一级毛片| 日本一区二区三区免费高清在线 | 国产一级一毛免费黄片| 久久久久久亚洲精品不卡| www在线观看播放免费视频日本| 亚洲国产香蕉人人爽成AV片久久 | 久久精品视频亚洲| 亚欧免费一级毛片| 亚洲国产av美女网站| 免费观看黄网站在线播放| 亚洲日韩AV一区二区三区四区| 在线观看人成视频免费| 国产精品亚洲专区在线播放| 亚洲日本一区二区一本一道| 三年片免费高清版| 亚洲制服丝袜精品久久| 麻豆国产VA免费精品高清在线| 色老头综合免费视频| 亚洲AV无码久久精品狠狠爱浪潮| 99国产精品免费视频观看| 亚洲国产系列一区二区三区 | 国产91免费在线观看| 亚洲精品成a人在线观看☆| 免费看小12萝裸体视频国产| 国产成人无码区免费内射一片色欲| 亚洲五月六月丁香激情| 久久精品无码一区二区三区免费| 午夜亚洲乱码伦小说区69堂| 亚洲国产精品国自产拍AV| 毛片免费全部播放一级| 人妻免费久久久久久久了| 中文字幕亚洲色图| 国产一区在线观看免费| 久操免费在线观看| 色欲色欲天天天www亚洲伊| 亚洲AV无码久久|