摘要:转载http://jiwenke.iteye.com/在认真学习Rod.Johnson的三部曲之一:<<Professional Java Development with the spring framework>>,顺便也看了看源代码想知道个究竟,抛砖引玉,有兴趣的同志一起讨论研究吧!以下内容引自博客:http://jiwenke-spring.blogspot.com/,欢迎指导:)在Spring中,IOC容器的重要地位我们就不多说了,对于Spring的使用者而言,IOC容器实际上是什么呢?我们可以说BeanFactory就是我们看到的IoC容器,当然了Sprin
阅读全文
09 2012 档案
摘要:上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC容器是怎样被载入和起作用的。简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对应的建立起一个IOC容器的体系。其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象。在这个上下文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就构成了一个层次化的上下文结构。在web容器中启动Spring应用程序就是一个建立这个上下文体系的过程。Spring为web应用提供了上下文的
阅读全文
摘要:下面我们看看Spring JDBC相关的实现,在Spring中,JdbcTemplate是经常被使用的类来帮助用户程序操作数据库,在JdbcTemplate为用户程序提供了许多便利的数据库操作方法,比如查询,更新等,而且在Spring中,有许多类似 JdbcTemplate的模板,比如HibernateTemplate等等 - 看来这是Rod.Johnson的惯用手法,一般而言这种Template中都是通过回调函数CallBack类的使用来完成功能的,客户需要在回调接口中实现自己需要的定制行为,比如使用客户想要用的SQL语句等。不过往往Spring通过这种回调函数的实现已经为我们提供了许多现成
阅读全文
摘要:下面我们对Spring MVC框架代码进行分析,对于webApplicationContext的相关分析可以参见以前的文档,我们这里着重分析Spring Web MVC框架的实现.我们从分析DispatcherServlet入手:Java代码//这里是对DispatcherServlet的初始化方法,根据名字我们很方面的看到对各个SpringMVC主要元素的初始化protectedvoidinitFrameworkServlet()throwsServletException,BeansException{initMultipartResolver();initLocaleResolver()
阅读全文
摘要:下面我们来看看Spring的AOP的一些相关代码是怎么得到Proxy的,让我们我们先看看AOP和Spring AOP的一些基本概念:Advice: 通知,制定在连接点做什么,在Sping中,他主要描述Spring围绕方法调用注入的额外的行为,Spring提供的通知类型有: before advice,AfterReturningAdvice,ThrowAdvice,MethodBeforeAdvice,这些都是Spring AOP定义的接口类,具体的动作实现需要用户程序来完成。Pointcut: 切点,其决定一个advice应该应用于哪个连接点,也就是需要插入额外处理的地方的集合,例如,被某个
阅读全文
摘要:我们看看Spring中的事务处理的代码,使用Spring管理事务有声明式和编程式两种方式,声明式事务处理通过AOP的实现把事物管理代码作为方面封装来横向插入到业务代码中,使得事务管理代码和业务代码解藕。在这种方式我们结合IoC容器和Spirng已有的FactoryBean来对事务管理进行属性配置,比如传播行为,隔离级别等。其中最简单的方式就是通过配置TransactionProxyFactoryBean来实现声明式事物;在整个源代码分析中,我们可以大致可以看到Spring实现声明式事物管理有这么几个部分: * 对在上下文中配置的属性的处理,这里涉及的类是TransactionAttribute
阅读全文
摘要:前面我们分析了Spring AOP实现中得到Proxy对象的过程,下面我们看看在Spring AOP中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为我们提供AOP功能的;在JdkDynamicAopProxy中生成Proxy对象的时候:Java代码returnProxy.newProxyInstance(classLoader,proxiedInterfaces,this);这里的this参数对应的是InvocationHandler对象,这里我们的JdkDynamicAopProxy实现了这个接口,也就是说当Proxy对象的函数被调用的时候,这个Inv
阅读全文
摘要:O/R工具出现之后,简化了许多复杂的信息持久化的开发。Spring应用开发者可以通过Spring提供的O/R方案更方便的使用各种持久化工具,比如Hibernate;下面我们就Spring+Hibernate中的Spring实现做一个简单的剖析。Spring对Hinberanate的配置是通过LocalSessionFactoryBean来完成的,这是一个工厂Bean的实现,在基类AbstractSessionFactoryBean中:Java代码/***这是FactoryBean需要实现的接口方法,直接取得当前的sessionFactory的值*/publicObjectgetObject()
阅读全文
摘要:我们从FilterSecurityInterceptor我们从入手看看怎样进行授权的:Java代码//这里是拦截器拦截HTTP请求的入口publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{FilterInvocationfi=newFilterInvocation(request,response,chain);invoke(fi);}//这是具体的拦截调用publicvoidinvoke(FilterInvoca
阅读全文
摘要:简单分析一下Spring Acegi的源代码实现:Servlet.Filter的实现AuthenticationProcessingFilter启动Web页面的验证过程 - 在AbstractProcessingFilter定义了整个验证过程的模板:Java代码publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//这里检验是不是符合ServletRequest/SevletResponse的要求if(!(requ
阅读全文
摘要:转载http://blog.csdn.net/scorpio3k/article/details/7628894定义数据访问接口:[java]view plaincopypackageorg.kevin.cache.dao;importjava.util.Collection;importorg.kevin.cache.domain.Data;publicinterfaceDataDAO{publicvoidadd(Datadata);publicvoidupdate(Datadata);publicDatafind(Integerid);publicvoiddelete(Integerid)
阅读全文
摘要:该版本最酷的新特性就是引入全方位的缓存支持。Spring 3.1 提供了对已有的 Spring 应用增加缓存的支持,这个特性对应用本身来说是透明的,通过缓存抽象层,使得对已有代码的影响降低到最小。该缓存机制针对于 Java 的方法,通过给定的一些参数来检查方法是否已经执行,Spring 将对执行结果进行缓存,而无需再次执行方法。可通过下列配置来启用缓存的支持(注意使用新的schema):[html]view plaincopy<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="
阅读全文
摘要:转载http://blog.csdn.net/mingshuo0615/article/details/6085248作为一名Java开发人员你一定想知道如何在Spring应用中使用新的Ehcache注解功能;是吧?ehcache-spring-annotatios是获得Apache认证的一个开源项目;它大大简化了在Spring应用中基于业界使用广泛的Ehacche-2.0版本实现缓存的技术,1.1.2版本的ehcache-spring-annotations刚刚发布不久,在本文中,我将会介绍如何在一个web工程时使用ehcache-spring-annotations实现缓存机制。创建一个W
阅读全文
摘要:转载http://blog.163.com/among_1985/blog/static/2750052320126178159568/概述我们都知道Hibernate可以支持多种数据库,这种支持是通过对于不同数据库,配置对应数据库的方言完成的。在早期的Hibernate中,需要通过配置hibernate.dialect参数,指定当前使用的数据库方言。对于需要同时支持多种数据库的产品来说,每切换一个数据库,就要重新配置以下dialect参数会显得很麻烦。于是,DialectResolver工厂类就诞生了。简单的说,DialectResolver以及其子类的作用,是根据数据库的MetaData,
阅读全文
摘要:转载http://blog.163.com/among_1985/blog/static/2750052320126168394939/在Hibernate 4.1.4中,其中使用的数据库连接均由ConnectionProvider.getConnection()方法获取。ConnectionProvider是个接口,其各个子类实现实际数据库连接的获取和释放。在hibernate的框架中ConnectionProvider以及其子类,使用适配器模式,将各种不同类型数据源的适配工作,交给子类进行。类结构如下:ConnectionProviderConnectionProvider是org.hib
阅读全文
摘要:转载http://cuishen.iteye.com/blog/427921大家都知道hibernate是在JDBC基础上的封装,那么它的数据库连接是怎样实现的呢?带着这个疑问最近研究了下hibernate的源代码,代码还是比较简单的,但是做的很通用,好现在一起来看下源代码hibernate的数据库连接类都放在org.hibernate.connection包内,对于数据库连接类hibernate称其为ConnectionProvider,对!就是连接提供者,org.hibernate.connection.ConnectionProvider只是个供hibernate使用的接口,通过该接口的
阅读全文
摘要:转载http://www.iflym.com/index.php/code/resolve-hibernate-result-transformer-by-query.html任何包装jdbc的框架,都离不开将最终的数据封装成java对象的一个过程。在jdbc中,取得的数据被封装在resultset中,通过迭代resultset来一次次的取得相应的字段和数据值。数据库框架始终需要解决的问题在于将resultset中的字段名称信息和相应的字段值对应起来,然后封装成对象,最后将所有的对象形成一个集合,并最终返回给调用者。 任何数据库框架都逃不过这中间的处理逻辑,只不过如何将这些逻辑分散在上下的处理
阅读全文
摘要:转载http://blog.csdn.net/wzb56/article/details/7914954#1.构建词典内存树的TrieNode节点类: packagecn.wzb.segmenter.mm.bean;importjava.util.HashMap;/***构建内存词典的Trie树结点**/publicclassTrieNode{/**结点关键字,其值为中文词中的一个字*/publiccharkey='\0';/**如果该字在词语的末尾,则bound=true*/publicbooleanbound=false;/**指向下一个结点的指针结构,用来存放当前字在词中
阅读全文
摘要:首先,我们需要使得ConcurrentSessionFilter生效并在spring-security.xml配置。[html]view plaincopy<httpauto-config="true"use-expressions="true"><!--Uncommenttolimitthenumberofsessionsausercanhave--><session-managementinvalid-session-url="/index.do"><concurrency-control
阅读全文
摘要:转载http://blog.csdn.net/beiyetengqing/article/details/7856113关注Trie 这种结构已经很久,Trie有一个很有趣的用途,那就是自动提示。而且,前不久在一次面试里,也需要用Trie来解答。所以,在此对这个数据结构进行总结。Trie,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符
阅读全文
摘要:转载http://blog.csdn.net/chensugang/article/details/3423650今天学习了一下Spring的BeanPostProcessor接口,该接口作用是:如果我们需要在Spring容器完成Bean的实例化,配置和其他的初始化后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现。下面我们来看一个简单的例子:packagecom.spring.test.di;importorg.springframework.beans.BeansException;importorg.springframework.beans
阅读全文
摘要:1.概述 Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现,下面简单分析FactoryBean的用法。2.实例以下SimpleFactoryBean类实现了FactoryBean接口中的三个方法。 并将
阅读全文
摘要:在sping中提供了另一种实现template模式的方法,利用接口回调函数.(1)TransactionTemplate的示例代码:publicclassTransactionTemplateextendsDefaultTransactionDefinitionimplementsInitializingBean{..........//进行事务处理的骨架,指明事务处理的顺序publicObjectexecute(TransactionCallbackaction)throwsTransactionException{TransactionStatusstatus=this.transacti
阅读全文
摘要:Spring的AOP是建立在Java的动态代理的基础上的,学习Java动态代理机制有助于循序渐进地理解AOP的思想。 传统的日志输出方法是在每一个业务逻辑方法里编写记录日志的代码,这样,程序中就会有很多类似的日志输出代码,造成了很大的耦合。那么,使用什么方法可以使业务逻辑和输出日志的代码分离,并实现日志信息代码的重用呢?Java的代理机制可以改善这个问题。 首先编写一个日志信息的代理类,这个类实现了接口InvocationHandler,然后编写一个接口,并实现这个接口,在实现类中编写具体的逻辑代码,最后针对接口编写测试类,查看测试结果。具体步骤如下: (1)编写一个日志信息的代理类LogPr
阅读全文
摘要:转载http://explore.iteye.com/blog/667992Spring对JDBC的抽象和对Hibernate的集成,都采用了一种理念或者处理方式,那就是模板方法模式与相应的Callback接口相结合。采用模板方法模式是为了以一种统一而集中的方式来处理资源的获取和释放,以JdbcTempalte为例,如下:Java代码publicabstractclassJdbcTemplate{publicfinalObjectexecute(Stringsql){Connectioncon=null;Statementstmt=null;try{con=getConnection();st
阅读全文
摘要:转载http://rickyboy.iteye.com/blog/568605观察者模式在不仅在java SWT中还是spring hibernate 应用都是非常广泛的,下面就我的理解做个记录。首先要理解一些概念是必须的事件源:事件源就是一个事件发生的组件,例如按钮,面板,在spring中可以表现为容器。事件:我们都知道当我们点击一下按钮就是一个事件发生了。在具体表现为ActionEvent类。比如时钟Timer类发生定时性动作时。监听器:当某个事件发生的时候,监听器就会监听到,来进行相应的动作。当然一个容器有可能既是事件源。下面是一个spring的观察者模式的事件的例子,在spring中要
阅读全文
摘要:阅读spring secirity源码,发现其中的代理模式用例UserDetailsService接口publicinterfaceUserDetailsService{//~Methods========================================================================================================/***Locatestheuserbasedontheusername.Intheactualimplementation,thesearchmaypossiblybecase*insensitive
阅读全文
摘要:转载http://liuxi1024.iteye.com/blog/583145 策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。下面使用spring中源码说明策略模式(spring va.
阅读全文
摘要:JDBCContext类主要解决数据连接的问题publicclassJDBCContext{privatestaticfinalLoglog=LogFactory.getLog(JDBCContext.class);//privateDatabasedatabase;privateDataSourcedatasource;protectedConnectionconnection;privatebooleanisValid=true;privatestaticThreadLocal<JDBCContext>jdbcContext;/***私有构造函数*@paramdatabase*
阅读全文
摘要:运行tomcat很奇怪的问题在本机上运行正常,移植到服务器上出现异常The CATALINA_HOME environment variable is not defined correctly我部署的服务器是win2003 64bit操作系统 ,本机是win2003 32bit操作系统在本机catalina.bat文件设置setJAVA_OPTS=-Xms512m-Xmx640msetJAVA_OPTS=%JAVA_OPTS%-server-XX:PermSize=512M-XX:MaxPermSize=1024m在服务器上 将上面两行rem注释掉,并添加下面一行后,运行正常remsetJA
阅读全文
摘要:在配置Middlegen Hibernate3过程中遇到的一些问题1. Couldn't connect to database: encoding not supported!!解决办法:删除之前的数据库jar包,引入附件中的数据库包db2java.jar、db2jcc_javax.jar、db2jcc.jar2.成功生成xml后再生成java文件时异常doesn't support the "output" attribute 与net/sf/hibernate/MappingException 因为引用的是Hibernate3要与之前的Hibernat
阅读全文
摘要:下载Middlegen-Hibernate:http://prdownloads.sourceforge.net/hibernate/下载ant:http://archive.apache.org/dist/ant/分别解压设置环境变量中的path把ant解压后目录的bin目录添加进去(别忘了和前一个项用;分隔)把jtds驱动复制到Middlegen-Hibernate的解压后的目录的lib目录中在Middlegen-Hibernate的目录的config\database中打开mssql.xml改成<propertyname="database.driver.file&quo
阅读全文
摘要:Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/...
阅读全文
摘要:汉字转成拼音如果自己实现起来有点麻烦,主要是怕有些汉字转不了,所以就准备使用一个开源的工具Pinyin4j. pinyin4j是一个支持将中文转换到拼音的Java开源类库,pinyin4j能够根据中文字符获取其对应的拼音,而且拼音的格式可以定制。pinyin4j的主页:http://pinyin4j.sourceforge.net/ 1. 支持简体中文和繁体中文字符; 2. 支持转换到汉语拼音,通用拼音, 威妥玛拼音(威玛拼法), 注音符号第二式, 耶鲁拼法和国语罗马字; 3. 支持多音字,即可以获取一个中文字符的多种发音; 4. 支持多种字符串输出格式,比如支持Unicode格式的字符
阅读全文
摘要:转载http://tenyears.iteye.com/blog/40489 格式化处理从JDK1.4开始,Java的标准库中就包含了NIO,即所谓的“New IO”。其中最重要的功能就是提供了“非阻塞”的IO,当然包括了Socket。NonBlocking的IO就是对select(Unix平台下)以及 WaitForMultipleObjects(Windows平台)的封装,提供了高性能、易伸缩的服务架构。说来惭愧,直到JDK1.4才有这种功能,但迟到者不一定没有螃蟹吃,NIO就提供了优秀的面向对象的解决方案,可以很方便地编写高性能的服务器。话说回来,传统的Server/Client实现是基
阅读全文
摘要:Faceted search has become a critical feature for enhancing findability and the user search experience for all types of search applications. In this article, Solr creator Yonik Seeley gives an introduction to faceted search with Solr.By Yonik SeeleyWhat is Faceted Search?Faceted search is the dynamic
阅读全文
摘要:转载http://flym.iteye.com/blog/723430前缀时间在使用Jackrabbit作非结构化内容的存取,当问到当存取一个word文档时,jackrabbit能不能对word文档里面的内容作全文检索呢。回去查了一下相关的文档,是可以的,而且用的是一个叫Tika的工具。 Tika原先是一个Lucene的子项目,即对内容作元数据抽取用。更多的时候,是对一个平时所用的文档类数据作信息的进一步读取,这些信息是隐藏在文档本身的。这就要求有一个统一的工具来做这些事情,而Tika就提供了一个统一的调用接口来完成这些工作。 Tika通过一个parser和一个contentHandler来进
阅读全文
摘要:Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI,Pdfbox并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。在当前的0.2-SNAPSHOT版本中, Tika提供了对如下文件格式的支持:PDF - 通过PdfboxMS-* - 通过POIHTML - 使用nekohtml将不规范的html整理成为xhtmlOpenOffice 格式 - Tika提供Archive - zip, tar, gzip, bzip等RTF - Tika提供Java class - Cla
阅读全文
摘要:上部分的代码还可以进一步优化,主要是构建Collection<SolrInputDocument>集合,分批次提交,优化新增索引速度其实分页方式也是分批次提交的,不过这种方式 更优雅参考如下代码importjava.io.IOException;importjava.net.MalformedURLException;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Types;importjava.util.ArrayList;i
阅读全文
摘要:我写这系列solr数据导入源码分析主要是解决我们在编程方式导入数据库数据的时候,怎么解决大数据集导入索引的内存溢出问题的如果数据表的数据不大,用常规方法不会产生内存溢出的问题,当数据表数据上千万级的时候,可参考solr自带的数据导入方式我刚开始用编程方式添加solr索引的时候,很容易产生内存溢出问题,所以我就想考究solr自带的数据导入是怎么处理大数据集索引添加的;网上一些参考的方法通常是采取类似数据分页的方式,个人感觉比较拙劣,并且在针对不同数据库的时候,采取类似数据分页方式还要考虑不同数据库分页方式的差异(数据库方言),而且容易出现性能等问题。我的处理方式如下DatabaseResourc
阅读全文
摘要:上文solr dataimport源码主要实现的是数据读取功能下面我们接着看数据连接的实现的源码:privateConnectiongetConnection()throwsException{longcurrTime=System.currentTimeMillis();if(currTime-connLastUsed>CONN_TIME_OUT){synchronized(this){ConnectiontmpConn=factory.call();closeConnection();connLastUsed=System.currentTimeMillis();returnconn
阅读全文
摘要:数据读取类 JdbcDataSource.javaResultSetIterator是JdbcDataSource的内部类,用于从数据库读取数据privateclassResultSetIterator{ResultSetresultSet;Statementstmt=null;List<String>colNames;Iterator<Map<String,Object>>rSetIterator;publicResultSetIterator(Stringquery){try{Connectionc=getConnection();stmt=c.crea
阅读全文
摘要:在solr dataimport 数据导入源码分析(五)提到了contextimpl类调用DataImporter对象获取数据源contextimpl.javaprivateDataSourceds;privateDataImporterdataImporter;@OverridepublicDataSourcegetDataSource(){if(ds!=null)returnds;if(entity==null)returnnull;if(entity.dataSrc==null){entity.dataSrc=dataImporter.getDataSourceInstance(enti
阅读全文
摘要:DocBuilder类的简要代码如下,通过传入context参数到EntityProcessorWrapper类的构造函数,然后执行EntityProcessorWrapper的init()方法初始化数据源;然后调用EntityProcessorWrapper的相关方法获取数据(全部导入或增量导入数据)publicclassDocBuilder{privatevoiddoFullDump(){buildDocument(getVariableResolver(),null,null,root,true,null);}privatevoiddoDelta(){Set<Map<Stri
阅读全文
摘要:我们注意到EntityProcessorWrapper的初始化方法@Overridepublicvoidinit(Contextcontext){delegate.init(context); }这里context是上下文对象,通过context获取数据源,context是抽象类publicabstractclassContext{publicabstractDataSourcegetDataSource();publicabstractDataSourcegetDataSource(Stringname);publicabstractEntityProcessorgetEntityProce
阅读全文
摘要:我们查看DocBuilder类的源码发现,并不是直接持有对SqlEntityProcessor类的引用,而是另外一个包装类EntityProcessorWrapper,EntityProcessorWrapper直接继承自抽象类EntityProcessor,而不是继承自中间的EntityProcessorBase类,简要类图如下包装类额外添加了缓存处理以及格式转换等功能,然后调用SqlEntityProcessor相应方法进行处理,相当于SqlEntityProcessor的代理类,共同继承自抽象类EntityProcessor(SqlEntityProcessor 是通过EntityPro
阅读全文
摘要:在介绍DocBuilder类之前,我们先来解读数据导入对应实体处理器EntityProcessor,默认的实体处理器为SqlEntityProcessorEntityProcessor为抽象类,具体方法由子类实现packageorg.apache.solr.handler.dataimport;importjava.util.Map;publicabstractclassEntityProcessor{publicabstractvoidinit(Contextcontext);publicabstractMap<String,Object>nextRow();publicabst
阅读全文
摘要:上文说由DataImporter类进一步处理,DataImporter类的简要代码如下/************************************************************************Module:DataImporter.java*Author:Administrator*Purpose:DefinestheClassDataImporter***********************************************************************/importjava.util.*;/**@pdOid6bcd
阅读全文
摘要:solr处理请求的接口为SolrRequestHandler.java,由handleRequest方法处理来自http的请求/************************************************************************Module:SolrRequestHandler.java*Author:Administrator*Purpose:DefinestheInterfaceSolrRequestHandler*******************************************************************
阅读全文
摘要:转载http://mabusyao.iteye.com/blog/618750首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本。通过 ThreadLocal.set()将这个新创建的对象的引用保存到各线
阅读全文
摘要:一:Servlet简介Servlet的最广泛用途是建造动态的网页,没有Servlet或相应的动态技术(如CGI,ASP,JSP),一个Web服务器只能提供静态的网页,不能针对用户的请求提供相应的服务器端的操作,如查询数据库并根据查询结果构造一个新的结果网页等.所有的Servlet必须遵循Java Servlet API,这个API是由两个库包及一系列类组成的:javax.servlet:这个库包提供了普通Servlet模型javax.servlet.http:这个库包提供了http和https的Servlet模式普通的Servlet模型只是假定协议是建立在TCP/IP之上的,并没有对请求-回答
阅读全文
摘要:一、下载试用下载apache-solr-3.4.0.ziphttp://lucene.apache.org/solr/解压到本地硬盘,切换到example目录下,这里我们使用solr自带的容器运行部署,执行java -jar start.jar访问:http://localhost:8983/solr/admin/正常说明solr已经成功启动。二、集成mysql1、创建表SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for `documents`-- --------------------
阅读全文
摘要:转载:http://mxsfengg.iteye.com/blog/315330CommonsHttpSolrServer CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。Java代码 Stringurl="http://localhost:8983/solr"; SolrServerserver=newCommonsHttpSolrServer(url); CommonsHttpSolrServer 是线程安全的,建议重复使用CommonsHttpSolrServer 实例。Setting XMLResponseParser
阅读全文
摘要:在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限,下面看例子:package org.thread.demo;class MyThread extends Thread{ private String name; public MyThread(String name) { super(); this.name = name; } public void run(){ fo
阅读全文
摘要:JdbcTemplate针对数据查询提供了多个重载的模板方法,你可以根据需要选用不同的模板方法。 如果你的查询很简单,仅仅是传入相应SQL或者相关参数,然后取得一个单一的结果,那么你可以选择如下一组便利的模板方法:int queryForInt(String sql)int queryForInt(String sql, Object[] args)long queryForLong(String sql)long queryForLong(String sql, Object[] args)Object queryForObject(String sql, Class requiredTyp
阅读全文
摘要:Spring对JDBC的抽象和对Hibernate的集成,都采用了一种理念或者处理方式,那就是模板方法模式与相应的Callback接口相结合。采用模板方法模式是为了以一种统一而集中的方式来处理资源的获取和释放,以JdbcTempalte为例,如下:Java代码publicabstractclassJdbcTemplate{publicfinalObjectexecute(Stringsql){Connectioncon=null;Statementstmt=null;try{con=getConnection();stmt=con.createStatement();ObjectretValu
阅读全文
摘要:概述模板方法模式是GOF设计模式中很典型的设计模式,其意图是由抽象父类控制顶级逻辑,并把基本操作的实现推迟到子类去实现,这是通过继承的手段来达到对象的复用。Spring模板方法模式实际是模板方法模式和回调模式的结合,Spring几乎所有的外接扩展都采用这种模式,如JNDI,JMS,JCA的CCI,JDBC,ORM中的Hiberate3、jdo、Toplink等扩展都采用模板方法模式来扩展。经典的模板方法设计模式开闭原则是指一个软件实体应该对扩展开放,对修改关闭。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。如图所示,面向接口编程,client只需调用Template接口中的exe
阅读全文
摘要:了解另外一种轻量级ORM框架地址:http://www.easyjf.com/easydbo/download.htm SVN::http://svn.easyjf.com/repository/easyjf/easydbo/序言 EasyDBO是一个非常适合中小型软件数据库开发的数据持久层框架,系统参考hibernate、JDO等,结合中小项目软件的开发实际,实现简单的对象-关系数据库映射。本文主要简介EasyDBO的使用方法,作为初学者的快速上手指南。由于EasyDBO是一个不断更新的开源项目,本教程中一些新特性、功能的介绍及应用将不定期的在EasyDBO官方网站上提供。目录:序言一...
阅读全文
摘要:顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。使用场景To keep state with a thread (user-id, transaction-id, logging-id)To cache objects which you need frequentlyThreadLocal类它主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的
阅读全文
摘要:前段时间我们的系统接到新增多一个频道的需求,原本我们的系统只是针对于广州的业务,现在需要新增另一个城市上海,经过和产品人员沟通和分析,城市之间的业务逻辑除了一些小差异基本还是一样的,数据库的结构经过整合两个城市也可以达到一样的结构,但上海需要独立出另一个数据库.我们以前发布器的做法是用作为方法的一个参数由调用者一直传到访问对象(索引或数据库),虽然这种做法一样可以很快的实现,但是将数据库,索引的选择和业务逻辑混搭在一起的设计在感觉上是比较混乱,并且不利于将来多个城市(频道)的建立,所以选了通过ThreadLocal来实现多数据源的动态切换.ThreadLocal 是一个依赖于执行线程的存储器,
阅读全文
摘要:在大型的应用中,为了提高数据库的水平伸缩性,对多个数据库实例进行管理,需要配置多数据源。在Spring框架被广泛运用的今天,可以很简单的运用Spring中的特性配置动态多数据。1. 首先配置一个基于c3p0.ComboPooledDataSource的数据源A,数据源B.daoContext.xml[html]view plaincopy<beanid="dataSourceA"class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close">&
阅读全文
摘要:在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的。我们知道Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。Session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱,你能够想像那些
阅读全文
摘要:概述 我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。 我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。 虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会话的缓存问题,并非数据连接或会话的线程安全问题。 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步。但Spring的DAO模板类并
阅读全文
摘要:一.Spring中的WebAppRootListener这个listner的作用就是监听web.xml中的配置para-name为webAppRootKey的值,比如我的web应用为tsts,那么我配置这样一个1.<context-param>2. <param-name>webAppRootKey</param-name>3. <param-value>tsts.root</param-value>4. </context-param>5.,然后再配置这样一个监听器:1.<listener>2. <li
阅读全文
摘要:在tomcat源代码中,有这样一个实用类:org.apache.catalina.util.StringManager,基本上每个tomcat组件(如:connector, container, realm, loader, logger等)都会用到它。这是一个管理异常消息的helper class。像tomcat这样的Servlet容器,异常消息无论是对系统管理员或者程序员都非常重要。管理员可以通过异常消息,快速定位错误。而对于程序异常,tomcat将异常消息封装到ServletException,来告知程序员Servlet中的错误。Tomcat如何管理这些异常消息呢?第一个要排除的是硬编码
阅读全文
摘要:本文主要结合观察者模式,讲述Tomcat的生命周期管理。Tomcat的生命周期管理机制设计的非常优雅,在Tomcat启动时,只需要启动一个Server组件,就会启动所有的容器及对应的组件,并且触发这些容器的监听者,完成启动过程的设置。可以说是“一键式”启动的。停止过程也是一样。本文首先简单介绍Tomcat中容器,组件及监听类的功能。因为Tomcat的生命周期管理应用了观察者模式,所以接下来会分析观察者模式,最后结合观察者模式及Tomcat源代码,详细说明Tomcat的生命周期管理。一、几种基本的容器,组件及事件监听类(Listener)1.Tomcat中有四种不同的容器:Engine:代表整个
阅读全文
摘要:一、一些概念 事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框。每一种控件有自己可以识别的事件,如窗体的加载、单击、双击等事件,编辑框(文本框)的文本改变事,等等。事件有系统事件和用户事件。系统事件由系统激发,如时间每隔24小时,银行储户的存款日期增加一天。用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。事件驱动控件执行某项功能。触发事件的对象称为事件发送者;接收事件的对象称为事件接收者。事件模型一般用到了观察者模式,下面简单介绍下:SUBJECT目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。Observer(观察者
阅读全文
摘要:Listener Servlet的应用Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。ServletContextListener监听ServletContext。当创建ServletContext
阅读全文
摘要:转载http://isky000.com/database/mysql-performance-tuning-hardware接着上一篇MySQL数据库性能优化之存储引擎选择,这是 MySQL数据库性能优化专题 系列的第六篇文章:MySQL数据库性能优化之硬件优化在过往与很多人的交流过程中发现,在谈到基于硬件来进行数据库性能瓶颈分析的时候,常被大家误解为简单的使用更为强劲的主机或者存储来替换现有的设备。个人觉得这其中可能存在一个非常大的误区。我们在谈论基于硬件进行优化的时候,不能仅仅将数据库使用的硬件划分为主机和存储两部分,而是需要进一步对硬件进行更细的分解,至少也应该分解到如下范畴:主机CP
阅读全文
摘要:接着上一篇MySQL 数据库性能优化之SQL优化,这是MySQL数据库性能优化专题系列的第五篇文章:MySQL数据库性能优化之存储引擎选择离上一篇文章已经有很长时间没有更新这个MySQL数据库性能优化专题了,时间太紧加上人之惰性,今天这里将之前就规划好的关于存储引擎选择方面的内容更新出来,希望对大家有所帮助吧MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系。由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景。MyISAM特性不支持事务:My
阅读全文
摘要:接着上一篇MySQL 数据库性能优化之索引优化,这是MySQL数据库性能优化专题系列的第四篇文章:MySQL 数据库性能优化之SQL优化有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧。注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。降低 CPU 计算除了 IO 瓶颈之外,SQL优化中需要
阅读全文
摘要:接着上一篇MySQL 数据库性能优化之表结构,这是MySQL数据库性能优化专题系列的第三篇文章:MySQL 数据库性能优化之索引优化大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引可以提高数据访问效率。为什么索引能提高数据访问性能?他会不会有“副作用”?是不是索引创建越多,性能就越好?到底该如何设计索引,才能最大限度的发挥其效能?这篇文章主要是带着上面这几个问题来做一个简要的分析,同时排除了业务场景所带来的特殊性,请不要纠结业务场景的影响。索引为什么能提高数据访问性能?很多人只知道索引能够提高数据库的性能,但并不是特别了解其原理,其实我们可以用一个生活中的示例来理解。我们让一位不太
阅读全文
摘要:接着上一篇MySQL 数据库性能优化之缓存参数优化,这是MySQL数据库性能优化专题系列的第二篇文章:MySQL 数据库性能优化之表结构很多人都将数据库设计范式作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求。殊不知,在N年前被奉为“圣经”的数据库设计3范式早就已经不完全适用了。这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会
阅读全文
摘要:在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣的朋友们有所帮助。这是MySQL数据库性能优化专题系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO。本文先从 MySQL
阅读全文
摘要:转载自 http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合。我们通常说的MySql数据库,SQL Server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等。根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有区别又有共同点。 MySql数据库是开放源代码的关系型数据库。目前,它可以提供的功能有:支持SQL语言、子查询、存储过程.
阅读全文