数据库同步和使用JSONObject让Java Bean“原地满状态复活”

Posted by & filed under Uncategorized.

csdn博客原文:http://blog.csdn.net/nupt123456789/article/details/17011909 简介 我为什么写这样一个简单的问题呢?首先介绍一下项目背景。最近需要做一个数据库同步的工作,也就是一个Web程序有两个数据库,一个是它自身的本地数据库,另外一个是远程的数据库。当我们对访问web项目,对其本地数据库进行增删改的时候,也要同时对远程数据库进行增删改。我们的思路是:我们首先在Spring的配置文件中,注入两个Dao对象,然后在service层进行增删改的时候,会在BaseDao中先调用本地数据库的dao,然后调用远程的dao。 关键问题: 当本地的数据库增删改成功,而远程数据库增删改失败的时候,我们就需要对其进行异常处理。我们需要将增删改的对象保存起来然后插入到本地的同步表当中,当远程数据库可访问的时候,然后再将本地同步表中的数据取出来,然后生成对应的Object对象,然后使用远程数据库的dao进行增删改,增删改之后再将本地数据库的同步表记录删除。 前提: 1.系统之前已经开发完毕,没有数据库同步功能 2.系统使用ssh框架开发 3.系统的所有增删改都是有service层调用Dao层的Hibernate方法实现的 疑问: 1.同步的时候为什么不在每个service层修改? 对于一个相对庞大的系统,service层有很多类,如果一个service一个service修改,工作了太大,容易改错 2.为什么不在数据库中添加一个字段,标记该条数据是否同步? 系统有几十张数据库表,这样做的话,代码修改了过大 3.如何设计同步表,如何根据同步表的内容对,进行同步? 同步表的设计 create Read more […]

Java工作队列和线程池

Posted by & filed under Uncategorized.

csdn博客:http://blog.csdn.net/nuptboyzhb/article/details/16867685 背景 最近的需要做一个与设备通信的web项目。当然,我们需要写好与设备之间的通信协议(socket)。大致的时序逻辑时:当用户用浏览器点击页面某一控件后,它就向后台发送一个post请求,后台解析前台发送的参数,然后封装成相应的帧格式,然后与设备进行通信,设备接到指令后,完成相应的功能,然后将数据信息返回给后台服务器,后台服务器将这些返回的数据组织好,一方面返回给前台页面,一方面将数据存储到数据库中。 问题: 1.由于通信设备只允许一个socket与它通信,因此,所有的用户都需要共用一个socket,所以,在某一时刻,不能有2个用户同时使用socket 2.当很多条相同的指令以较短的时间间隔(1s左右)发送到通信设备时,通信设备只响应第一条,其他的不予响应。 解决方案 针对上述问题,我们就会想到通过使用队列和线程池来解决以上问题。我们可以将所有用户的指令依次放入队列中,线程池中只允许一个线程运行,而且线程执行完之后,还可以休眠一段时间,等通信设备反应过来的时候,再依次执行队列中的指令。 队列和线程池演示程序 1.WorkQueue.java 该类实现了队列和线程池,详见如下  

2.WorkThread.java    这是我们的工作线程,在这个Demo中,工作线程只做一件事:将number的值加1,然后休眠,最后打印一下当前number的值。由于number是静态变量,因此我们就可以模拟一下,工作队列的一个执行情况。  

3.测试案例1   我们的线程池只允许一个线程同时执行,这样的结果是:打印number的值是从1-10顺序打印  

运行结果是:    

4.测试案例2    线程池中允许同时最多有5个线程一起执行  

运行结果是:    

在某些场合中,如果能够承受100个线程同时运行,那么我们就将workqueue线程池的大小设成100,当线程超过100时,就将线程放入队列queue中,等有一些线程执行结束后,依次执行队列中的线程,一直执行到对列为空时,线程池中的100个线程都在等待新的任务加入。     Read more […]

Java反射那点事(二)动态代理

Posted by & filed under Uncategorized.

代理四要素: 1.被代理对象实现的接口 2.代理逻辑类,须实现InvocationHandler接口,在invoke方法中实现代理的逻辑 3.产生代理对象:Proxy.newProxyInstance(MyInterface.class.getClassLoader(),new Class[] { MyInterface.class }, handler); 4.调用代理对象的方法 代理机制及特点 1.通过实现 InvocationHandler 接口创建自己的调用处理器; 2.通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类; 3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型; 4.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。 应用场合 1.数据库连接和事务管理 2.Unit测试 3.Spring中的AOP 举例: 我临时想到的一个小例子,也不知道是否合适。比如歌手(Singer)是被代理对象,它实现了唱歌(Sing)接口 现在由歌手的经纪人(SingerBrokerHandler)做歌手的代理。在歌手唱歌之前,汇报一下,然后通知歌手要唱什么歌 等歌手唱完了,再汇报一下。在歌手休息前,汇报一下,之后再汇报一下。其中:代理人的汇报,就相当于我们添加的代理逻辑。在Handler的invoke方法中可以根据不同的方法添加不同的代理对象。 1.Sing接口  

2.Singer类    

3.代理逻辑SingerBrokerHandler    

4.测试    

5.运行结果    

    未经允许不得用于商业目的   Read more […]

Java反射那点事(一)

Posted by & filed under Uncategorized.

简介 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 最近在使用JSONArray转化JSON格式的时候,总觉得它使用了Java的反射机制。在Spring中也有一些用到反射的地方,因此,先简单总结一下Java反射基础的一些东西。 代码举例: 说明:新建了一个Person接口,Student类作为测试对象。 1.Person.java  

2.Student.java    

3.测试类    

4.输出结果    

下一步将说说Java设计模式之动态代理   未经允许不得用于商业目的   Read more […]

Java观察者模式举例

Posted by & filed under Uncategorized.

简介 观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。 我一向都是例子驱动学习,一下简单的举一个例子。 例子的逻辑:CCTVNews类作为被观察者通过publicNews方法发布消息。NewsObserver和NewsObserver2类作为其观察者。当CCTVNews类调用publicNews方法时,会自动调用观察者的update方法。调用顺序是:先进后出(栈) 举例 1.CCTVNews.java  

2.NewsObserver.java类    

3.NewsObserver2    

4.测试类    

运行结果:    

Read more […]

在Spring框架下获取Bean的方式总结(转)

Posted by & filed under Uncategorized.

众所周知,Spring框架将DI模式发挥到了极至,因此,系统里面用Spring管理的Bean相互之间的获取是非常方便的,只要使用者提供一个setter方法并在配置文件中配置该属性就可以。   但是,对于系统中非Spring框架管理的类,如果需要获取Spring管理的类,或者,程序中需要动态的根据Bean的id来获取Bean实例,不可能事先为该类提供所有需要的Bean属性的setter方法,在类似这样的情况下,获取Spring框架管理的类实例的方法有多种,现在简单总结如下: 方法一: 在初始化时保存ApplicationContext对象 ApplicationContext ac = new FileSystemXmlApplicationContext(“applicationContext.xml”); ac.getBean(“beanId”); 说明: 这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。   方法二: 通过Spring提供的工具类获取ApplicationContext对象 import Read more […]

Top-N算法的实现(Java版)

Posted by & filed under Uncategorized.

简介 在搜索引擎中,如Lucene,搜索的结果是最相似 的前N条,那么如何从一个无序的数组中得到前N个最大(或最小)的值呢?以下是我写的一个Top-N的演示程序。主要用到的数据结构是TreeSet,TreeSet会自动化实现插入排序,前提是该类要实现Comparable接口。 实体类  

Demo  

  实验结果   由于初始化数据是随机产生的数字,所以每次运行的结果有所不同。

Jquery ComboTree树的绑定-数据源JSON格式-操作

Posted by & filed under Uncategorized.

CSDN博客原文:http://blog.csdn.net/nuptboyzhb/article/details/12623957 CSDN完整源代码下载:http://download.csdn.net/detail/nuptboyzhb/6398741 前言 ComboTree也是表单中一种常见组件,如:有些输入框,限定只能选取一些特征的数据,而且这些数据时需要动态从数据库中读取的。我这里就演示一下这个过程(数据库就不涉及了,后台能产生Combotree所需的Json格式数据就行了)。以下是我写的一个Demo。前台的操作有:1.绑定树的url,设置是否多选 2.获取用户所选的值 3.设置特定的值 4.Disable和Enable 1.页面(index.jsp)

  2.ComboTree的数据源类    

3.Action类    

4.struts2的配置  

  5.效果   1.点击组件,树的加载效果 2.获取组件的值 3.设定值,Disable和Enable功能亦可 项目完整源代码:http://download.csdn.net/detail/nuptboyzhb/6398741 未经允许不得用户商业目的     Read more […]

Jquery DataGrid演示程序 分页 java

Posted by & filed under Uncategorized.

完整源代码:http://download.csdn.net/detail/nuptboyzhb/6385325 csdn博客:http://blog.csdn.net/nuptboyzhb/article/details/12623957 前言 最近的项目一直用到DataGrid组件,于是就抽时间整理一下思路。DataGrid主要是设置url和分页,通过在前台DataGrid的属性中添加pagination:true属性,就会在表格末尾显示分页工具栏。后台添加一个int page和int rows保存第几页和每页的数量即可。当然,url返回的是JSON格式的数据。一下是我写的一个Demo 页面(index.jsp)  

Struts2的配置文件   struts.xml文件的内容:  

后台实体类Student(注意:成员变量的名称要与前台feild的值相对应)    

    后台实体类DataGrid(目的:拼成DataGrid所需JSON格式)  

    后台Action类(page Read more […]

Jquery zTree演示程序Demo总结

Posted by & filed under Uncategorized.

csdn博客地址:http://blog.csdn.net/nuptboyzhb/article/details/12224731 源代码下载:http://download.csdn.net/detail/nuptboyzhb/6347025 前言: 最近的项目需要用到zTree树,于是想将zTree树总结一下。前段时间一直没有时间总结,趁国庆还有这么点时间,总结一下。zTree树控件是基于Jquery的,官方提供了很好的API文档和Demo 用户可以从如下地址下载:http://www.ztree.me/hunter/zTree.html 1.帮助文档和API zTree的帮助文档和API都是非常全面的,只是有些Demo的后台是用PHP写的,因此,如果想看更加全面的Demo的话,最好将帮组文档发布到本地的Apache服务器上。 2.用一个Demo来演示Jquery zTree的功能 要点: 2.1 zTree树的数据源为JSON格式 2.2 Read more […]