04 2013 档案

摘要:Spring 远程调用提供了几种模式:RMI、Hessian、Burlap、HttpInvoker、JAX RPC/JAX-WS、JMS等。参考手册中提供了这几种远程调用方式的集成说明。这里根据一些资料进行一次归总,以了解各种方式的特点帮助进行选择。1.RMI:是Java标准的远程方法调用接口,即Remote Method Invocation。它基于Java序列化机制实现远程方法的调用。通常RMI的实现过程:1)定义远程服务接口(从Remote接口派生的接口定义)2) 实现定义的接口,使用UnicastRemoteObject.exportObject()方法导出该远程对象(也可以继承Uni 阅读全文
posted @ 2013-04-26 20:27 Jevo 阅读(1410) 评论(0) 推荐(0)
摘要:前面总结了Lucene的基本使用,但大多数情况下,在多线程环境中总会出现多个线程同时访问索引的情况,这样不可免地会出现同步访问的问题。那么我们需要确定Lucene的线程安全性。我们先来看Lucene官网(http://wiki.apache.org/lucene-java/LuceneFAQ)上对几个问题的解答:Why am I getting an IOException that says "Too many open files"?The number of files that can be opened simultaneously is a system-wid 阅读全文
posted @ 2013-04-25 22:09 Jevo 阅读(649) 评论(0) 推荐(0)
摘要:Lucene基本概念:Lucene中最基础的概念是索引(index)、段(Segement)、文档(document)、字段(field)、词条(term)和Tocken。 索引(Index)包含了一个文档的序列。 段(Segment):可以理解为一个子索引,添加索引时并不是每个document都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment 文档(Document)是一些域(Field)的序列,用来描述文档(文档可以是一个 HTML 页面,一封电子邮件、一个文本文件、字符串或者数据库表的一条记录等)。一个 Docume 阅读全文
posted @ 2013-04-24 22:32 Jevo 阅读(2140) 评论(1) 推荐(1)
摘要:前面讲述了通过自定义ClassLoader来实现Class的热替换,这里还可以通过动态修改内存中的字节码,将修改过的class再次装载到JVM中。实现动态修改内存中的字节码主要借助Java的Instrumentation特性来实现的。Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。在 Java SE 6 阅读全文
posted @ 2013-04-23 23:10 Jevo 阅读(1497) 评论(0) 推荐(0)
摘要:前面有提到过Tomcat的热部署,所谓热部署就是在应用运行时更新Java类文件以升级软件功能,升级过程不需要关停和重启应用。要进行热部署需要做class热替换。Class热替换实现了将修改的class再次加载到JVM中,以动态替换内存中原有的class字节码。实现class的热替换就与Java类加载过程相关,关于Java类加载过程的文章或书籍早些年就已经很多了,这里从” 深入探讨 Java 类加载器(http://www.ibm.com/developerworks/cn/java/j-lo-classloader/)’’一文中摘录了部分内容说明Java类的加载过程。类加载器基本概念基本上所有 阅读全文
posted @ 2013-04-22 22:49 Jevo 阅读(3933) 评论(0) 推荐(1)
摘要:在应用中我们一般都会涉及到缓存的使用,实现缓存的方式有很多,在Spring框架中提供了一种支持第三方缓存插件的缓存管理机制。作为自留田总结一下Spring缓存管理的使用。Spring只是提供了个缓存抽象,并没有提供缓存具体实现,我们可以选择第三方的缓存实现,如EHCache、JBoss Cache。Spring的缓存主要是为方法做cache,第一次调用方法时,将方法返回的结果缓存起来,当再次调用该方法时,则先访问缓存,当缓存中存在有相同参数的方法调用的相应数据(结果)时,则直接返回缓存中的数据。缓存应该保证每次调用相同参数的方法返回的结果一致。Spring缓存机制包括了两个方面的操作:缓存方法 阅读全文
posted @ 2013-04-18 21:47 Jevo 阅读(3464) 评论(0) 推荐(0)
摘要:缓存在应用程序中的使用十分广泛,由于缓存的介质一般是内存,读写速度快,所以通常我们会把常用的或者要通过比较耗时或大量资源取得的数据缓存起来,从而加整后续的使用。这样在缓存的应用过程中,就需要考虑缓存并发访问的管理以及缓存数据的生命周期。通常,缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围可分为三类。1 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。2 进程范围:缓存被进程内的所有事务共享。这些事 阅读全文
posted @ 2013-04-17 21:57 Jevo 阅读(686) 评论(0) 推荐(0)
摘要:我们知道Hibernate是对JDBC的轻量级对象封装,它本身不具备事务处理能力,只是对底层JDBC事务或JTA事务进行了封装。具体使用什么事务可以在配置文件中进行配置: <session-factory> <property name="hibernate.transaction.factory_class"> org.hibernate.transaction.JTATransactionFactory <!--org.hibernate.transaction.JDBCTransactionFactory--> </prope 阅读全文
posted @ 2013-04-16 23:20 Jevo
摘要:延迟加载就是在当真正需要数据的时候去执行数据加载操作,从而避免一些多余的性能开销(数据库查询)。在Hibernate3中提供了对实体对象、集合和属性的延迟加载。1.实体对象的延迟加载延迟加载实体对象只需在实体映射关系中将lazy属性设置为true,如下: <class name=”xxx” table=”xxx” lazy=”true”> …… </class> 通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load 阅读全文
posted @ 2013-04-15 23:02 Jevo 阅读(557) 评论(0) 推荐(0)
摘要:在长期的Java客户端开发过程中,一个常用的机制就是消息传送。无论是同步消息传送还是异步消息传送,应该说是建立在Observer设计模式基础上的。在Java中提供了基于这种模式的Observable/Observer事件框架,分别由java.util.Observable类和java.util.Observer接口组成,其中,Observer是观察者角色,Observable是被观察目标(subject)角色。我们先简单的看一下这两个类(接口):Observable是一个封装了基本功能的类,比如注册observer(attach功能),注销observer(detatch功能)等。我们一般只需 阅读全文
posted @ 2013-04-12 23:04 Jevo 阅读(11223) 评论(0) 推荐(1)
摘要:在长期的Java客户端开发中,最常见的一个客户端调用模式就是Java的异步调用。所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。在Java语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。虽然在1.5以前从异步线程中取得返回结果需要自己精心设计,但从JDK1.5开始引入了Future接口(FutureTask类)从异步执行的线程中取得返回值。Future 表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。FutureTask类是Future接口 阅读全文
posted @ 2013-04-11 23:05 Jevo 阅读(29784) 评论(0) 推荐(2)
摘要:Hibernate提供了一系列的查询接口,这些接口在实现上又有所不同。这里对Hibernate中的查询接口进行一个小结。我们首先来看一下session加载实体对象的过程:Session在调用数据库查询前,首先会在缓存中进行查询。如果在内部缓存中通过实体类型和id进行查找并命中,数据状态合法,则直接返回。如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。如在第二级缓存中没有命中,则发起数据库查询操作(Select SQL),根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。将其数据对象纳入当前Session实体管理容器(一级缓存)。执行In 阅读全文
posted @ 2013-04-10 23:08 Jevo 阅读(1050) 评论(0) 推荐(0)
摘要:在项目的开发过程之中,我们常会遇到数据的批量处理问题。在持久层采用Hibernate框架时,在进行批量操作时,需要考虑Hibernate实现机制带来的一些问题。我们知道在每个Hibernate Session中都维持了一个必选的数据缓存,所有保存的实例都将保存在Session缓存中,这个缓存随着Session的创建而存在,随着Session的销毁而消亡。这个内部缓存正常情况下是由Hibernate自动维护的,并且没有容量限制。在批量插入与更新时,由于每次保存的实体都会保存在Session缓存中,当数据量大的时候,就可能出现OutOfMemoryException(内存溢出异常)。所以批量增加或 阅读全文
posted @ 2013-04-09 20:55 Jevo 阅读(16659) 评论(0) 推荐(3)
摘要:这里主要总结Java中集成Groovy的应用。Groovy可以与Java完美集成来扩展我们的应用,比如替代Java+jexl实现算式表达式计算或其它功能。在Ofbiz中也集成了Groovy来执行一些查询功能,并且是开始更多的使用Groovy而不是原有的bsh。这里仅仅初步总结我们在Java项目中如何来应用Groovy扩展我们的应用。1.使用GroovyShell计算表达式使用Binding对象将变量传入表达式,并通过GroovyShell返回表达式的计算结果。如下例:public class GroovyShellExample { public static void main(String 阅读全文
posted @ 2013-04-08 13:46 Jevo 阅读(11485) 评论(1) 推荐(0)
摘要:JDK5.0开始引进了java Enum枚举类型,它可作为我们在编写代码时的一个技巧,有时恰恰因为它,我们能够"优雅而干净"地解决问题。在使用枚举类型时,我们所编写的枚举类都是隐式地继承于java.lang.Enum类,枚举类的每个成员都被隐式声明为public static final,可以通过类名称直接使用它们。由于枚举类型本质上就是一个类,所以可以在一个独立的文件中来声明枚举值,或者在某个类中声明枚举成员。要定义枚举类型是使用enum关键词。下面就枚举的用法作一个小结:用法一:提供常量、可用于Switch中这是它的最基本的用法,把相关的常量定义到一个枚举类型里。用法二 阅读全文
posted @ 2013-04-03 23:12 Jevo 阅读(357) 评论(0) 推荐(0)
摘要:Hibernate是当前流行的对象关系映射(ORM)框架,实现了程序对象到关系型数据库数据的映射。即然ORM实现的是对象和关系型数据表间的映射,它必然要在映射过程中解决对象层次结构中的关系问题。这里对映射关系作一个小结,以备以后查阅。我们很多Web项目都是由前端页面驱动来进行架构设计,即首先作出Web原型后,并基于此原型来产生表结构。一般情况下,所产生的对象层次是扁平的,对应的表结构也很简单,表间通常没有复杂的关联关系。但也有很多时候,我们需要往先分析项目的业务,然后建立起业务模型,根据业务模型的描述分解出不同类型的对象类。在最后会考虑对其中需要持续化的实体对象建立相关的数据表。这是面向对象的 阅读全文
posted @ 2013-04-02 22:12 Jevo 阅读(1870) 评论(0) 推荐(0)
摘要:曾经在一个项目中使用表达式来判断处理一些条件,比如订单价格的折扣计算,库存数量的告警线设置等。我们引入了Jexl(一种表达式语言引擎)来处理这些表达式。这里根据几个例子来总结一下它的应用。例一、算式表达式的处理:public class jextTest { public static void main(String[] args) { //数学公式解析和计算 String expression = "(a+b)/c*5"; JexlContext jexlContext = new MapContext(); jexlContext.set("a", 阅读全文
posted @ 2013-04-01 23:38 Jevo 阅读(1914) 评论(0) 推荐(0)