仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1614|回复: 12
打印 上一主题 下一主题

[学习教程] JAVA编程:JTA 深度历险 - 道理与完成仓酷云

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:29:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。简介:在J2EE使用中,事件是一个不成或缺的组件模子,它包管了用户操纵的ACID(即原子、分歧、断绝、耐久)属性。关于只操纵单一数据源的使用,能够经由过程当地资本接话柄现事件办理;关于跨数据源(比方多个数据库,大概数据库与JMS)的年夜型使用,则必需利用全局事件JTA(JavaTransactionAPI)。JTA为J2EE平台供应了散布式事件服务,它断绝了事件与底层的资本,完成了通明的事件办理体例。本文将深切探访JTA的系统架构,并经由过程具体的代码先容实在现机制。
使用JTA处置事件
甚么是事件处置
事件是盘算机使用中不成或缺的组件模子,它包管了用户操纵的原子性(Atomicity)、分歧性(Consistency)、断绝性(Isolation)和耐久性(Durabilily)。关于事件最典范的示例莫过于信誉卡转账:将用户A账户中的500元国民币转移到用户B的账户中,其操纵流程以下
1.将A账户中的金额削减500
2.将B账户中的金额增添500
这两个操纵必需保正ACID的事件属性:即要末全体乐成,要末全体失利;倘使没有事件保证,用户的账号金额将大概产生成绩:
假设第一步操纵乐成而第二步失利,那末用户A账户中的金额迁就削减500元而用户B的账号却没有任何增添(不知去向);一样假如第一步堕落而第二步乐成,那末用户A的账户金额稳定而用户B的账号将增添500元(平空而生)。上述任何一种毛病城市发生严峻的数据纷歧致成绩,事件的缺掉关于一个不乱的临盆体系是不成承受的。
J2EE事件处置体例
1.当地事件:严密依附于底层资本办理器(比方数据库毗连),事件处置范围在以后事件资本内。此种事件处置体例不存在对使用服务器的依附,因此部署天真却没法撑持多半据源的散布式事件。在数据库毗连中利用当地事件示比方下:
清单1.当地事件处置实例
  1. publicvoidtransferAccount(){Connectionconn=null;Statementstmt=null;try{conn=getDataSource().getConnection();//将主动提交设置为false,//若设置为true则数据库将会把每次数据更新认定为一个事件并主动提交conn.setAutoCommit(false);stmt=conn.createStatement();//将A账户中的金额削减500stmt.execute("updatet_accountsetamount=amount-500whereaccount_id=A");//将B账户中的金额增添500stmt.execute("updatet_accountsetamount=amount+500whereaccount_id=B");//提交事件conn.commit();//事件提交:转账的两步操纵同时乐成}catch(SQLExceptionsqle){try{//产生非常,回滚在本领务中的操做conn.rollback();//事件回滚:转账的两步操纵完整打消stmt.close();conn.close();}catch(Exceptionignore){}sqle.printStackTrace();}}
复制代码
2.散布式事件处置:Java事件编程接口(JTA:JavaTransactionAPI)和Java事件服务(JTS;JavaTransactionService)为J2EE平台供应了散布式事件服务。散布式事件(DistributedTransaction)包含事件办理器(TransactionManager)和一个或多个撑持XA协定的资本办理器(ResourceManager)。我们能够将资本办理器看作恣意范例的耐久化数据存储;事件办理器承当着一切事件介入单位的和谐与把持。JTA事件无效的屏障了底层事件资本,使使用能够以通明的体例参进到事件处置中;可是与当地事件比拟,XA协定的体系开支年夜,在体系开辟过程当中应稳重思索是不是的确必要散布式事件。若的确必要散布式事件以和谐多个事件资本,则应完成和设置所撑持XA协定的事件资本,如JMS、JDBC数据库毗连池等。利用JTA处置事件的示比方下(注重:connA和connB是来自分歧数据库的毗连)
清单2.JTA事件处置
  1. publicvoidtransferAccount(){UserTransactionuserTx=null;ConnectionconnA=null;StatementstmtA=null;ConnectionconnB=null;StatementstmtB=null;try{//取得Transaction办理对象userTx=(UserTransaction)getContext().lookup("java:comp/UserTransaction");//从数据库A中获得数据库毗连connA=getDataSourceA().getConnection();//从数据库B中获得数据库毗连connB=getDataSourceB().getConnection();//启动事件userTx.begin();//将A账户中的金额削减500stmtA=connA.createStatement();stmtA.execute("updatet_accountsetamount=amount-500whereaccount_id=A");//将B账户中的金额增添500stmtB=connB.createStatement();stmtB.execute("updatet_accountsetamount=amount+500whereaccount_id=B");//提交事件userTx.commit();//事件提交:转账的两步操纵同时乐成(数据库A和数据库B中的数据被同时更新)}catch(SQLExceptionsqle){try{//产生非常,回滚在本领务中的利用userTx.rollback();//事件回滚:转账的两步操纵完整打消//(数据库A和数据库B中的数据更新被同时打消)stmt.close();conn.close();...}catch(Exceptionignore){}sqle.printStackTrace();}catch(Exceptionne){e.printStackTrace();}}
复制代码

回页首
JTA完成道理
良多开辟职员城市对JTA的外部事情机制感乐趣:我编写的代码没有任何与事件资本(如数据库毗连)互动的代码,可是我的操纵(数据库更新)却实其实在的被包括在了事件中,那JTA事实是经由过程何种体例来完成这类通明性的呢?要了解JTA的完成道理起首必要懂得其架构:它包含事件办理器(TransactionManager)和一个或多个撑持XA协定的资本办理器(ResourceManager)两部分,我们能够将资本办理器看作恣意范例的耐久化数据存储;事件办理器则承当着一切事件介入单位的和谐与把持。依据所面向对象的分歧,我们能够将JTA的事件办理器和资本办理器了解为两个方面:面向开辟职员的利用接口(事件办理器)和面向服务供应商的完成接口(资本办理器)。个中开辟接口的次要部分即为上述示例中援用的UserTransaction对象,开辟职员经由过程此接口在信息体系中完成散布式事件;而完成接口则用来标准供应商(如数据库毗连供应商)所供应的事件服务,它商定了事件的资本办理功效,使得JTA能够在异构事件资本之间实行协同相同。以数据库为例,IBM公司供应了完成散布式事件的数据库驱动程序,Oracle也供应了完成散布式事件的数据库驱动程序,在同时利用DB2和Oracle两种数据库毗连时,JTA便可以依据商定的接口和谐者两种事件资本从而完成散布式事件。恰是基于一致标准的分歧完成使得JTA能够和谐与把持分歧数据库大概JMS厂商的事件资本,其架构以下图所示:
.JTA系统架构

<br>
开辟职员利用开辟职员接口,完成使用程序对全局事件的撑持;各供应商(数据库,JMS等)根据供应商接口的标准供应事件资本办理功效;事件办理器(TransactionManager)将使用对散布式事件的利用映照到实践的事件资本并在事件资本间举行和谐与把持。上面,本文将对包含UserTransaction、Transaction和TransactionManager在内的三个次要接口和其界说的办法举行先容。
面向开辟职员的接口为UserTransaction(利用办法如上例所示),开辟职员一般只利用此接话柄现JTA事件办理,其界说了以下的办法:


  • begin()-入手下手一个散布式事件,(在背景TransactionManager会创立一个Transaction事件对象并把此对象经由过程ThreadLocale联系关系到以后线程上)
  • commit()-提交事件(在背景TransactionManager会从以后线程下掏出事件对象并把此对象所代表的事件提交)
  • rollback()-回滚事件(在背景TransactionManager会从以后线程下掏出事件对象并把此对象所代表的事件回滚)
  • getStatus()-前往联系关系到以后线程的散布式事件的形态(Status对象里边界说了一切的事件形态,感乐趣的读者能够参考API文档)
  • setRollbackOnly()-标识联系关系到以后线程的散布式事件将被回滚
面向供应商的完成接口次要触及到TransactionManager和Transaction两个对象
Transaction代表了一个物理意义上的事件,在开辟职员挪用UserTransaction.begin()办法时TransactionManager会创立一个Transaction事件对象(标记着事件的入手下手)并把此对象经由过程ThreadLocale联系关系到以后线程。UserTransaction接口中的commit()、rollback(),getStatus()等办法都将终极托付给Transaction类的对应办法实行。Transaction接口界说了以下的办法:


  • commit()-和谐分歧的事件资本配合完成事件的提交
  • rollback()-和谐分歧的事件资本配合完成事件的回滚
  • setRollbackOnly()-标识联系关系到以后线程的散布式事件将被回滚
  • getStatus()-前往联系关系到以后线程的散布式事件的形态
  • enListResource(XAResourcexaRes,intflag)-将事件资本到场到以后的事件中(在上述示例中,在对数据库A操纵时其所代表的事件资本将被联系关系到以后事件中,一样,在对数据库B操纵时其所代表的事件资本也将被联系关系到以后事件中)
  • delistResourc(XAResourcexaRes,intflag)-将事件资本从以后事件中删除
  • registerSynchronization(Synchronizationsync)-回调接口,Hibernate等ORM工具都有本人的事件把持机制来包管事件,但同时它们还必要一种回调机制以便在事件完成时失掉关照从而触发一些处置事情,如扫除缓存等。这就触及到了Transaction的回调接口registerSynchronization。工具能够经由过程此接口将回调程序注进到事件中,当事件乐成提交后,回调程序将被激活。
TransactionManager自己其实不承当实践的事件处置功效,它更多的是充任用户接口和完成接口之间的桥梁。上面列出了TransactionManager中界说的办法,能够看到此接口中的年夜部分事件办法与UserTransaction和Transaction不异。在开辟职员挪用UserTransaction.begin()办法时TransactionManager会创立一个Transaction事件对象(标记着事件的入手下手)并把此对象经由过程ThreadLocale联系关系到以后线程上;一样UserTransaction.commit()会挪用TransactionManager.commit(),办法将从以后线程下掏出事件对象Transaction并把此对象所代表的事件提交,即挪用Transaction.commit()


  • begin()-入手下手事件
  • commit()-提交事件
  • rollback()-回滚事件
  • getStatus()-前往以后事件形态
  • setRollbackOnly()
  • getTransaction()-前往联系关系到以后线程的事件
  • setTransactionTimeout(intseconds)-设置事件超不时间
  • resume(Transactiontobj)-持续以后线程联系关系的事件
  • suspend()-挂起以后线程联系关系的事件
在体系开辟过程当中会碰到必要将事件资本临时扫除的操纵,此时就必要挪用suspend()办法将以后的事件挂起:在此办法前面所做的任何操纵将不会被包含在事件中,在非事件性操纵完成后挪用resume()以持续事件(注:要举行此操纵必要取得TransactionManager对象,其取得体例在分歧的J2EE使用服务器上是纷歧样的)
上面将经由过程详细的代码向读者先容JTA完成道理。下图列出了示例完成中触及到的Java类,个中UserTransactionImpl完成了UserTransaction接口,TransactionManagerImpl完成了TransactionManager接口,TransactionImpl完成了Transaction接口
.JTA完成类图

<br>
清单3.入手下手事件-UserTransactionImplimplenmentsUserTransaction
  1. publicvoidbegin()throwsNotSupportedException,SystemException{//将入手下手事件的操纵托付给TransactionManagerImplTransactionManagerImpl.singleton().begin();}
复制代码

清单4.入手下手事件-TransactionManagerImplimplementsTransactionManager
  1. //此处transactionHolder用于将Transaction所代表的事件对象联系关系到线程上privatestaticThreadLocal<TransactionImpl>transactionHolder=newThreadLocal<TransactionImpl>();//TransacationMananger必需保护一个全局对象,因而利用单实例形式完成privatestaticTransactionManagerImplsingleton=newTransactionManagerImpl();privateTransactionManagerImpl(){}publicstaticTransactionManagerImplsingleton(){returnsingleton;}publicvoidbegin()throwsNotSupportedException,SystemException{//XidImpl完成了Xid接口,其感化是独一标识一个事件XidImplxid=newXidImpl();//创立事件对象,并将对象联系关系到线程TransactionImpltx=newTransactionImpl(xid);transactionHolder.set(tx);}
复制代码
如今我们就能够了解Transaction接口上没有界说begin办法的缘故原由了:Transaction对象自己就代表了一个事件,在它被创立的时分就标明事件已入手下手,因而也就不必要分外界说begin()办法了。
清单5.提交事件-UserTransactionImplimplenmentsUserTransaction
  1. publicvoidcommit()throwsRollbackException,HeuristicMixedException,HeuristicRollbackException,SecurityException,IllegalStateException,SystemException{//反省是不是是Rollbackonly事件,假如是回滚事件if(rollBackOnly){rollback();return;}else{//将提交事件的操纵托付给TransactionManagerImplTransactionManagerImpl.singleton().commit();}}
复制代码

清单6.提交事件-TransactionManagerImplimplenmentsTransactionManager
  1. publicvoidcommit()throwsRollbackException,HeuristicMixedException,HeuristicRollbackException,SecurityException,IllegalStateException,SystemException{//获得以后事件所联系关系的事件并经由过程其commit办法提交TransactionImpltx=transactionHolder.get();tx.commit();}
复制代码
同理,rollback、getStatus、setRollbackOnly等办法也接纳了与commit()不异的体例完成。UserTransaction对象不会对事件举行任何把持,一切的事件办法都是经由过程TransactionManager传送到实践的事件资本即Transaction对象上。
上述示例演示了JTA事件的处置历程,上面将为您展现事件资本(数据库毗连,JMS)是怎样以通明的体例到场到JTA事件中的。起首必要明白的一点是,在JTA事件代码中取得的数据库源(DataSource)必需是撑持散布式事件的。在以下的代码示例中,只管一切的数据库操纵都被包括在了JTA事件中,可是由于MySql的数据库毗连是经由过程当地体例取得的,对MySql的任何更新将不会被主动包括在全局事件中。
清单7.JTA事件处置
  1. publicvoidtransferAccount(){UserTransactionuserTx=null;ConnectionmySqlConnection=null;StatementmySqlStat=null;ConnectionconnB=null;StatementstmtB=null;try{//取得Transaction办理对象userTx=(UserTransaction)getContext().lookup("java:comp/UserTransaction");//以当地体例取得mySql数据库毗连mySqlConnection=DriverManager.getConnection("localhost:1111");//从数据库B中获得数据库毗连,getDataSourceB前往使用服务器的数据源connB=getDataSourceB().getConnection();//启动事件userTx.begin();//将A账户中的金额削减500//mySqlConnection是从当地取得的数据库毗连,不会被包括在全局事件中mySqlStat=mySqlConnection.createStatement();mySqlStat.execute("updatet_accountsetamount=amount-500whereaccount_id=A");//connB是从使用服务器得的数据库毗连,会被包括在全局事件中stmtB=connB.createStatement();stmtB.execute("updatet_accountsetamount=amount+500whereaccount_id=B");//事件提交:connB的操纵被提交,mySqlConnection的操纵不会被提交userTx.commit();}catch(SQLExceptionsqle){//处置非常代码}catch(Exceptionne){e.printStackTrace();}}
复制代码
为何必需从撑持事件的数据源中取得的数据库毗连才撑持散布式事件呢?实在撑持事件的数据源与一般的数据源是分歧的,它完成了分外的XADataSource接口。我们能够复杂的将XADataSource了解为一般的数据源(承继了java.sql.PooledConnection),只是它为撑持散布式事件而增添了getXAResource办法。别的,由XADataSource前往的数据库毗连与一般毗连也是分歧的,此毗连除完成java.sql.Connection界说的一切功效以外还完成了XAConnection接口。我们能够把XAConnection了解为一般的数据库毗连,它撑持一切JDBC标准的数据库操纵,分歧的地方在于XAConnection增添了对散布式事件的撑持。经由过程上面的类图读者能够对这几个接口的干系有所懂得:
.事件资本类图

<br>
使用程序从撑持散布式事件的数据源取得的数据库毗连是XAConnection接口的完成,而由此数据库毗连创立的会话(Statement)也为了撑持散布式事件而增添了功效,以下代码所示:
清单8.JTA事件资本处置
  1. publicvoidtransferAccount(){UserTransactionuserTx=null;Connectionconn=null;Statementstmt=null;try{//取得Transaction办理对象userTx=(UserTransaction)getContext().lookup("java:comp/UserTransaction");//从数据库中获得数据库毗连,getDataSourceB前往撑持散布式事件的数据源conn=getDataSourceB().getConnection();//会话stmt已为撑持散布式事件举行了功效加强stmt=conn.createStatement();//启动事件userTx.begin();stmt.execute("updatet_account...whereaccount_id=A");userTx.commit();}catch(SQLExceptionsqle){//处置非常代码}catch(Exceptionne){e.printStackTrace();}}
复制代码
我们来看一下由XAConnection数据库毗连创立的会话(Statement)部分的代码完成(分歧的JTA供应商会有分歧的完成体例,此处代码示例只是向您演示事件资本是怎样被主动到场到事件中)。我们以会话对象的execute办法为例,经由过程在办法入手下手部分增添对associateWithTransactionIfNecessary办法的挪用,便可以包管在JTA事件时代,对任何数据库毗连的操纵城市被通明的到场到事件中。
清单9.将事件资本主动联系关系到事件对象-XAStatementimplementsStatement
  1. publicvoidexecute(Stringsql){//关于每次数据库操纵都反省此会话地点的数据库毗连是不是已被到场到事件中associateWithTransactionIfNecessary();try{//处置数据库操纵的代码....}catch(SQLExceptionsqle){//处置非常代码}catch(Exceptionne){e.printStackTrace();}}publicvoidassociateWithTransactionIfNecessary(){//取得TransactionManagerTransactionManagertm=getTransactionManager();Transactiontx=tm.getTransaction();//反省以后线程是不是有散布式事件if(tx!=null){//在散布式事件内,经由过程tx对象判别以后数据毗连是不是已被包括在事件中,//假如不是那末将此毗连到场到事件中Connectionconn=this.getConnection();//tx.hasCurrentResource,xaConn.getDataSource()不是尺度的JTA//接口办法,是为了完成散布式事件而增添的自界说办法if(!tx.hasCurrentResource(conn)){XAConnectionxaConn=(XAConnection)conn;XADataSourcexaSource=xaConn.getDataSource();//挪用Transaction的接口办法,将数据库事件资本到场到以后事件中tx.enListResource(xaSource.getXAResource(),1);}}}
复制代码
XAResource与Xid:XAResource是DistributedTransactionProcessing:TheXASpecification尺度的Java完成,它是对底层事件资本的笼统,界说了散布式事件处置过程当中事件办理器和资本办理器之间的协定,各事件资本供应商(如JDBC驱动,JMS)将供应此接口的完成。利用此接口,开辟职员能够经由过程本人的编程完成散布式事件处置,但这些一般都是由使用服务器完成的(服务器自带完成加倍高效,不乱)为了申明,我们将举例申明他的利用体例。
在利用散布式事件之前,为了辨别事件使之不产生搅浑,必需完成一个Xid类用来标识事件,能够把Xid设想成事件的一个标记符,每次在新事件创立是城市为事件分派一个Xid,Xid包括三个元素:formatID、gtrid(全局事件标识符)和bqual(分支润色词标识符)。formatID一般是零,这意味着你将利用OSICCR(OpenSystemsInterconnectionCommitment,Concurrency和Recovery尺度)来定名;假如你要利用别的一种格局,那末formatID应当年夜于零,-1值意味着Xid为有效。
gtrid和bqual分离包括64个字节二进制码来分离标识全局事件和分支事件,独一的请求是gtrid和bqual必需是全局独一的。
XAResource接口中次要界说了以下办法:


  • commit()-提交事件
  • isSameRM(XAResourcexares)-反省以后的XAResource与参数是不是统一事件资本
  • prepare()-关照资本办理器筹办事件的提交事情
  • rollback()-关照资本办理器回滚事件
在事件被提交时,Transaction对象会搜集一切被以后事件包括的XAResource资本,然后挪用资本的提交办法,以下代码所示:
清单10.提交事件-TransactionImplimplementsTransaction
  1. publicvoidcommit()throwsRollbackException,HeuristicMixedException,HeuristicRollbackException,SecurityException,IllegalStateException,SystemException{//失掉以后事件中的一切事件资本List<XAResource>list=getAllEnlistedResouces();//关照一切的事件资本办理器,筹办提交事件//关于临盆级其余完成,此处必要举行分外处置以处置某些资本筹办过程当中呈现的非常for(XAResourcexa:list){xa.prepare();}//一切事件性资本,提交事件for(XAResourcexa:list){xa.commit();}}
复制代码

回页首
停止语
经由过程如上先容信任读者对JTA的道理已有所懂得,本文中的示例代码都是幻想情形下的假定完成。一款完美成熟的JTA事件完成必要思索与处置的细节十分多,如功能(提交事件的时分利用多线程体例并发提交事件)、容错(收集,体系非常)等,其成熟也必要经由较长工夫的堆集。感乐趣的读者能够浏览一些开源JTA完成以进一步深切进修。
参考材料
进修


  • Java官方网站“JavaTransactionAPISpecification”供应了具体的JTA信息、包含版本,标准等,感乐趣的读者能够参考


  • 这篇文章“JavaTransactionAPI概述”(编程中国)具体形貌了XA资本的利用道理,感乐趣的读者能够参照进修


  • “JOTM”是一款开源的JTA完成,读者能够参照其源代码深切进修


  • developerWorksJava手艺专区:这里无数百篇关于Java编程各个方面的文章。



作者简介
肖国一是一名在IBM中国软件开辟中央(CSDL)事情的软件工程师,今朝处置企业电子商务使用的开辟。
王晓利,一名事情在IBMCSDL的软件工程师,具有5年的J2EE开辟履历和2年的DB2存储历程开辟履历,今朝处置企业电子商务使用的开辟。

进而能拉拢大多数程序员用windows产品。并且从net网页编程网页编程AJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net网页编程可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net网页编程决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net网页编程的,如果跨平台的.net网页编程还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-21 07:48:34 | 只看该作者
是一种使用者不需花费很多时间学习的语言
透明 该用户已被删除
板凳
发表于 2015-1-24 06:02:08 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
变相怪杰 该用户已被删除
地板
发表于 2015-1-31 21:24:17 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
因胸联盟 该用户已被删除
5#
发表于 2015-2-2 16:36:20 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
第二个灵魂 该用户已被删除
6#
发表于 2015-2-5 01:46:38 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
海妖 该用户已被删除
7#
发表于 2015-2-11 00:47:47 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
只想知道 该用户已被删除
8#
 楼主| 发表于 2015-3-1 19:00:45 | 只看该作者
是一种使用者不需花费很多时间学习的语言
精灵巫婆 该用户已被删除
9#
发表于 2015-3-2 20:45:24 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
小魔女 该用户已被删除
10#
发表于 2015-3-9 21:48:37 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
爱飞 该用户已被删除
11#
发表于 2015-3-11 18:46:18 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
柔情似水 该用户已被删除
12#
发表于 2015-3-19 07:36:31 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
13#
发表于 2015-3-27 12:58:58 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 00:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表