当前位置:  编程技术>综合
本页文章导读:
    ▪REST微服务架构之DropWizard          DropWizard是由Yammer开发团队贡献的一个后台服务开发框架,其集成了Java生态系统中各个问题域中最优秀的组件,帮助开发者快速的打造一个Rest风格的后台服务。     .........
    ▪latch相关视图整理(原创)      V$LATCH V$LATCH视图在选取X$KSLLT记录时,进行了Group By及SUM运算,从而得出了一个汇总信息,保存了自实例启动后各类栓锁的统计信息。常用于当v$session_wait中发现栓锁竞争时鉴别SGA区中问题所.........
    ▪utf-8字符集字符串切断处理            由于utf-8字符集的中文字符串所占用的字节数是不定的,英文可只占一位。而中文占2位或3位。因此不能采用直接取字符串的方式进行切断,如果这样切断的话就可能会.........

[1]REST微服务架构之DropWizard
    来源:    发布时间: 2013-11-10
    DropWizard是由Yammer开发团队贡献的一个后台服务开发框架,其集成了Java生态系统中各个问题域中最优秀的组件,帮助开发者快速的打造一个Rest风格的后台服务。
   
对开发者来说,使用DropWizard有如下好处:
1、和Maven集成良好,也就是说和Gradle集成也很良好;
2、开发迅速,部署简单;
3、代码结构好,可读性高;
4、自动为服务提供OM框架;
5、让开发者自然的把一个应用拆分为一个个的小服务

DropWizard结构的Web服务组成
1、Configuration:用于设置该服务的配置,比方说在服务开放在哪个端口,数据库配置是怎样的等等。
2、Service:该服务的主入口,定义该服务使用哪个配置文件,开放哪些Resource,该服务需要哪些HealthCheck等等。
3、Resource:定义一个资源,包括如何获取该资源,对该资源做Get/Post/Delete/Query时,对应的各种业务逻辑。
4、Representation:定义了一个服务返回值对象,当服务返回该对象时,会自动的把该对象按属性值生成一个Json格式的字符串返回给服务调用者。
5、HealthCheck:在DropWizard为每个服务提供的OM框架中用到,通过它可以随时检测当前服务是否可用。


DropWizard之Hello World
怎样开发一个DropWizard的Web服务呢?首先,在你的项目中引入DropWizard依赖
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile(
            'com.yammer.dropwizard:dropwizard-core:0.6.1'
    )
}


然后,定义Configuration
public class HelloWorldConfiguration extends Configuration {
    @NotEmpty //参数检查
    @JsonProperty //自动映射配置文件
    private String template;

    @NotEmpty
    @JsonProperty
    private String defaultName;

    public String getTemplate() {
        return template;
    }

    public String getDefaultName() {
        return defaultName;
    }
}

再接着,定义服务想要开放的Resource,(DropWizard中大量使用了Annotation,大大简化了代码开发)
@Path("/helloWorld")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {
    private final String template;
    private final String defaultName;
    private final AtomicLong counter;

    public HelloWorldResource(String template, String defaultName) {
        this.template = template;
        this.defaultName = defaultName;
        this.counter = new AtomicLong();
    }

    @GET
    @Timed
    public SayingRepresentation sayHello(@QueryParam("name")Optional<String> name){
        return new SayingRepresentation(counter.incrementAndGet(),String.format(template,name.or(defaultName)));
    }
}

然后,定义该服务返回值的Representation:
public class SayingRepresentation {
    private long id;
    private String content;

    public SayingRepresentation(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

然后,为该服务定义一个HeatlthCheck,这个是可选的,但是,有HealthCheck的web服务让人放心很多:
public class TemplateHealthCheck extends HealthCheck {
    private final String template;

    protected TemplateHealthCheck(String template) {
        super("template");
        this.template = template;
    }

    @Override
    protected Result check() throws Exception {
        final String saying = String.format(template,"TEST");
        if(!saying.contains("TEST")){
            return Result.unhealthy("template doesn't include a name!");
        }
        return Result.healthy();
    }
}

最后,把该服务涉及的配置,资源,HealthCheck统一整合到Service主类中:
public class HelloWorldService extends Service<HelloWorldConfiguration> {

    //服务入口
    public static void main(String[] args) throws Exception {
        new HelloWorldService().run(args);
    }

    @Override
    public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
        //指定配置文件的名字
        bootstrap.setName("helloWorld");
    }

    @Override
    public void run(HelloWorldConfiguration helloWorldConfiguration, Environment environment) throws Exception {
        final String template = helloWorldConfiguration.getTemplate();
        final String defaultName = helloWorldConfiguration.getDefaultName();
        environment.addResource(new HelloWorldResource(template,defaultName));
        environment.addHealthCheck(new TemplateHealthCheck(template));
    }
}


另外配置文件如下:
template: Hello, %s!
defaultName: Stranger

这就是一个完整的REST风格的Web服务代码,另外,DropWizard的部署也非常简单,只需要使用构建脚本把该服务打包,然后使用如下的命令即可运行服务:
 java -jar <jar包> server <config_file>

注意:1、在打包的时候一定要把依赖库也打进去
          2、配置文件的名字一定要和Service类中设置的一样

最后,前面只是关于DropWizard的最基本的应用,DropWizard开发团队还为开发者考虑了很多贴心的功能,比方说,和Hibernate,Liquidbase的集成等等。更多更详细的信息,请移步:http://dropwizard.codahale.com/manual/

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
[2]latch相关视图整理(原创)
    来源:    发布时间: 2013-11-10

V$LATCH

V$LATCH视图在选取X$KSLLT记录时,进行了Group By及SUM运算,从而得出了一个汇总信息,保存了自实例启动后各类栓锁的统计信息。常用于当v$session_wait中发现栓锁竞争时鉴别SGA区中问题所在区域。

v$latch表的每一行包括了对不同类型latch的统计,每一列反映了不同类型的latch请求的活动情况。不同类型的latch请求之间的区别在于,当latch不可立即获得时,请求进程是否继续进行。按此分类,latch请求的类型可分为两类:willing-to-wait和immediate。

Willing-to-wait:是指如果所请求的latch不能立即得到,请求进程将等待一很短的时间后再次发出请求。进程一直重复此过程直到得到latch。 

Immediate:是指如果所请求的latch不能立即得到,请求进程就不再等待,而是继续执行下去。

V$LATCH中的常用列:

NAME:latch名称

IMMEDIATE_GETS:以Immediate模式latch请求数

IMMEDIATE_MISSES:IMMEDIATE_GETS的失败数

GETS:以Willing to wait请求模式latch的请求数

MISSES:GETS that did not obtain the latch on first try,Gets 不成功次数

SPIN_GETS:GETS that got the latch within SPIN_GET tries and did not have to sleep 第一次尝试失败,但在以后的轮次中成功

SLEEP1-SLEEP3: GETS that succeeded only after sleeping one to three times
SLEEP4: GETS that only succeeded after sleeping four or more times

WAIT_TIME: Elapsed time spent waiting for this latch ,花费在等待latch的时间
MISSES_WAITLIST: Number of latch misses on the associated wait list latch
SLEEPS_WAITLIST: Number of sleeps while trying to acquire the associated wait list latch
WAIT_TIME_WAITLIST: Wait time for the associated wait list latch

关于latch的统计信息,主要关注以下几部分

misses/gets的比率是多少

获自spinning的misses的百分比是多少

latch请求了多少次

latch休眠了多少次

latch有40余种,但作为DBA关心的主要应有以下几种: 

Cache buffers chains latch:当用户进程搜索SGA寻找database cache buffers时需要使用此latch。

Cache buffers LRU chain latch:当用户进程要搜索buffer cache中包括所有 dirty blocks的LRU (least recently used) 链时使用该种latch。 

Redo log buffer latch:这种latch控制redo log buffer中每条redo entries的空间分配。 

Row cache objects latch:当用户进程访问缓存的数据字典数值时,将使用Row cache objects latch。

V$LATCH_CHILDREN

V$LATCH_CHILDREN是具体每个子LATCH的统计,V$LATCH是每一种LATCH的统计,前者比后者多了一个CHILD#,相同的LATCH#表示同种LATCH,ADDR是子LATCH的地址。V$LATCH_CHILDREN视图和v$Latch视图的差别与v$sql和v$sqlarea的区别相似并不进行汇总运算,所以也就显示了子Latch的相关信息。所谓子Latch就是library cache在系统中包含了多少个具体的物理数量的library cache,他们的分配原则是这样的。v$latch_children内容的条数一般都是v$latch cpu+1倍,例如:从v$latch查询出有1个library cache latches,系统cpu个数为2,则v$latch_children中library cache latches的子latch个数应该为3。

v$latch_children除了比v$latch多了child#其他列都一样,这里不再赘述。
V$LATCHHOLDER
通过v$latchholder可以查看当前持有latch的会话和进程。由于LATCH的等待时间都很短,该视图多用于查看长时间等待LATCH的SESSION
PID:进程标识,用于和v$process关联
SID: 会话标识,用于和V$SESSION关联
LADDR: Latch address  V$LATCH_CHILDRN   
NAME: Name of the latch being held V$LATCH / V$LATCHNAME / V$LATCH_CHILDRN
GETS:NUMBER Number of times that the latch was obtained in either wait mode or no-wait mode

V$LATCHNAME

显示了v$latch中latch的名称,和v$latch中的信息一一对应

LATCH#:Latch number
NAME:Latch name
HASH:Latch hash

常用SQL
查看持有latch的sql信息和会话信息
SELECT s.sql_hash_value,s.sql_id,s.sid l.name
  FROM V$SESSION s, V$LATCHHOLDER l
WHERE s.sid = l.sid;

根据latch名称显示对latch的统计信息
select c.name,a.addr,a.gets,a.misses,a.sleeps,
a.immediate_gets,a.immediate_misses,b.pid
from v$latch a, v$latchholder b, v$latchname c
where a.addr = b.laddr(+) and a.latch# = c.latch#
and c.name like '&latch_name%' order by a.latch#;

# 查看latch的命中率

SQL>SELECT name, gets, misses, sleeps,
      immediate_gets, immediate_misses
     FROM v$latch
   WHERE name = 'cache buffers chains';

# 如果在Top 5中发现latch free热点块事件时,可以从V$latch_children中查询具体的子Latch信息
SELECT *
  FROM (SELECT   addr, child#, gets, misses, sleeps, immediate_gets igets,
                immediate_misses imiss, spin_gets sgets
            FROM v$latch_children
           WHERE NAME = 'cache buffers chains'
        ORDER BY sleeps DESC)
 WHERE ROWNUM < 11;


参考至:http://www.itpub.net/thread-1574165-1-1.html

             http://blog.163.com/wghbeyond@126/blog/static/351661812010619073376/

             http://grassbell.itpub.net/post/26/1458

             http://www.poluoluo.com/jzxy/201010/95955.html


    
[3]utf-8字符集字符串切断处理
    来源:    发布时间: 2013-11-10
      由于utf-8字符集的中文字符串所占用的字节数是不定的,英文可只占一位。而中文占2位或3位。因此不能采用直接取字符串的方式进行切断,如果这样切断的话就可能会在字符串的尾部开成无效的字符。

     本函数的主要功能就是按指定的长度对utf-8字符集的字符串进行切断,如果字符串的长度大小指定的长度就在尾部加上“...”以表示字符串没有切束。



#对utf-8字符集进行切断处理,返回len个字符,中文和英文字符都当作一个计算。
def sub_utf8 text,len,endss="..."
  t=i=max=0
  slen=text.length
  while t<len
   if text[i]<= 0x7f
    i=i+1
   elsif text[i]<= 0xc0
    i=i+2
   else
    i=i+3
   end
   if(i>=slen)
       max=1
       break
   end
   t=t+1
  end
 
  ret=text[0..i-1]
 
  if max==0
   ret<<endss
  end

  #print " slen:#{slen} get:#{i}================ "
  return ret
end


已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3