会计考友 发表于 2012-8-4 12:37:27

JAVA基础:Java对象及元素的归宿所在

在JAVA平台上开发应用轨范的时辰,有一个很年夜的特点就是其是在应用轨范运行的时辰才成立对象。换句话说,在轨范运行的时辰,才会最终确定对象的归属,即对象应该存储在什么处所。因为存储在分歧的区域,其在机能上会有所分歧。为此作为Java轨范开发人员需要体味各个存储区域的特点以及对机能的影响。然后再按照需要来调整应用轨范的区域分配。总的来说,在操作系统中有五个处所可以用来保留应用轨范运行中的数据。这类区域的特点以及对机能的影响剖析如下。 保留区域一:寄放器。
  虽然同在内存中,可是分歧的区域因为用途分歧,其机能也有所分歧。如就拿Java应用轨范来说,寄放器因为其处于措置器的内部,为此这个区域存取数据最快。跟内存中的其他存储区域有着寰宇之别。那么我们把所有对象都放到这个区域内,不就可以提高Java应用轨范的机能了吗?理论上是如斯,可是在现实中是行欠亨的。因为这个寄放器的数目长短常有限的。在内存中的寄放器区域是由编译器按照需要来分配的。我们轨范开发人员不能够经由过程代码来节制这个寄放器的分配。所以说,这第一个存储区域寄放器,我们只能够看看,而不能够对其发生任何的影响。
保留区域二:仓库。
  对象的建树有两种体例,一是在应用轨范开发的过程中就建树对象;二是在轨范运行的过程中要用到对象的时辰再来建树对象。前者比后者机能要高,尔后者比前者要矫捷。这主若是因为前者建树对象的时辰,就是这个仓库中建树的。虽然其建树的对象没有保留在寄放器中,可是经由过程这个对象的推栈指针可以直接年夜措置器哪里获得相关的撑持。如仓库指针往上移动的时辰,则释放原有对象占用的内存;如仓库指针向下移动时,则为对象分配新的内存。所以,如不美观把对象存放在这个仓库中,虽然机能没有像存放在寄放器中那么理想,可是仍然比存储在其他处所要好的多。
  因为Java轨范是在轨范运行过程中才按照需要来建树对象。为此对象就不能够保留在这个仓库中。不外Java应用轨范也不能够白白的华侈这个珍贵的空间。为此虽然Java对象自己没有保留在这个仓库中(不是不保留而是这琅缦慊有他的容身之地),可是仍是应该把一些可以放的内容放到这个仓库中,以提高应用轨范的机能。如可以把一些对象引用存放在这个仓库中。
  此外对于一些根基的数据类型对象,Java轨范也往往把他们放置在仓库中,以提高数据措置的机能。如一些整数型、字符型的数据对象,这些对象有些配合的特点,如对象斗劲小、是Java轨范供给的尺度对象等等。对于这些对象因为每个应用轨范根基上都需要用到,而且我们轨范开发人员只能够引用这些对象,而不能够对其进行更改。为此Java轨范在措置的时辰,往往一路头就建树了对象(即直接在仓库中建树对象并保留),而不像其他对象一样,在需要的时辰才建树。只所以在仓库中建树这些对象,还有一个主要的原因。因为如不美观在仓库中建树对象的话,Java编纂器必需知道存储在仓库内所稀有据简直切巨细和生命周期。为了获得这些信息,必需发生相关的代码来获得这些信息,以便其操作仓库指针。通俗的对象巨细、生命周期等等难以预先获得,为此在仓库中建树通俗的对象,对于Java应用轨范来说并不是很合适。相反,这些Java编译器预界说的对象巨细并不会跟着机械硬件架构的转变和用户需求的转变而转变;而且这些对象往往年夜始之终城市存在的,所以也不存在生命周期的问题。所以把这些对象放置在仓库中是合理的,也是可实现的。如斯措置,不仅不会影响到对象的矫捷性,而且还可以供给斗劲好的机能。
保留区域三:堆。
  堆虽然跟仓库一样,都是随机访谒存储器中的区域,可是两者有很年夜的分歧。因为在堆中,没有仓库指针,为此也就无法直接年夜措置器何处获得撑持。为此其机能跟仓库比起来,就有必然的差距。凡是情形下,除膳缦沔所说的一些预界说对象之外,其他的对象都是保留在这个堆中的。或者说,操作new关头字建树的对象都是保留在堆中的。保留在堆中其益处也是显而易见的。如Java编译器不需要知道年夜堆里需要分配若干好多存储区域,也不必知道存储的数据在堆里会存活多长时刻。所以在堆里分配存储有很年夜的矫捷性。当需要对象时,我们可以使用New关头字成立一个对象。然后系统会自动给这个对象在堆平分配一个区域让其作为归宿。不外其最年夜的不足之处,就是在堆中建树对象与分配存储区域,要比在仓库中慢良多。鱼与熊掌不能兼灯揭捉。

会计考友 发表于 2012-8-4 12:37:28

JAVA基础:Java对象及元素的归宿所在

</p>  2、写测试类
  import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.Statement;
  /**
  * Created by IntelliJ IDEA.
  public class TestProxool {
  public static String dburl = "jdbc:oracle:thin:@192.168.104.192:1521:tim";
  public static String user = "tim";
  public static String password = "tim_8968888";
  /**
  * JDBC体例测试
  *
  * @throws Exception
  */
  public static void test1() throws Exception {
  String testsql = "select * from village t where lastid = 346";
  //1:注册驱动类
  Class.forName("oracle.jdbc.driver.OracleDriver");
  //2:建树数据库毗连
  Connection conn = DriverManager.getConnection(dburl, user, password);
  //3:建树执行SQL的对象
  Statement stmt = conn.createStatement();
  //4:执行SQL,并获取返回结不美观
  ResultSet rs = stmt.executeQuery(testsql);
  //5:措置返回结不美观,此处打印发芽结不美观
  while (rs.next()) {
  System.out.print(rs.getLong("id") + "t");
  System.out.print(rs.getString("name") + "t");
  System.out.println();
  }

  //6:封锁数据库毗连
  conn.close();
  }
  /**
  * proxool体例测试
  *
  * @throws Exception
  */
  public static void test2() throws Exception {
  //Java应用中先要加载设置装备摆设文件,否则谁知道你设置装备摆设给谁用的
  JAXPConfigurator.configure("F:\_test\synorg\src\proxool.xml", false);
  String testsql = "select * from village t where lastid = 346";
  //1:注册驱动类,此次这个驱动已经不是Oracle的驱动了,是Proxool专用的驱动
  Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
  //2:建树数据库毗连,这个参数是一个字符串,是数据源的别号,在设置装备摆设文件中设置装备摆设的timalias,参数名目为:proxool.数据源的别号
  Connection conn = DriverManager.getConnection("proxool.timalias");
  //3:建树执行SQL的对象
  Statement stmt = conn.createStatement();
  //4:执行SQL,并获取返回结不美观
  ResultSet rs = stmt.executeQuery(testsql);
  //5:措置返回结不美观,此处打印发芽结不美观
  while (rs.next()) {
  System.out.print(rs.getLong("id") + "t");
  System.out.print(rs.getString("name") + "t");
  System.out.println();
  }
  //6:封锁数据库毗连
  conn.close();
  }
  public static void main(String[] args) throws Exception {
  test2();
  }
  }

会计考友 发表于 2012-8-4 12:37:29

JAVA基础:Java对象及元素的归宿所在

  运行结不美观:
  2009-10-14 18:13:05 - INFO org.logicalcobwebs.proxool.ProxoolFacade - Proxool 0.9.1 (23-Aug-2008 11:10)
  2009-10-14 18:13:05 - WARN org.logicalcobwebs.proxool.timalias - Use of proxool.maximum-new-connections is deprecated. Use more descriptive proxool.simultaneous-build-throttle instead.
  5411 张一村
  5412 张二村
  5413 张三村
  5414 张四村
  5415 南原村
  5416 辛庄村
  5417 凡村
  5418 西阳村
  5419 人马村
  5420 前关村
  5421 后关村
  5422 赵村
  5423 水淆村
  5424 沟东村
  5425 陈村
  5426 窑店村
  5427 坡头村
  20588 年夜安头
  20589 涧里村
  20590 人马寨
  20591 白草村
  20592 窑院村
  20593 寺下村
  20594 反上村
  33651 小安头
  33652 五花岭
  33653 东沟
  33654 西沟
  33655 南沟
  33656 王村
  33657 营前
  33659 东阳
  33661 太阳
  33663 丰阳
  33665 宜村
  33667 窑头
  32225 石原村
  32226 庙上村
  32227 庙洼
  38739 丁管营
  38841 涧西
  2009-10-14 18:13:06 - INFO org.logicalcobwebs.proxool.timalias - Shutting down 'timalias' pool immediately
  2009-10-14 18:13:07 - INFO org.logicalcobwebs.proxool.PrototyperController - Stopping Prototyper thread
  2009-10-14 18:13:07 - INFO org.logicalcobwebs.proxool.HouseKeeperController - Stopping HouseKeeper thread
  Process finished with exit code 0
  因为使用了log4j,这个结不美观琅缦沔输出了一些日志信息。
  3、声名
  Proxool的设置装备摆设文件路径不能使用ClassPath,我查看过接口代码,可以传入一个XmlReader、或流来解决,这里写成绝对路径就凑合着能跑起来鞠肝ⅲ
  也撑持Properties的设置装备摆设,则个可以参考官方文档,也很便利的。</p>

会计考友 发表于 2012-8-4 12:37:30

JAVA基础:Java对象及元素的归宿所在

</p>  2、JTA(Java Transaction API)事务
  JTA是一种高层的,与实现无关的,与和谈无关的API,应用轨范和应用处事器可以使用JTA来访谒事务。
  JTA许可应用轨范执行分布式事务措置--在两个或多个收集计较机资本上访谒而且更新数据,这些数据可以分布在多个数据库上。JDBC驱动轨范的JTA撑持极年夜地增强了数据访谒能力。
  如不美观打算用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动轨范。一个实现了这些接口的驱动轨范将可以介入 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工场。 XAConnection s 是介入 JTA 事务的 JDBC 毗连。
  您将需要用应用处事器的打点工具设置 XADataSource 。年夜应用处事器和 JDBC 驱动轨范的文档中可以体味到相关的指导。
  J2EE 应用轨范用 JNDI 发芽数据源。一旦应用轨范找到了数据源对象,它就挪用 javax.sql.DataSource.getConnection() 以获获得数据库的毗连。
  XA 毗连与非 XA 毗连分歧。必然要记住 XA 毗连介入了 JTA 事务。这意味着 XA 毗连不撑持 JDBC 的自动提交功能。同时,应用轨范必然不要对 XA 毗连挪用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。相反,应用轨范应该使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
  3、容器事务
  容器事务主若是J2EE应用处事器供给的,容器事务年夜多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事务打点,我们可以经由过程EJB容器供给的容器事务打点机制(CMT)完成统一个功能,这项功能由J2EE应用处事器供给。这使得我们可以简单的指定将哪个体例插手事务,一旦指定,容器将负责事务打点使命。这是我们土建的解决体例,因为经由过程这种体例我们可以将事务代码解除在逻辑编码之外,同时将所有坚苦交给J2EE容器去解决。使用EJB CMT的此吐矣闽益处就是轨范员无需关心JTA API的编码,不外,理论上我们必需使用EJB。
四、三种事务差异
  1、JDBC事务节制的局限性在一个数据库毗连内,可是其使用简单。
  2、JTA事务的功能强年夜,事务可以跨越多个数据库或多个DAO,使用也斗劲复杂。
  3、容器事务,首要指的是J2EE应用处事器供给的事务打点,局限于EJB应用使用。
五、总结
  事务节制是构建J2EE应用不成缺傲幽一部门,合理选择应用何种事务对折个应用系统来说至关主要。一般说来,在单个JDBC 毗连毗连的情形下可以选择JDBC事务,在跨多个毗连或者数据库情形下,需要选择使用JTA事务,如不美观用到了EJB,则可以考虑使用EJB容器事务。
页: [1]
查看完整版本: JAVA基础:Java对象及元素的归宿所在