??xml version="1.0" encoding="utf-8" standalone="yes"?>av福利在线播放,日韩一区二区三免费高清,一区国产精品http://www.aygfsteel.com/qq66921494/zh-cnSat, 21 Jun 2025 18:28:35 GMTSat, 21 Jun 2025 18:28:35 GMT60关于数据库的优化http://www.aygfsteel.com/qq66921494/archive/2008/10/21/235568.htmljava民工java民工Mon, 20 Oct 2008 16:46:00 GMThttp://www.aygfsteel.com/qq66921494/archive/2008/10/21/235568.htmlhttp://www.aygfsteel.com/qq66921494/comments/235568.htmlhttp://www.aygfsteel.com/qq66921494/archive/2008/10/21/235568.html#Feedback0http://www.aygfsteel.com/qq66921494/comments/commentRss/235568.htmlhttp://www.aygfsteel.com/qq66921494/services/trackbacks/235568.html 本文首先讨论了基于第三范式的数据库表的基本设计,着重论qC建立主键和烦引的{略和方案,然后从数据库表的扩展设计和库表对象的攄{角度概qC数据库管理系l的优化Ҏ?
关键词: 优化QOptimizingQ?W三范式Q?NFQ?冗余数据QRedundant DataQ?索引QIndexQ?数据分割QData PartitioningQ?对象攄QObject PlacementQ?
1 引言
数据库优化的目标无非是避免磁盘I/O瓉、减CPU利用率和减少资源竞争。ؓ了便于读者阅d理解Q笔者参阅了Sybase、Informix和Oracle{大型数据库pȝ参考资料,Z多年的工E实늻验,从基本表设计、扩展设计和数据库表对象攄{角度进行讨论,着重讨Z如何避免盘I/O瓉和减资源竞争,怿读者会一目了然?
2 ZW三范式的基本表设计
在基于表驱动的信息管理系l(MISQ中Q基本表的设计规范是W三范式Q?NFQ。第三范式的基本特征是非主键属性只依赖于主键属性。基于第三范式的数据库表设计h很多优点Q一是消除了冗余数据Q节省了盘存储I间Q二是有良好的数据完整性限Ӟ卛_于主外键的参照完整限制和Z主键的实体完整性限Ӟq得数据容易维护,也容易移植和更新Q三是数据的可逆性好Q在做连接(JoinQ查询或者合q表时不遗漏、也不重复;四是因消除了冗余数据Q冗余列Q,在查询(SelectQ时每个数据存的数据行多Q这样就有效地减了逻辑I/OQ每个Cash存的面多Q也减少物理I/OQ五是对大多C?Transaction)而言Q运行性能好;六是物理设计(Physical Design)的机动性较大,能满x益增长的用户需求?
在基本表设计中,表的主键、外键、烦引设计占有非帔R要的CQ但pȝ设计人员往往只注重于满用户要求Q而没有从pȝ优化的高度来认识和重视它们。实际上Q它们与pȝ的运行性能密切相关。现在从pȝ数据库优化角度讨些基本概念及光要意义:
Q?Q主?Primary Key)Q主键被用于复杂的SQL语句Ӟ频繁地在数据讉K中被用到。一个表只有一个主键。主键应该有固定|不能为Null或缺省|要有相对E_性)Q不含代码信息,易访问。把常用Q众所周知Q的列作Z键才有意义。短主键最佻I于25bytesQ,主键的长短媄响烦引的大小Q烦引的大小影响索引늚大小Q从而媄响磁盘I/O。主键分然主键和Zؓ主键。自然主键由实体的属性构成,自然主键可以是复合性的Q在形成复合主键Ӟ主键列不能太多,复合主键使得Join*作复杂化、也增加了外键表的大。hZ键是Q在没有合适的自然属性键、或自然属性复杂或灉|度高ӞZؓ形成的。hZ键一般是整型|满最化要求Q,没有实际意义Q也略微增加了表的大;但减了把它作ؓ外键的表的大?
Q?Q外键(Foreign KeyQ:外键的作用是建立关系型数据库中表之间的关p(参照完整性)Q主键只能从独立的实体迁Ud非独立的实体Q成为后者的一个属性,被称为外键?
Q?Q烦?Index)Q利用烦引优化系l性能是显而易见的Q对所有常用于查询中的Where子句的列和所有用于排序的列创建烦引,可以避免整表扫描或访问,在不改变表的物理l构的情况下Q直接访问特定的数据列,q样减少数据存取旉Q利用烦引可以优化或排除耗时的分c?作;把数据分散到不同的页面上Q就分散了插入的数据Q主键自动徏立了唯一索引Q因此唯一索引也能保数据的唯一性(卛_体完整性)Q烦引码小Q定位就直接;新徏的烦引效能最好,因此定期更新索引非常必要。烦引也有代P有空间开销Q徏立它也要p旉Q在q行Insert、Delete和Update*作时Q也有维护代仗烦引有两种Q聚族烦引和非聚族烦引。一个表只能有一个聚族烦引,可有多个非聚族烦引。用聚族烦引查询数据要比用非聚族索引快。在建烦引前Q应利用数据库系l函C烦引的大小?
?聚族索引QClustered IndexQ:聚族索引的数据页按物理有序储存,占用I间。选择{略是,被用于Where子句的列Q包括范围查询、模p查询或高度重复的列Q连l磁盘扫描)Q被用于q接Join*作的列;被用于Order by和Group by子句的列。聚族烦引不利于插入*作,另外没有必要用主键徏聚族索引?
?非聚族烦引(Nonclustered IndexQ:与聚族烦引相比,占用I间大,而且效率低。选择{略是,被用于Where子句的列Q包括范围查询、模p查询(在没有聚族烦引时Q、主键或外键列、点Q指针类Q或范_q回的结果域于整表数据?0%Q查询;被用于连接Join*作的列、主键列Q范围查询)Q被用于Order by和Group by子句的列Q需要被覆盖的列。对只读表徏多个非聚族烦引有利。烦引也有其弊端Q一是创建烦引要耗费旉Q二是烦引要占有大量盘I间Q三是增加了l护代hQ在修改带烦引的数据列时索引会减~修攚w度Q。那么,在哪U情况下不徏索引呢?对于表Q数据小?)、小C表(不直接访问单行数据或l果集不用排序)、单值域Q返回值密集)、烦引列值太长(大于20bitysQ、容易变化的列、高度重复的列、Null值列Q对没有被用于Where子语句和Join查询的列都不能徏索引。另外,对主要用于数据录入的Q尽可能徏索引。当Ӟ也要防止建立无效索引Q当Where语句中多?个条件时Q维护烦引的开销大于索引的效益,q时Q徏立时表存储有关数据更有效?
扚w导入数据时的注意事项Q在实际应用中,大批量的计算Q如电信话单计费Q用C语言E序做,q种Zd键关pL据计而得的批量数据(文本文gQ,可利用系l的自n功能函数Q如Sybase的BCP命oQ快速批量导入,在导入数据库表时Q可先删除相应库表的索引Q这有利于加快导入速度Q减导入时间。在导入后再重徏索引以便优化查询?
Q?Q锁Q锁是ƈ行处理的重要机制Q能保持数据q发的一致性,x事务q行处理Q系l利用锁Q保证数据完整性。因此,我们避免不了死锁Q但在设计时可以充分考虑如何避免长事务,减少排它锁时_减少在事务中与用L交互Q杜l让用户控制事务的长短;要避免批量数据同时执行,其是耗时q用到相同的数据表。锁的征用:一个表同时只能有一个排它锁Q一个用LӞ其它用户在等待。若用户数增加,则Server的性能下降Q出?#8220;假死”现象。如何避免死锁呢Q从锁到行锁,减少了锁征用Q给表增加无效记录Q从锁到行锁没有媄响,若在同一内竞争有媄响,可选择合适的聚族索引把数据分配到不同的页面;创徏冗余表;保持事务短;同一批处理应该没有网l交互?
Q?Q查询优化规则:在访问数据库表的数据(Access Data)Ӟ要尽可能避免排序QSortQ、连?Join)和相兛_查询*作。经验告诉我们,在优化查询时Q必d刎ͼ
?可能少的行Q?
?避免排序或ؓ可能少的行排序Q若要做大量数据排序Q最好将相关数据攑֜临时表中*作;用简单的键(列)排序Q如整型或短字符串排序;
?避免表内的相兛_查询Q?
?避免在Where子句中用复杂的表达式或非v始的子字W串、用长字W串q接Q?
?在Where子句中多使用“?#8221;QAndQ连接,?#8220;?#8221;(Or)q接Q?
?利用临时数据库。在查询多表、有多个q接、查询复杂、数据要qoӞ可以Z时表Q烦引)以减I/O。但~点是增加了I间开销?
除非每个列都有烦引支持,否则在有q接的查询时分别扑և两个动态烦引,攑֜工作表中重新排序?
3 基本表扩展设?
ZW三范式设计的库表虽然有其优性(见本文第一部分Q,然而在实际应用中有时不利于pȝq行性能的优化:如需要部分数据时而要扫描整表Q许多过E同时竞争同一数据Q反复用相同行计相同的l果Q过E从多表获取数据时引发大量的q接*作,当数据来源于多表时的q接*作;q都消耗了盘I/O和CPU旉?
其在遇C列情形时Q我们要对基本表q行扩展设计Q许多过E要频繁讉K一个表、子集数据访问、重复计和冗余数据Q有时用戯求一些过E优先或低的响应旉?
如何避免q些不利因素呢?Ҏ讉K的频J程度对相关表进行分割处理、存储冗余数据、存储衍生列、合q相兌处理Q这些都是克服这些不利因素和优化pȝq行的有效途径?
3.1 分割表或储存冗余数据
分割表分为水q_割表和垂直分割表两种。分割表增加了维护数据完整性的代h?
水^分割表:一U是当多个过E频J访问数据表的不同行Ӟ水^分割表,q消除新表中的冗余数据列Q若个别q程要访问整个数据,则要用连?作,q也无妨分割表;典型案例是电信话单按月分割存放。另一U是当主要过E要重复讉K部分行时Q最好将被重复访问的q些行单独Ş成子集表Q冗余储存)Q这在不考虑盘I间开销时显得十分重要;但在分割表以后,增加了维护难度,要用触发器立x新、或存储q程或应用代码批量更斎ͼq也会增加额外的盘I/O开销?
垂直分割表(不破坏第三范式)Q一U是当多个过E频J访问表的不同列Ӟ可将表垂直分成几个表Q减磁盘I/OQ每行的数据列少Q每存的数据行多Q相应占用的就)Q更新时不必考虑锁,没有冗余数据。缺Ҏ要在插入或删除数据时要考虑数据的完整性,用存储过E维护。另一U是当主要过E反复访问部分列Ӟ最好将q部分被频繁讉K的列数据单独存ؓ一个子集表Q冗余储存)Q这在不考虑盘I间开销时显得十分重要;但这增加了重叠列的维护难度,要用触发器立x新、或存储q程或应用代码批量更斎ͼq也会增加额外的盘I/O开销。垂直分割表可以辑ֈ最大化利用Cache的目的?
MQؓ主要q程分割表的Ҏ适用于:各个q程需要表的不联结的子集,各个q程需要表的子集,讉K频率高的主要q程不需要整表。在主要的、频J访问的主表需要表的子集而其它主要频J访问的q程需要整表时则生冗余子集表?
注意Q在分割表以后,要考虑重新建立索引?
3.2 存储衍生数据
对一些要做大量重复性计的q程而言Q若重复计算q程得到的结果相同(源列数据E_Q因此计结果也不变Q,或计牵扯多行数据需额外的磁盘I/O开销Q或计算复杂需要大量的CPU旉Q就考虑存储计算l果Q冗余储存)。现予以分类说明Q?
若在一行内重复计算Q就在表内增加列存储l果。但若参与计的列被更新Ӟ必须要用触发器更新这个新列?
若对表按c进行重复计,增加新表(一般而言Q存攄和结果两列就可以了)存储相关l果。但若参与计的列被更新Ӟ必要用触发器立即更新、或存储q程或应用代码批量更新这个新表?
若对多行q行重复性计(如排名次Q,在表内增加列存储结果。但若参与计的列被更新Ӟ必须要用触发器或存储q程更新q个新列?
MQ存储冗余数据有利于加快讉K速度Q但q反了第三范式,q会增加l护数据完整性的代hQ必ȝ触发器立x新、或存储q程或应用代码批量更斎ͼ以维护数据的完整性?
3.3 消除昂贵l合
对于频繁同时讉K多表的一些主要过E,考虑在主表内存储冗余数据Q即存储冗余列或衍生列(它不依赖于主键)Q但破坏了第三范式,也增加了l护隑ֺ。在源表的相兛_发生变化Ӟ必须要用触发器或存储q程更新q个冗余列。当主要q程d时访问两个表时可以合q表Q这样可以减磁盘I/O*作,但破坏了W三范式Q也增加了维护难度。对父子表和1Q?关系表合q方法不同:合ƈ父子表后Q生冗余表Q合q?Q?关系表后Q在表内产生冗余数据?
4 数据库对象的攄{略
数据库对象的攄{略是均匀地把数据分布在系l的盘中,qI/O讉KQ避免I/O瓉?
?讉K分散C同的盘Q即使用h据尽可能跨越多个讑֤Q多个I/Oq{Q避免I/O竞争Q克服访问瓶颈;分别攄随机讉K和连l访问数据?
?分离pȝ数据库I/O和应用数据库I/O。把pȝ审计表和临时库表攑֜不忙的磁盘上?
?把事务日志放在单独的盘上,减少盘I/O开销Q这q有利于在障后恢复Q提高了pȝ的安全性?
?把频J访问的“zL?#8221;表放在不同的盘上;把频J用的表、频J做Join*作的表分别放在单独的盘上,甚至把把频繁讉K的表的字D|在不同的盘上,把访问分散到不同的磁盘上Q避免I/O争夺Q?
?利用D分频J访问的表及其烦引(非聚族的Q、分L本和囑փ数据。段的目的是qI/OQ避免瓶颈,增加吞吐量,实现q行扫描Q提高ƈ发度Q最大化盘的吞吐量。利用逻辑D功能,分别攄“zL?#8221;表及光聚族索引以^衡I/O。当然最好利用系l的默认Dc另外,利用D可以备䆾和恢复数据更加灵z,使系l授权更加灵zR?nbsp;
 


java民工 2008-10-21 00:46 发表评论
]]>
hibernate的缓存机?/title><link>http://www.aygfsteel.com/qq66921494/archive/2008/10/21/235567.html</link><dc:creator>java民工</dc:creator><author>java民工</author><pubDate>Mon, 20 Oct 2008 16:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/qq66921494/archive/2008/10/21/235567.html</guid><wfw:comment>http://www.aygfsteel.com/qq66921494/comments/235567.html</wfw:comment><comments>http://www.aygfsteel.com/qq66921494/archive/2008/10/21/235567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/qq66921494/comments/commentRss/235567.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/qq66921494/services/trackbacks/235567.html</trackback:ping><description><![CDATA[<p>Hibernate~存机制~存是介于应用程序和物理数据源之_其作用是Z降低应用E序对物理数据源讉K的频ơ,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复Ӟ应用E序在运行时从缓存读写数据,在特定的时刻或事件会同步~存和物理数据源的数据?br />   ~存的介质一般是内存Q所以读写速度很快。但如果~存中存攄数据量非常大Ӟ也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,q要考虑到管理缓存的q发讉K和缓存数据的生命周期?<br />   Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分ؓ两类Q内|缓存和外置~存。Session的缓存是内置的,不能被卸载,也被UCؓHibernate的第一U缓存。SessionFactory的内|缓存和Session的缓存在实现方式上比较相|前者是SessionFactory对象的一些集合属性包含的数据Q后者是指Session的一些集合属性包含的数据。SessionFactory的内|缓存中存放了映元数据和预定义SQL语句Q映元数据是映文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶D|据映元数据推导出来QSessionFactory的内|缓存是只读的,应用E序不能修改~存中的映射元数据和预定义SQL语句Q因此SessionFactory不需要进行内|缓存与映射文g的同步。SessionFactory的外|缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用q个插g。外|缓存的数据是数据库数据的拷贝,外置~存的介质可以是内存或者硬盘。SessionFactory的外|缓存也被称为Hibernate的第二~存?/p> <p>  Hibernate的这两~存都位于持久化层,存放的都是数据库数据的拷贝,那么它们之间的区别是什么呢Qؓ了理解二者的区别Q需要深入理解持久化层的~存的两个特性:~存的范围和~存的ƈ发访问策略?/p> <p>持久化层的缓存的范围</p> <p>  ~存的范围决定了~存的生命周期以及可以被谁访问。缓存的范围分ؓ三类?/p> <p>  1 事务范围Q缓存只能被当前事务讉K。缓存的生命周期依赖于事务的生命周期Q当事务l束Ӟ~存也就l束生命周期。在此范围下Q缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,~存内的数据通常采用怺兌的的对象形式?/p> <p>  2 q程范围Q缓存被q程内的所有事务共享。这些事务有可能是ƈ发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进E的生命周期Q进E结束时Q缓存也q束了生命周期。进E范围的~存可能会存攑֤量的数据Q所以存攄介质可以是内存或盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据Ş式。松散的对象数据形式有点cM于对象的序列化数据,但是对象分解为松散的法比对象序列化的算法要求更快?/p> <p>  3 集群范围Q在集群环境中,~存被一个机器或者多个机器的q程׃n。缓存中的数据被复制到集环境中的每个进E节点,q程间通过q程通信来保证缓存中的数据的一致性,~存中的数据通常采用对象的松散数据Ş式?/p> <p>  对大多数应用来说Q应该慎重地考虑是否需要用集范围的~存Q因问的速度不一定会比直接访问数据库数据的速度快多?/p> <p>  持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,q可以到q程范围或集范围的~存内查询,如果q是没有查到Q那么只有到数据库中查询。事务范围的~存是持久化层的W一U缓存,通常它是必需的;q程范围或集范围的~存是持久化层的W二U缓存,通常是可选的?/p> <p>持久化层的缓存的q发讉K{略</p> <p>  当多个ƈ发的事务同时讉K持久化层的缓存的相同数据Ӟ会引起ƈ发问题,必须采用必要的事务隔L施?/p> <p>  在进E范围或集群范围的缓存,即第二~存Q会出现q发问题。因此可以设定以下四U类型的q发讉K{略Q每一U策略对应一U事务隔ȝ别?/p> <p>  事务型:仅仅在受理环境中适用。它提供了Repeatable Read事务隔离U别。对于经常被M很少修改的数据,可以采用q种隔离cdQ因为它可以防止脏读和不可重复读q类的ƈ发问题?/p> <p>  d型:提供了Read Committed事务隔离U别。仅仅在非集的环境中适用。对于经常被M很少修改的数据,可以采用q种隔离cdQ因为它可以防止脏读q类的ƈ发问题?/p> <p>  非严D写型Q不保证~存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能,必须数据配置一个很短的数据q期旉Q从而尽量避免脏诅R对于极被修改Qƈ且允许偶脏ȝ数据Q可以采用这Uƈ发访问策略?/p> <p>  只读型:对于从来不会修改的数据,如参考数据,可以使用q种q发讉K{略?/p> <p>  事务型ƈ发访问策略是事务隔离U别最高,只读型的隔离U别最低。事务隔ȝ别越高,q发性能p低?/p> <p>什么样的数据适合存放到第二~存中?</p> <p>1 很少被修改的数据</p> <p>2 不是很重要的数据Q允许出现偶ƈ发的数据</p> <p>3 不会被ƈ发访问的数据</p> <p>4 参考数?/p> <p>不适合存放到第二~存的数据?</p> <p>1 l常被修改的数据</p> <p>2 财务数据Q绝对不允许出现q发</p> <p>3 与其他应用共享的数据?/p> <p>Hibernate的二U缓?/p> <p>  如前所qͼHibernate提供了两U缓存,W一U是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的~存是事务范围的~存。第一U缓存是必需的,不允许而且事实上也无法比卸除。在W一U缓存中Q持久化cȝ每个实例都具有唯一的OID?/p> <p>  W二U缓存是一个可插拔的的~存插gQ它是由SessionFactory负责理。由于SessionFactory对象的生命周期和应用E序的整个过E对应,因此W二U缓存是q程范围或者集范围的~存。这个缓存中存放的对象的松散数据。第二对象有可能出现ƈ发问题,因此需要采用适当的ƈ发访问策略,该策略ؓ被缓存的数据提供了事务隔ȝ别。缓存适配器用于把具体的缓存实现Y件与Hibernate集成。第二~存是可选的Q可以在每个cL每个集合的粒度上配置W二U缓存?/p> <p>Hibernate的二U缓存策略的一般过E如下:</p> <p>1) 条g查询的时候,L发出一条select * from table_name where …. Q选择所有字D)q样的SQL语句查询数据库,一ơ获得所有的数据对象?/p> <p>2) 把获得的所有数据对象根据ID攑օ到第二~存中?/p> <p>3) 当HibernateҎID讉K数据对象的时候,首先从Session一U缓存中查;查不刎ͼ如果配置了二U缓存,那么从二U缓存中查;查不刎ͼ再查询数据库Q把l果按照ID攑օ到缓存?/p> <p>4) 删除、更新、增加数据的时候,同时更新~存?/p> <p>  Hibernate的二U缓存策略,是针对于ID查询的缓存策略,对于条g查询则毫无作用。ؓ此,Hibernate提供了针Ҏ件查询的Query~存?/p> <p>Hibernate的Query~存{略的过E如下:</p> <p>1) Hibernate首先Ҏq些信息l成一个Query KeyQQuery Key包括条g查询的请求一般信息:SQL, SQL需要的参数Q记录范_起始位置rowStartQ最大记录个数maxRows)Q等?/p> <p>2) HibernateҎq个Query Key到Query~存中查扑֯应的l果列表。如果存在,那么q回q个l果列表Q如果不存在Q查询数据库Q获取结果列表,把整个结果列表根据Query Key攑օ到Query~存中?/p> <p>3) Query Key中的SQL涉及C些表名,如果q些表的M数据发生修改、删除、增加等操作Q这些相关的Query Key都要从缓存中清空<br />  <br /> </p> <img src ="http://www.aygfsteel.com/qq66921494/aggbug/235567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/qq66921494/" target="_blank">java民工</a> 2008-10-21 00:46 <a href="http://www.aygfsteel.com/qq66921494/archive/2008/10/21/235567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于log4j配置文档详解http://www.aygfsteel.com/qq66921494/archive/2008/10/16/234558.htmljava民工java民工Wed, 15 Oct 2008 16:23:00 GMThttp://www.aygfsteel.com/qq66921494/archive/2008/10/16/234558.htmlhttp://www.aygfsteel.com/qq66921494/comments/234558.htmlhttp://www.aygfsteel.com/qq66921494/archive/2008/10/16/234558.html#Feedback0http://www.aygfsteel.com/qq66921494/comments/commentRss/234558.htmlhttp://www.aygfsteel.com/qq66921494/services/trackbacks/234558.htmllog4j.properties 使用
一.参数意义说明
输出U别的种c?br minmax_bound="true" /> ERROR、WARN、INFO、DEBUG
ERROR Z重错?主要是程序的错误
WARN Z般警告,比如session丢失
INFO Z般要昄的信息,比如dd
DEBUG 为程序的调试信息
配置日志信息输出目的?br minmax_bound="true" /> log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppenderQ控制台Q?br minmax_bound="true" /> 2.org.apache.log4j.FileAppenderQ文Ӟ
3.org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文Ӟ
4.org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ
5.org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
配置日志信息的格?br minmax_bound="true" /> log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
2.org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
3.org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
4.org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
控制台选项
Threshold=DEBUG:指定日志消息的输出最低层ơ?br minmax_bound="true" /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br minmax_bound="true" /> Target=System.errQ默认情况下是:System.out,指定输出控制?br minmax_bound="true" /> FileAppender 选项
Threshold=DEBUF:指定日志消息的输出最低层ơ?br minmax_bound="true" /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br minmax_bound="true" /> File=mylog.txt:指定消息输出到mylog.txt文g?br minmax_bound="true" /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br minmax_bound="true" /> RollingFileAppender 选项
Threshold=DEBUG:指定日志消息的输出最低层ơ?br minmax_bound="true" /> ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立卌出?br minmax_bound="true" /> File=mylog.txt:指定消息输出到mylog.txt文g?br minmax_bound="true" /> Append=false:默认值是true,卛_消息增加到指定文件中Qfalse指将消息覆盖指定的文件内宏V?br minmax_bound="true" /> MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小Ӟ会自动滚动Q即原来的内容Udmylog.log.1文g?br minmax_bound="true" /> MaxBackupIndex=2:指定可以产生的滚动文件的最大数?br minmax_bound="true" /> log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中几个符h代表的含义:
 -X? X信息输出时左寚wQ?br minmax_bound="true" />  %p: 输出日志信息优先U,即DEBUGQINFOQWARNQERRORQFATAL,
 %d: 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
 %r: 输出自应用启动到输出该log信息耗费的毫U数
 %c: 输出日志信息所属的cȝQ通常是所在类的全?br minmax_bound="true" />  %t: 输出产生该日志事件的U程?br minmax_bound="true" />  %l: 输出日志事g的发生位|,相当?C.%M(%F:%L)的组?包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main (TestLog4.java:10)
 %x: 输出和当前线E相兌的NDC(嵌套诊断环境),其用到像java servletsq样的多客户多线E的应用中?br minmax_bound="true" />  %%: 输出一?%"字符
 %F: 输出日志消息产生时所在的文g名称
 %L: 输出代码中的行号
 %m: 输出代码中指定的消息,产生的日志具体信?br minmax_bound="true" />  %n: 输出一个回车换行符QWindowsq_?\r\n"QUnixq_?\n"输出日志信息换行
 可以?与模式字W之间加上修饰符来控制其最宽度、最大宽度、和文本的对齐方式。如Q?br minmax_bound="true" />  1)%20cQ指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q默认的情况下右寚w?br minmax_bound="true" />  2)%-20c:指定输出category的名Uͼ最的宽度?0Q如果category的名U小?0的话Q?-"h定左寚w?br minmax_bound="true" />  3)%.30c:指定输出category的名Uͼ最大的宽度?0Q如果category的名U大?0的话Q就会将左边多出的字W截掉,但小?0的话也不会有I格?br minmax_bound="true" />  4)%20.30c:如果category的名U小?0pI格Qƈ且右寚wQ如果其名称长于30字符Q就从左边较q输出的字符截掉?br minmax_bound="true" /> ?文g配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 输出 一天一个文?输出路径可以定制,一般在根\径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
文g配置Sample2
下面l出的Log4J配置文g实现了输出到控制収ͼ文gQ回滚文Ӟ发送日志邮Ӟ输出到数据库日志表,自定义标{全套功能?br minmax_bound="true" /> log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
?高使用
实验目的Q?br minmax_bound="true" />  1.把FATALU错误写?000NT日志
 2. WARNQERRORQFATALU错误发送email通知理?br minmax_bound="true" />  3.其他U别的错误直接在后台输出
实验步骤Q?br minmax_bound="true" />  输出?000NT日志
 1.把Log4j压羃包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录?br minmax_bound="true" />  2.写配|文件log4j.properties
# ?000pȝ日志输出
 log4j.logger.NTlog=FATAL, A8
 # APPENDER A8
 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
 log4j.appender.A8.Source=JavaTest
 log4j.appender.A8.layout=org.apache.log4j.PatternLayout
 log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.调用代码Q?br minmax_bound="true" />  Logger logger2 = Logger.getLogger("NTlog"); //要和配置文g中设|的名字相同
 logger2.debug("debug!!!");
 logger2.info("info!!!");
 logger2.warn("warn!!!");
 logger2.error("error!!!");
 //只有q个错误才会写入2000日志
 logger2.fatal("fatal!!!");
发送email通知理员:
 1. 首先下蝲JavaMail和JAF,
  http://java.sun.com/j2ee/ja/javamail/index.html
  http://java.sun.com/beans/glasgow/jaf.html
 在项目中引用mail.jar和activation.jar?br minmax_bound="true" />  2. 写配|文?br minmax_bound="true" />  # 日志发送到email
 log4j.logger.MailLog=WARN,A5
 #  APPENDER A5
 log4j.appender.A5=org.apache.log4j.net.SMTPAppender
 log4j.appender.A5.BufferSize=5
 log4j.appender.A5.To=chunjie@yeqiangwei.com
 log4j.appender.A5.From=error@yeqiangwei.com
 log4j.appender.A5.Subject=ErrorLog
 log4j.appender.A5.SMTPHost=smtp.263.net
 log4j.appender.A5.layout=org.apache.log4j.PatternLayout
 log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
 3.调用代码Q?br minmax_bound="true" />  //把日志发送到mail
 Logger logger3 = Logger.getLogger("MailLog");
 logger3.warn("warn!!!");
 logger3.error("error!!!");
 logger3.fatal("fatal!!!");
在后台输出所有类别的错误Q?br minmax_bound="true" />  1. 写配|文?br minmax_bound="true" />  # 在后台输?br minmax_bound="true" />  log4j.logger.console=DEBUG, A1
 # APPENDER A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
 2Q调用代?br minmax_bound="true" />  Logger logger1 = Logger.getLogger("console");
 logger1.debug("debug!!!");
 logger1.info("info!!!");
 logger1.warn("warn!!!");
 logger1.error("error!!!");
 logger1.fatal("fatal!!!");
--------------------------------------------------------------------
 全部配置文gQlog4j.properties
 # 在后台输?br minmax_bound="true" />  log4j.logger.console=DEBUG, A1
 # APPENDER A1
 log4j.appender.A1=org.apache.log4j.ConsoleAppender
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# ?000pȝ日志输出
 log4j.logger.NTlog=FATAL, A8
 # APPENDER A8
 log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
 log4j.appender.A8.Source=JavaTest
 log4j.appender.A8.layout=org.apache.log4j.PatternLayout
 log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 日志发送到email
 log4j.logger.MailLog=WARN,A5
 #  APPENDER A5
 log4j.appender.A5=org.apache.log4j.net.SMTPAppender
 log4j.appender.A5.BufferSize=5
 log4j.appender.A5.To=chunjie@yeqiangwei.com
 log4j.appender.A5.From=error@yeqiangwei.com
 log4j.appender.A5.Subject=ErrorLog
 log4j.appender.A5.SMTPHost=smtp.263.net
 log4j.appender.A5.layout=org.apache.log4j.PatternLayout
 log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
全部代码QLog4jTest.java
 
/*
  * 创徏日期 2003-11-13
  */
 package edu.bcu.Bean;
 import org.apache.log4j.*;
 //import org.apache.log4j.nt.*;
 //import org.apache.log4j.net.*;
 /**
  * @author yanxu
  */
 public class Log4jTest
 {
  public static void main(String args[])
  {
   PropertyConfigurator.configure("log4j.properties");
   //在后台输?
   Logger logger1 = Logger.getLogger("console");
   logger1.debug("debug!!!");
   logger1.info("info!!!");
   logger1.warn("warn!!!");
   logger1.error("error!!!");
   logger1.fatal("fatal!!!");
//在NTpȝ日志输出
   Logger logger2 = Logger.getLogger("NTlog");
   //NTEventLogAppender nla = new NTEventLogAppender();
   logger2.debug("debug!!!");
   logger2.info("info!!!");
   logger2.warn("warn!!!");
   logger2.error("error!!!");
   //只有q个错误才会写入2000日志
   logger2.fatal("fatal!!!");
//把日志发送到mail
   Logger logger3 = Logger.getLogger("MailLog");
   //SMTPAppender sa = new SMTPAppender();
   logger3.warn("warn!!!");
   logger3.error("error!!!");
   logger3.fatal("fatal!!!");
  }
 }

java民工 2008-10-16 00:23 发表评论
]]>
关于eclipse中编码格式不能保存的问题http://www.aygfsteel.com/qq66921494/archive/2008/10/16/234557.htmljava民工java民工Wed, 15 Oct 2008 16:21:00 GMThttp://www.aygfsteel.com/qq66921494/archive/2008/10/16/234557.htmlhttp://www.aygfsteel.com/qq66921494/comments/234557.htmlhttp://www.aygfsteel.com/qq66921494/archive/2008/10/16/234557.html#Feedback0http://www.aygfsteel.com/qq66921494/comments/commentRss/234557.htmlhttp://www.aygfsteel.com/qq66921494/services/trackbacks/234557.htmlWindows-->preference
General->Content Type
选择对应的文件类型,然后下面修改为GBK或者gb2312,点update应该可以了Q?/div>

java民工 2008-10-16 00:21 发表评论
]]> վ֩ģ壺 | ݳ| ۳| | | ԭ| | ɽ| | | Ϳ| ƽ| ̨| | | | | ̫ԭ| | ˮ| | Ͽ| ۩| ʡ| | | ϲ| ɽ| Ȫ| | ӱʡ| ̨| | | | | | Ϻ| | | |