http://springjava.iteye.com/blog/373887
在J2ee应用中,如果采用Hibernate框架,可以自动建立数据库实体与Java实体类的映射关系,大大方便Java程序进行持久化对象访问和操作,从而明显提高企业应用开发效率,减轻Java程序与后台数据库的依赖性。
但是,有时候如果操作不慎,可能造成映射关系不完整(特别是存在外键链接的时候),造成访问数据库对象时程序有Bug。这时,可以通过参数配置,让 Hibernate在每次需要从数据库查询记录或者每次插入、更新数据库记录时,将相应的SQL语句输出到控制台,从而了解具体的数据库操作,更好地进行程序调试。
方法是:
1、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设为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 配置文件中配置如下:
<!-- P6SPY dataSource target -->
< bean id = "dataSourceTarget" class = "org.spring framework.jdbc.datasource.DriverManagerDataSource" >
< property name = "driverClassName"
value = "oracle.jdbc.OracleDriver" />
< property name = "url"
value = "jdbc:oracle:thin:@localhost:1521:testdb" />
< property name = "username" value = "tet" />
< property name = "password" value = "test" />
</ bean >
<!-- dataSource -->
< bean id = "dataSource4develop" class = "com.p6spy .engine.spy.P6DataSource" destroy-method = "close" >
< constructor-arg >
< ref local = "dataSourceTarget" />
</ constructor-arg >
</ bean >
分享到:
相关推荐
hibernate.show_sql 参数用于输出所有 SQL 语句到控制台。其取值为 true 或 false。当设置为 true 时,Hibernate 将输出所有 SQL 语句到控制台,方便开发者调试和优化数据库操作。 3. hibernate.format_sql ...
- 当SQL语句较为复杂时,建议将其抽取为独立的方法或配置文件,以便于维护和复用。 - 对于频繁使用的查询,可以考虑使用缓存机制来提高性能。 通过以上分析可以看出,在Hibernate中使用原生SQL能够更灵活地处理复杂...
本篇将深入探讨如何在Hibernate中调用配置文件中的SQL语句,以此提高代码的可维护性和灵活性。 首先,理解Hibernate的核心概念至关重要。Hibernate是一个对象关系映射(ORM)框架,它将Java对象与关系数据库中的...
在开发和调试基于Hibernate的Java应用时,有时我们需要获取到SQL语句的完整形式,而不仅仅是Hibernate默认输出的参数化形式。在这种情况下,P6Spy是一个非常有用的工具。P6Spy是一个开源的JDBC代理库,它允许我们...
这些配置会捕获Hibernate执行的SQL语句及其参数绑定,从而在控制台看到完整的、参数化的SQL。 在开发环境中,这样的配置非常有用,因为它能帮助我们理解查询行为,定位潜在的性能瓶颈,或者检查数据是否按照预期...
### Hibernate 参数配置详解 #### 一、概述 Hibernate 是一款流行的 Java 持久层框架,它通过提供一套丰富的 API 和配置选项来简化数据库访问。本文档将深入探讨 Hibernate 的核心配置参数及其功能,帮助开发者更...
本篇文章主要探讨如何利用Hibernate实现动态SQL查询,结合XML配置和FREEMARKER模板引擎来生成执行的SQL语句。 一、Hibernate简介 Hibernate作为一款强大的持久层框架,它简化了Java应用程序与数据库之间的交互。...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式来操作数据库,而无需直接编写SQL语句。在这个场景中,我们将探讨如何使用Hibernate与SQL Server 2005数据库进行...
标题中的“监控SQL输出-可以查看HQL转成SQL的结果值”指的是在使用HQL(Hibernate Query Language)进行数据库操作时,如何通过某些工具或手段来观察这些高级查询语句被转换成底层数据库能理解的SQL语句的过程,并对...
3. **`hibernate.format_sql`**:控制输出到日志或控制台的SQL语句是否被格式化。 - 示例: ```properties hibernate.format_sql=true ``` 4. **`hibernate.default_schema`**:指定默认的模式(schema)名称。...
2. **hibernate.show_sql**: 开启此参数,Hibernate将在控制台输出执行的所有SQL语句,便于调试和查看数据库交互情况。值可以是`true`或`false`。 3. **hibernate.format_sql**: 当设置为`true`时,Hibernate会在...
- `hibernate.show_sql`:如果设置为`true`,Hibernate会在控制台输出所有执行的SQL语句,便于调试。 - `hibernate.format_sql`:若设置为`true`,将使输出的SQL格式更美观,易于阅读。 - `hibernate.default_...
本文主要介绍在使用Hibernate框架时,如何针对不同的数据库(如SQL Server和MySQL)进行配置,并实现XML映射语句的编写。 #### 二、Hibernate配置详解 ##### 2.1 MySQL配置 在Hibernate中,配置MySQL作为数据源...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过Java对象来操作数据库,而无需编写大量的SQL语句。当使用Hibernate连接Microsoft SQL Server数据库时,需要特定的JDBC驱动来建立...
- **函数或方法**:在编程语言中创建函数或方法,如在Python中使用def定义函数,Java中使用public void方法,将SQL语句作为参数传递,返回查询结果。 - **存储过程**:在数据库级别进行封装,创建存储过程,将一系列...
**Struts、Hibernate和SQL Server 2005 分页小项目详解** 在软件开发中,尤其是Web应用,数据分页是一项重要的功能,它能够帮助用户有效地浏览大量数据,提高用户体验。本项目以"Struts+Hibernate+SQL Server 2005...
- `hibernate.show_sql`:如果设为`true`,Hibernate会在控制台输出所有执行的SQL语句。 - `hibernate.format_sql`:如果设为`true`,输出格式化的SQL,使日志和控制台的输出更易读。 - `hibernate.default_...
1. **hibernate.dialect**:这个参数指定Hibernate使用的数据库方言(Dialect),确保Hibernate能生成适合特定数据库的SQL语句。例如,如果使用的是MySQL,可以设置为`org.hibernate.dialect.MySQLDialect`。 2. **...
【标题】:“Hibernate查询语句写在配置文件中” 【正文】: Hibernate 是一个流行的 Java 应用程序框架,主要用于简化数据库操作。它提供了一种对象关系映射(ORM)机制,将数据库操作转化为对 Java 对象的操作,...
在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以用Java对象来操作数据库,而无需直接编写SQL语句。本例将详细介绍如何使用Hibernate 3连接到SQL Server数据库...