??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
]]>
凌晨Q看C个挺有趣的讨论[JavaEye]?006q_Java界的主题是什么?
两年的开发经历,Ҏ(gu)技术的q逐与否我不敢妄自评论。茶余饭后无聊的思?BR>基础昄重要Q当C物能为我所用的时候,能快速应对,以
不可否认Q新技术的出现,往往能成׃批热心追逐的人[只是部分,大部分属于随波逐流的困惑]
2000q?应用服务器年
q一q_Java应用服务器的需求成为各大公司的最大利益。谁不希望用“业界标准”来标榜自己呢!
?nbsp; BEA公司的繁荣从此开?/FONT>
2001q?EJBq?
q一q_EJB2.0发布Q整个Java业界Z震动Q“牵强”的分布式架构,让EJB成了术词汇
?nbsp; EJB成了高h(hun)企业软g的“文凭”。懂不懂EJB成ؓ能不能拿到高薪的关键
2002q?设计模式q?
q一q_大家开始发现EJB真TNND隄Q开始发现Java开发需要遵循某U规则,设计模式开始流行,
J2EE核心模式也应q而生
?nbsp; jdon|站借着设计模式的热点一举成?/FONT>
2003q?Hibernateq?
q一q_大家开始否定EJBQ开始采用O/R MappingQHibernateq速流?BR>?nbsp; JavaEye׃颇有预见性的推广普及Hibernate而成为国内JavaC的亮?/FONT>
2004q?Springq?nbsp;
q一q?EJB3规范和JDO2规范忙着打架Q但是真正的主角是SpringQSpring携着IoC和AOPq速占领J2EE的眼?
?nbsp; 《Without EJB?成ؓ大家背弃EJB2.0的宣a?/FONT>
2005q?AJAXq?
q一q_大部分时间大安在反思,或者是学习(fn)合适的应用E序架构。伴随着Google的GmailQ?BR> Google Maps{一pdAJAX应用Q一个古老的XMLHTTPlg咔Rn。这个冬天终于找C主题-AJAX
?nbsp; 骄傲的程序员回头x“用户体验?/FONT>
2006q?XXq_
q一q_除了成名已久的EJB3.0值得期待Q我们还能看到出人意料的新名词吗Q?BR> q一q_会是更深刻的反思年吗?[用已有的技术集合更完美的“用户体验”]
q一q_我们何M从,我也说不清楚
你呢Q?BR>
Goingmm 2006-02-03
反例之四Q不说明异常的详l信?
代码Q??18行?
仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?
printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?
因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?
l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?
反例之五Q过于庞大的try?
代码Q??14行?
l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习(fn)惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?
一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?
l论五:量减小try块的体积?
反例之六Q输出数据不完整
代码Q??11行?
不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了。已l输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?
较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?
l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?BR>
改写后的代码
本文的结Z是放之四L(fng)准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释?
另一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习(fn)惯。即使最有经验的E序员偶?dng)也会误入歧途,原因很简单,因ؓ它们确实实带来了“方侎쀝。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q不x齿,但请CQ勿以恶而ؓ之,勿以善小而不为?BR>
2005-12-17
Goingmm Subscription
打开hibernate.cfg.xml看看具体?SPAN lang=EN-US>JDBCTransaction ?SPAN lang=EN-US> JTATransaction 配置Q?SPAN lang=EN-US>
先说Q他默认的事务处理机?SPAN lang=EN-US>[ JDBC Transaction ]Q这的确是最单的处理方式Q因?SPAN lang=EN-US>Hibernate只是?SPAN lang=EN-US>JDBC事物做了一层简?BR>的封装?SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体">JDBC事务?SPAN lang=EN-US>Connection理。事务周期局限于Connection的生命周期之内。在Hibernate中这U事务周期也局限于一?SPAN lang=EN-US>Session之内?/SPAN>做个比较吧!
Connection conn = ?/SPAN> ; <--- session = sf.openSession();// 初始化数据库q接Q?SPAN lang=EN-US>
?SPAN lang=EN-US>setAutoCommit= false;
conn.setAutoCommit(false); <--- tx = session.beginTransactioin(); 会再ơ确?SPAN lang=EN-US>setAutoCommit是否?SPAN lang=EN-US>false
调用业务Ҏ(gu) <--- 调用业务Ҏ(gu)
conn.commit(); <--- tx.commit(); (对应左边的两?SPAN lang=EN-US>) q里很关键,x自动commit。自己就必须?SPAN lang=EN-US>commit。否则数据是不会被持久到数据?SPAN lang=EN-US>
conn.setAutoCommit(true);
conn.close(); <--- session.close();
单吧Q如果你?SPAN lang=EN-US>JDBC有了解,看到q里可能会坏W,NNDp么简单,我也会封?/SPAN>?/SPAN>有兴的话可以直接去看看具体的源代码?SPAN lang=EN-US>
JTA 提供了跨Session的事务管理能力?/SPAN>JTA的事务是要容器支持的Q即JTSQ用来分布式的要求比较多一些,比如像银行这U大pȝQ处理多个事务源的这些的?BR> JTA事务理则是?SPAN lang=EN-US>JTA容器实现。事务的生命周期完全由容器来l护。容器中可以有很?SPAN lang=EN-US>Connection。按照执行的序Q因该是串联的一?SPAN lang=EN-US>JDBC Connection事务链。所?SPAN lang=EN-US>JTA的事务周期可以跨多个JDBC Connection的生命周期。在Hibernate中这U事务周期也可以跨多?SPAN lang=EN-US>Session?BR> 所以?SPAN lang=EN-US>JTA事务?SPAN lang=EN-US>Connection不能对事务管理进行干涉。意思就是,假如使用?SPAN lang=EN-US>JTA׃应该再重复调?SPAN lang=EN-US>Hibernate?SPAN lang=EN-US>Transaction功能。这里涉及到一U事务模型(嵌套式事务模型)的问题。这里也不详l的介绍具体的几U事务模型了。在EJB2.0规范里面也不支持q种事务处理模型?BR> 例如 Q?o:p>
那么下面q段代码
׃能在class A ?SPAN lang=EN-US> class B
原因Q?/FONT>session.beginTransaction()也同h行了InitialContext.lookupҎ(gu)来获UserTransaction的实例,tx.commit()也同栯用了UserTransaction.commit().q样做就会Ş成嵌套式的事务。在Hibernate里面是不被允许的。会Dq行期错?/FONT>?SPAN lang=EN-US>
谈到q里Q不隄出,他们都有着自己鲜明的特点和基本的联pR回到开头的问题Q在实际目中该选用谁好呢?
q就需要分情况而定了?SPAN lang=EN-US>
1) 如果目有用?SPAN lang=EN-US>Sessionbean.可能你会疑问Q这时候由谁来理事务呢?
{案Q用SessionBean来管理。?SPAN lang=EN-US>JTA会很方便。因Z完全没有必要ȝ?SPAN lang=EN-US>Transaction。直接在SessionBean的部|描q符里面声明事务p了?SPAN lang=EN-US>
2) 自己实现一?SPAN lang=EN-US>Servicec,来统一调用持久层的Ҏ(gu)。这样也能做到前后台的松耦合。但是这时候你?SPAN lang=EN-US>session?SPAN lang=EN-US>Transaction的处理就需要小心了。如果系l考虑分布式就使用JTA否则?SPAN lang=EN-US>JDBC_。但q是有必要考虑pȝ的升U,变迁什么的。对session?SPAN lang=EN-US>Transaction的处理,最好不要放?SPAN lang=EN-US>DAO里面做。单独实C个模板类来统一做。具体的原因和做法,以后有时间再写出来?SPAN lang=EN-US>
W三个问?SPAN lang=EN-US>
׃SessionFactory是线E安全的Q他的创E非常复杂,代h(hun)极其昂贵。一个应用中最好只有一?SPAN lang=EN-US>SessionFactory。事务管理类型的选择是在SessionFactory的属性里面配|的。这里只能选择一U事务管理方式?SPAN lang=EN-US>
当然Q你可以说还有特D的情况Q假如,q个应用需要连接到两台数据库服务器Q就必须Z创徏另一?SPAN lang=EN-US>SessionFactory。那么就可以选用另一U事务管理方式。表面上看这U情冉|可以的。居于两U事务的性能考虑。和用的意义不是很大。假设这L(fng)+面对考虑不周全的DAOQ也q背了设计原则,xQ这L(fng)话,因ؓ数据库的变动Q还得回M?SPAN lang=EN-US>DAO的代码吗Q(可能会生嵌套问题)
所以关于这个问题的l论是Q?SPAN lang=EN-US>
在一?SPAN lang=EN-US>SessionFactory中只能选用一U事务管?SPAN lang=EN-US>
面对多个SessionFactory的时候,可以混合用,但是不推?BR>
2005-11-28 CTU OFFICE GOINGMM
Junit Version:
1Q看看完成后的效果图
2Q?SPAN style="FONT: 7pt 'Times New Roman'"> q行Eclipse。新Z?/SPAN>workplace目Q点?/SPAN> file->new->projectQ选择Java目Q点M一步。写一个项目名Uͼ例如UseJUnit。点?/SPAN>Finish。这样就完成新项目的建立。再来配|一?/SPAN>EclipseQ在构徏路径中添?/SPAN>JUnitcd。在工具条上点击目->属性,选择Java Build PathQLibrariesQ选择 Add external JARsQ浏?/SPAN>Junit被存储的目录Q选择junit.jarQ点?yn)L开。你会看见JUnit出现在库的列表中。点ȝ定,?/SPAN>Eclipse重徏路径?BR>
3Q新Z个Class Person
4) 新徏一个Test Class TestCaseWithJunit
代码如下Q?FONT color=#ff0000>public void testSay() Ҏ(gu)是我自己加进ȝ
5) Run Test case
6) 看看试l果
7Q修改一下测试代?BR>
8Q再看测试结?BR>
呵呵Q?W一ơ发图。如果上面的q程描述有什么不清楚的地斏V请与我联系
2005-11-13 听涛 H台
MySQL V4.1
-------------------------------------------------------------------------------------------------
从名字看双胞(yu)胎一般的他们俩。是l配吗?我也不知道,有时候,MySQL-Front会告诉我Q“我不认?/SPAN>MySQL”。不要以为我和他有啥子关pR这是我今天要谈到的问题。因为刚?/SPAN>MySQL一D|间。不知道q有没有更好的组合式用法?/SPAN>
1Q用[MySQL Command Line Client]q入MySQL cmd操作模式
drop database dbName;
create database dbName;
use dbName;
2) 数据库徏立好以后开始徏立表
drop table person;
create table person (
person_name varchar(16) not null primary key,
person_pass varchar(32) not null,
person_sex int(1) default '0' ,
person_email varchar(30) default null,
person_lastLogTime dateTime,
active_status int(1) default '0'
);
3Q?SPAN style="FONT: 7pt 'Times New Roman'"> 现在你可以插入一些数?/SPAN>
insert into person values('goingmm','***','?/SPAN>', 'todogoingmm@163.com', '
………?..........
4) OK 现在可以查询出来看了
select * from person
H然感觉老在q里操作很是不方ѝ于是想起了MySQL-Front。打开看看Q咦Q没有找到数据库dbName。努力了1个小时。原因猜完,办法惛_?/SPAN>MySQL-Frontq是说我认识他,你不要搞我拉Q?/SPAN>~果然Q再?/SPAN> MySQL-FrontL拉。有个性?/SPAN>
后来把刚才做?/SPAN>1Q?/SPAN>2Q?/SPAN>3Q?/SPAN>4Q全部回滚。就是删掉数据库。在MySQL-Front里面先徏立一个数据库。然后去cmd建立表,插入数据。最后回?/SPAN>MySQL-Front。哈哈,q回看到刚刚建立的数据库了?/SPAN>
不知道大家有没有遇到q这个问题。是MySQL-Front?/SPAN>bug吗?q有一?/SPAN>MySQL-Front很弱智的问题Q比?/SPAN>SQL~辑器。希望他的下一个版本不要这么粗p。毕?/SPAN>MySQL ?/SPAN>5.0?BR>
2005q?1??BR>
-----------------------------------------------------------------------------------------
?SPAN style="FONT: 7pt 'Times New Roman'"> 被用L(fng)应用E序调用的,用来完成基本的创建、读取、更新、删除操作以及查询操作的接口。这些接口是Hibernate实现用户E序的商业逻辑的主要接口,它们包括Session?/SPAN>Transaction?/SPAN>Query
?SPAN style="FONT: 7pt 'Times New Roman'"> Hibernate用来d诸如映射表这c配|文件的接口Q典型的代表?/SPAN>Configurationc?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> 回调(Callback)接口。它允许应用E序能对一些事件的发生作出相应的操作,例如Interceptor?/SPAN>Lifecycle?/SPAN>Validatable都是q一cL?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> 一些可以用来扩?/SPAN>Hibernate的映机制的接口Q例?/SPAN>UserType?/SPAN>CompositeUserType?/SPAN>IdentifierGenerator。如果你认有必要的话这些接口可qL(fng)序来实现?/SPAN>
Session接口
Session接口对于Hibernate开发h员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量的类Q创建和销毁它都不会占用很多资源。这在实际项目中实很重要,因ؓ在客L(fng)序中Q可能会不断地创Z及销?/SPAN>Session对象Q如?/SPAN>Session的开销太大Q会l系l带来不良媄响。但值得注意的是Session对象是非U程安全的,因此在你的设计中Q最好是一个线E只创徏一?/SPAN>Session对象?/SPAN>
Hibernate的设计者将session看作介于数据q接与事务管理一U中间接口。我们可以将session惌成一个持久对象的~冲区,Hibernate能检到q些持久对象的改变,q及时刷新数据库。我们有时也U?/SPAN>Session是一个持久层理器,因ؓ它包含这一些持久层相关的操作,诸如存储持久对象x据库Q以及从数据库从获得它们。请注意Q?/SPAN>Hibernate ?/SPAN>session不同?/SPAN>JSP应用中的HttpSession。我们通常会将HttpSesion对象UCؓ用户Session?/SPAN>
SessionFactory 接口
他用C一个设计模?/SPAN>[工厂模式]Q用L(fng)序从工厂c?/SPAN>SessionFactory中取?/SPAN>Session的实例?/SPAN>
但是误住,SessionFactoryq不是轻量的!实际上它的设计者的意图是让它能在整个应用中׃n。典型地来说Q一个项目通常只需要一?/SPAN>SessionFactory够了,但是当你的项目要操作多个数据库时Q那你必Mؓ每个数据库指定一?/SPAN>SessionFactory?/SPAN>
Configuration 接口
Configuration接口的作用是?/SPAN>Hibernateq行配置Q以及对它进行启动。在Hibernate的启动过E中Q?/SPAN>Configurationcȝ实例首先定位映射文档的位|,dq些配置Q然后创Z?/SPAN>SessionFactory对象?/SPAN>
Transaction 接口
Transaction接口是一个可选的APIQ你可以选择不用这个接口,取而代之的?/SPAN>Hibernate的设计者自己写的底层事务处理代码?/SPAN> Transaction接口是对实际事务实现的一个抽象,q些实现包括JDBC的事务?/SPAN>JTA中的UserTransaction、甚臛_以是CORBA事务?BR>Z么要q样设计呢?因ؓq样使开发者能够用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移倹{?/SPAN>
Query?/SPAN>Criteria接口
Query接口让你方便地对数据库及持久对象q行查询Q它可以有两U表达方式:HQL语言或本地数据库?/SPAN>SQL语句?/SPAN>Queryl常被用来绑定查询参数、限制查询记录数量,q最l执行查询操?/SPAN>
Callback 接口
当一些有用的事g发生时。例如持久对象的载入、存储、删除时Q?/SPAN>Callback接口会通知HibernateL收一个通知消息。一般而言Q?/SPAN>Callback接口在用L(fng)序中q不是必ȝQ但你要在你的项目中创徏审计日志Ӟ你可能会用到它?BR>
2005q?1???nbsp; 阴天 温度偏低
听涛[601]?nbsp;H台
【概c?/FONT> 【目标?/FONT> 【运行Hibernate需要的W三方库?BR> dom4j (必需Q? Hibernate在解析XML配置和XML映射元文件时需要用dom4j?BR> CGLIB (必需Q? Hibernate在运行时使用q个代码生成库强化类Q与Java反射机制联合使用Q?nbsp;
1QHibernate是一个面向java环境的对?关系数据库映?ORM)工具?BR> 2QORM 表示一U技术,用来把对象模型表C的对象映射到基于SQL的关pL型中厅R?/P>
对于开发者通常的数据持久化的编EQ务。解攑օ中的95%Q成为Java理持箋性数据问题的一U完整的解决Ҏ(gu)
【体现?/FONT>
他协调应用与关系数据库的交互Q让开发者解攑և来专注于手中的业务问题。他是一U非性的解决Ҏ(gu)
Commons Collections and Commons Logging (必需Q? Hibernat使用Apache Jakarta Commons目提供的多个工L(fng)?BR> ODMG4 (必需) : Hibernate提供了一个可选的ODMG兼容持久化管理界面。如果你需要映集合,你就需要这个类库,
q你不是ؓ了用ODMG API Q注意:Z么在Hibernate 3.0 没有这个jar了?Q?BR> Log4j (可选)QLog4j 是一ƾ优U的Debug工具Q具体用方式网l上有很多介l?/P>
先思考几个问?/P>
1Q数据持久到底有那些成熟的方式?
?直接使用SQL和JDBCq行工作 也可以结合DAO模式
?序列化持l性机?他提供了对象图Q应用状态)写到字节中的能力,然后它可能被持箋化到文g或数据库中?BR> 他也被Java的远E方法调用(RMIQ用来为复杂对象传递D义。他的另一U用法是在机器集中跨节点复制应
用状态?BR> ?EJB实体Bean
?JDO
?ORM 对象-关系映射Q中间的短线了当q两个领域相撞时出现的不匹配问?BR> ?XML持箋?XML持箋层是序列化模式的变种?BR> ?存储q程
2QORM解决Ҏ(gu)有那些组成部分?
?在持l类的对象上执行基本的CRUD操作的一lAPI?BR> ?用于指定查询的一U语a或一lAPIQ这些查询会引用cdcd性?BR> ?用于指定映射元数据的工具?BR> ?实现ORM的一Ҏ(gu)术,用来与事务对象交互以完成脏检查、懒兌存取和其它优化功能?/P>
3Q实现ORM的有那些不同的方式?
?U关p?
?轻量对象映射
?中等对象映射
?完全对象映射
4Q相关的ORM有那些问题?
?持箋cd什么?它们是细_度的JavaBean吗?或者它们是一些类gEJB的组件模型的实例吗?持箋性工h多么
透明Q我们需要ؓ业务领域的类采用一U编E模型或一些规范吗Q?BR> ?映射元数据是如何定义的?因ؓ对象-关系转换完全由元数据控制Q这些元数据的格式和定义是重要的核心问题?BR> ORM工具应该提供一个图形化处理元数据的GUI吗?或者有定义元数据的更好的方法吗Q?BR> ?我们应该映射cȝl承层次吗?q有几种标准{略。多态关联、抽象类和接口怎么映射呢?
?对象同一性和相等性如何关联到数据库同一性(主键Q?我们如何特定类的实例映到特定表的行?BR> ?在运行时持箋性逻辑如何与业务域对象交互Q这是一个普通的~程问题Q有许多的解x案包括源代码生成、运行时
反射、运行时字节码生成和~译时字节码增强。这个问题的解决Ҏ(gu)可能影响C的构E(但宁可如此,你也?BR> 愿受到其它像用户那样的媄响)
?持箋性对象的生命周期是什么样的?有些对象的生命周期依赖于其它兌对象的生命周期吗Q?BR> 我们如何一个对象的生命周期转化为数据库行的生命周期Q?BR> ?为排序、检索和合计提供了什么样的工P应用可以在内存中处理其中的一些事情。但Z有效C用关pL术有?BR> 需要通过数据库完成这些工?BR> ?如何有效地取出关联数据?对关pL据的有效讉K通常通过表连接实现。面向对象的应用通常通过D对象图访问数
据可能的话,两种数据讉K模式应该避免n+1ơ选择的问题,以及它的补充W卡?dng)积的问题(在一ơ查询中取出q多?BR> 数据)
5Q所有数据访问技术都不得不面对的问题有那些?
?事务和ƈ发?BR> ?~存理Q和q发性)