现在的工作的目中用了liquibaseQ感觉挺爽的Q可以跟t、管理数据库的重构。这对于很多需求变更较大的目是非怸错的Q特别是互联|的目。(虽然互联|Nosql已经非常行Q不q俺觉得传统关系型数据库q是有存在的必要的)
好了Q废话不多说Q说说这几天的学习心得和实战ȝ?/span>
关于liquibase的优点就不多说了Q可以去官网看简介?/span>
基本上我是从quickStart开始看的。Liquibase的原理很单,是通过记录数据库的l构斚w的所有重构都攑֜一个Changelog中的xml中,通过xml的changeSet去跟t数据库的变更?/span>
在最q的工作中很好奇Qؓ什么liquibase可以做到识别哪一个ChangeSet需要去Ҏ据库重构Q哪一个不重构Q已l执行了数据库结构的修改操作Q。通过试以后发现QliquibaseW一ơ运行的时候会在DB建立两张表,分别是databasechangelog和databasechagneloglockQ?br />
q样很好理解了Q通过DBȝlƈ匚w旧的操作和新的操作?/span>
l箋看databasechange表结构,发现表l构的主键是ID,AUTHOR,FILENAME.
即通过每一个ChangeSet的ID+修改ChangeSet的作者标C?包含ChangeSet的文件名
来,也这避免了多人协同开发的冲突。(关于ID和AUTHOR可以再后面配|文件中看到Q?/span>
关于databasechangelogQ我的理解则是当q是否有操作占有数据库变更的?br />
PsQ开始认个ID和databasechange的ID应该是同一个|后来才发C同,因ؓ属性g同,q里的ID应该是databasechange表中的ORDEREXECUTED。这个值应该是数据库根据执行顺序确定的序列可不是用户在xml中配|的ID受?/span>
看完q些Q就来看看liquibase怎么在项目中使用Q?/span>
吐槽一下,官方的quickStart写的有点烂,只列了如下几U:
一看,我就觉得有点晕,command line我觉得好囧,Ant我不会应该也快被maven淘汰了吧QGrails我google了一下才有所了解。那我知道的maven和servlet listener。Servlet listener 非web目咋办呢?好吧Q只有maven一条出路了。在官网找了半天Q才发现q东西还支持spring,刚好手头的项目是架在spring上面的?br />
所以,在spring上面捣鼓了一下,把官方的配置copy一份到自己的xml中就行了Q?/span>http://www.liquibase.org/manual/spring Q?br />
q行了一下,一切OK?/span>
不过q是要吐槽一下,如果不是web目Q不用maven,不用spring.那这东西是不是就不能用了呢?
为啥不能支持一下通过代码去load执行呢?
-------------------------------------------------------------------------------------
初步使用了一下,值得挖掘的东西应该还是很多的?br />记录一下liquibase的源代码地址Q?a >https://github.com/liquibase/liquibase?/p>
?/span>java的Annotation不是太熟悉,不过最q又要用Q所以就找了相关的文档看了下Qƈ写了一个Demo
基本的需求如下:
ServerҎҎ传递的cd码找到具体的某个cȝ具体Ҏq运行。个得用AnnotationL释代码比较好Q也减少配置文gQ所以就体验了一把?br />
具体代码如下Q?/span>
1?/span>先定义一个自qAnnotation
q里一定要自qAnnotation定义行时的,默认好像是编译时的,所以无法动态的Ҏserver接收到的coded配函?br />
2?/span>@Override定义父类basicHandler通过攑ְ去获取执行子cȝҎ
full-stack 的设计,意味着各层能够无缝的集成在一P遵@的DRY原则Qdon't repeat yourself)Q将各层q的东西,抽取出来Qƈ通过自顶向下的设计,无缝的集成在一P_合在一P辑ֈ更高层次、更_粒度的重用Q同时ؓ了保证灵zȝ可扩展性,在更高、更_的_度上遵守开?闭的原则,在各层的各个关键点,要提供诸多的钩子Q回调的接口Q供使用者扩展。full-stack的设计,在层与层之间Qƈ不一味的q求松散的机Ӟ而是相反Q在层与层之间增Z定的内聚性,_合力,以此来达到粗_度的封装与重用?/p>
可以说full-stack 的设计,其爆发出的威力是巨大的,相对普通的单一层面的设计,在开发效率上不是一个层ơ上的,Z28原理的设计,可以满80的调用者直接开发,19%的调用者,通过扩展点进行扩展来满需求,对于1%钻角的需求,自己去造轮子?/p>
spring, ruby on rails, Zend都是q样的工业强度的full-stack的设计,我们的设计如果以他们Z心,生力得C极大的提高?br />
首先看一下,java中线E状态{换简图,因ؓ以上的线E操作都是调度线E从某一个状态到另外一U状态的切换?br />
Sleep()Ҏ
在java中SleepҎ主要用于让当前处于运行态的U程变ؓ休眠态。这Ll在调度可运行的U程q入q行态时׃考虑此线E。同时休眠时间结束,该线E也不是直接q入q行态,而是q入可运行的队列Q等待系l的调度?/p>
U程从运行态进入休眠态ƈ不释攑֯象锁Q因为线E休眠的旉是可以由E序定的Q而进入可q行态却是由操作pȝ定的?/p>
wait()Ҏ
在java中waitҎQ在Java中Object对象有waitҎQ所以每个对象承拥有了waitҎ?/p>
WaitҎ的作用是拥有对象a的锁的线E释放该锁给别的U程。因为处于锁定同步方法或同步代码块内的代码失去锁则无法l执行。调用wait()Ҏ也会让线E从q行态切换到不可q行?即等待,dQ睡?,所以等待其他线E调用notify()或者notifyall()Ҏ才有可能让该U程从不可运行态变到可q行态?/p>
notify()Ҏ
notify()Ҏ和wait()ҎcMQ都是Object对象所拥有的方法,每个对象都默认有notify()Ҏ。调?specialObject.notify()Ҏ是当前U程释放对象锁,让其他等待该U程锁的某一个线E获得该对象锁,从而从d态变为可q行态。等待系l调度该U程q入q行态。Notifyall()的区别则是将所有等待该对象锁的waitU程全部退出wait状态去竞争对象锁?/p>
注意Q?/p>
notify()是选择一个线Eƈ获得对象锁?/p>
Notifyall()是让所有方法退出wait状态,最后只会有一个对象获得对象锁?br />pdf下蝲Q?a href="/Files/zhenxuanpan/java多线E一.pdf">/Files/zhenxuanpan/java多线E一.pdf
以前qL的看了大半?/span>effective java?/span>,有些看的云里NQ有些则看的非常开心。这ơ决定沉下心来好好从头读一遍,像当初看?/span>think in java》一栗个人感觉?/span>effective java》非怸适合新手阅读Q因本书更多的是讲的是一?/span>skillQ而不?/span>knowledge。所以在没有在好好掌握好knowledge之前看是不明智的Q也打击自信心的?/span>
在看的同Ӟ我一直在思考一个问题,书中提到的这?/span>skills实非常好,可是我们在实?/span>design或?/span>coding中如何用上去呢?像软g工程的一些东西,好吗Q非常好Q可是作Z个新手,或者还没到能够把这?/span>skills用到实际目中的人,如何ȝQ?/span>
q是一个蛮苦恼的问题,想了半天Q也许我的解{就是犯错。给你失败的ZQ当你用一些不好的东西带来痛苦的时候,你就开始寻找新的\。然后这?/span>skill׃帮你?/span>happy的解册些问题。就像最q看NosqlQ每一U技术的兴vQ绝Ҏ它特定的需求。也?/span>ITq个领域永远都要跟着需求走才是对的?/span>
那是不是Q现在不需要去看?/span>effective java》这U书呢?我还是觉?/span>no,因ؓ知识是一个积累的q程Q就?/span>Design patternQ当初学习的时候,感觉非常好的东西Q学完就忘记了,可是真的到项目中Q老大说去按照某个模式d现的时候,你会豁然开朗,实q样会好很多Q慢慢的在U篏属于自己的经验。先U篏知识Q后U篏l验?/span>No forever,q个领域永远都有很多新的东西。。呵c?/span>
好了Qؕ扯了q么多,大囧。。还是l看书,l箋记录自己学习中的点点滴滴吧。哈哈。?/span>
---------------学习W记的链接(持箋dingQ?--------------
1?a href="http://www.aygfsteel.com/zhenxuanpan/articles/349309.html">《Effective java》学习笔?