Jun21

【原创】在Spring3中加入veloctiy模板引擎的注意事项

Author: leeon  Click: 5561   Comments: 0 Category: java  Tag: java,spring3,velocity

今天在spring3项目中学习配置velocity时遇到一个很奇怪的问题,通常eclipse的ide在编写xml中都能通过智能提示来提示一个bean类的属性,但是不管我怎么按照网上的说法这样写:

 

智能提示给与的提示只有两个属性:velocityEngine 和servletContext ,进入到org.springframework.web.servlet.view.velocity.VelocityConfigurer 这个类的源码查看,发现其是继承于父类VelocityEngineFactory,然后用eclipse跳转到的方式试图进入VelocityEngineFactory 父类查看,发现无法跳过去,这下问题就清楚了,依赖的spring3包不完整,搜索发现stackoveflow上有人回答了类似问题:http://stackoverflow.com/questions/19752563/using-apache-velocity-with-spring-framework-3-2-4

果断在maven中加入了spring-context-support的依赖配置即可:

org.springframework

spring-context-support

3.2.4.RELEASE


May22

【原创】PHP扩展模块memcached长连接使用方法介绍

Author: leeon  Click: 9992   Comments: 1 Category: php  Tag: php,memcached

      网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接。以至于后来很多年我都认为memcached是不支持长连接的,其实不然,memcached扩展模块从很早的版本开始就已经支持长连接了。从扩展模块的源码注视中我们就能看到:

/* {{{ Memcached::__construct([string persistent_id[, callback on_new[, string connection_str]]]))

   Creates a Memcached object, optionally using persistent memcache connection */

static PHP_METHOD(Memcached, __construct)

{

从php的手册身上我们可以看到memcached的扩展模块提供的构造函数提供一个参数persistent_id可选项,手册中这样介绍:

      默认情况下,Memcached实例在请求结束后会被销毁。但可以在创建时通过persistent_id为每个实例指定唯一的ID, 在请求间共享实例。所有通过相同的persistent_id值创建的实例共享同一个连接。 

这个参数的含义就是说如果你传递了一个命名id给到构造方法,那么就会建立长连接,通常我们使用的都是PHP-FPM模式,这样PHP-FPM进程就会和memcached服务简历一条长连接通道。我们也可以理解为persistent_id就是一个连接池名字,所有php-fpm进程都是这个连接池中的一员。

     但我们需要注意的是php是解释性语言,当php第一次通过memached模块建立起长连接后,切记后续的php执行就不要再通过memcached的构造函数构建相同persistent_id命名的长连接,可以建立不同persistent_id名字的长连接,如果是相同的名字被php重复执行,一定会导致php-fpm的进程异常导致与memcached的通信越来越慢,同时根据libmemcached的版本不同还会导致php产生coredump。

    那么我们如何避免单个php-fpm在建立完以persistent_id命名的长连接后不再重复建立长连接呢?其实在PHP带有评注的手册上是有讲解的,内容如下:

When using persistent connections, it is important to not re-add servers.

This is what you do not want to do:
[code="php"]
$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
$mc->addServers(array(
array('mc1.example.com',11211),
array('mc2.example.com',11211),
));
[/code]
Every time the page is loaded those servers will be appended to the list resulting in many simultaneous open connections to the same server. The addServer/addServers functions to not check for existing references to the specified servers.

A better approach is something like: [code="php"]
$mc = new Memcached('mc');
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
if (!count($mc->getServerList())) {
$mc->addServers(array(
array('mc1.example.com',11211),
array('mc2.example.com',11211),
));
}
[/code]

通过使用getServerList()方法来检查当前执行使用的php-fpm进程容器中是否已经存在相同名字的长连接资源,如果存在就不要重复使用addServers() 方法来新增长连接配置。

May14

【原创】ActiveMQ连接池在Spring配置中的注意事项

Author: leeon  Click: 7528   Comments: 0 Category: java  Tag: spring3,activemq,pool

今天在spring3中集成配置activemq时发现使用PooledConnectionFactory来编写bean怎么都无法启动,提示创建bean失败(org.springframework.beans.factory.BeanCreationExcept)

我所使用的版本是activemq-pool 5.8版,发现老外也有遇到同样的问题,说有可能是common-dbcp引用的版本不对造成的。

http://techempowers.wordpress.com/2013/09/24/activemq-beancreationexception-pooledconnectionfactory-malformedparameterizedtypeexception/

https://issues.apache.org/jira/browse/AMQ-4189

查看我的工程中没有引用到common-dbcp的包,反而common-pool的包有两个,一个1.5.5版本一个1.6版本,于是将1.5.5版本的jar引用在工程中去掉然后再测试发现bean可以创建成功了。跟踪common-pool的依赖关系发现是jedis的jar包关联有用导致不同的api包引用了不同版本的common-pool包所致,然而active-pool的包必须依赖1.6版本的才能启动。


总结: 只要按照规则编写好bean配置,一定要先检查依赖的包是否符合版本要求,同时检查是否有同一个模块包不同版本的引用

May7

【原创】Mybatis插件推荐-mybatipse

Author: leeon  Click: 12763   Comments: 0 Category: java  Tag: mybatipse,eclipse,mybatis

在eclipse下使用mybatis时,编写sql的xml没有智能提示还是一件很麻烦的事情,同时在dao层的方法要去映射到xml中的id名,跳转也是一件操作繁琐的事情,最近在eclipse官网发现了一个比较还用的mybatis插件,可以解决我们在使用mybatis时不方便的问题。

插件地址:http://marketplace.eclipse.org/content/mybatipse

XML Editor Enhancements

Auto-completion

  • Mapper namespace : Calculated from the path.
    autocomplete namespaceautocomplete namespace
  • Java class/Type alias : Propose Java classes and Type Aliases (translucent icons). Camelcase match is supported. [1] [2]
    autocomplete classautocomplete class
  • Java property : Propose properties of the parent java class. Nested properties are supported.
    autocomplete propertyautocomplete property
  • Statement ID : If corresponding mapper interface exists, propose the method name as a statement ID.
    autocomplete statement id
  • Reference to resultMap/select/sql : Propose ID of the referenced resultMap/select/sql. External reference is supported (blue icons).
    autocomplete reference
  • Parameter properties : #{} and ${} in select/insert/udpate/delte statements. Also works in some attributes.
    autocomplete propertiesautocomplete properties 2
  • javaType, jdbcType, typeHandler in #{}
    autocomplete jdbcType
  • Result elements in resultMap/collection/association : Generates elements for the parent java class properties.
    autocomplete results 1autocomplete results 2

  • [1] For better performance, classes in the application libraries (loaded as JARs) are listed only when at least one package segment is specified.

  • [2] There is a limitation for the type alias support. Basically, if type aliases are registered using Java API, they are not automatically detected. As a workaround, you can register type aliases in MyBatipse's preference. See the Configuration section.

Hyperlinks

  • To referenced resultMap/select/sql element. External reference is supported.
  • To mapper interface method.

Validation

  • Missing TypeAlias, Java class/property.
  • Missing resultMap/select/sql ID.
  • etc.
    refid errorproblem view

Java Editor Enhancements

Auto-completion

  • Parameter properties : #{} and ${} in select/insert/udpate/delte annotations. autocomplete properties in java
  • javaType, jdbcType, typeHandler in #{} : See the XML example.
  • Reference to resultMap in @ResultMap
    autocomplete resultmap annotation

Quick Assist

  • Add @Param to method parameters : Put the cursor on the method name and press cmd + 1 (or ctrl + 1).
    param-annotation1
    param-annotation2

Configuration

MyBatis Nature

  • By default, each file is validated when it's saved, but you would want to validate the XML mapper when the related Java classes are updated as well. For that purpose, MyBatipse provides a custom nature MyBatis Nature.
    To add the nature, right click the project in the package explorer and choose Configure -> Add MyBatis Nature from the menu.
    nature

Type Alias

  • Type alias are automatically detected if they are registered using XML config file (both mybatis and mybatis-spring config is supported).
    If you register type aliases in Java code, MyBatipse cannot detect them. As a workaround, you can register custom type aliases in the project setting (Open Project -> Properties menu and select MyBatipse from the left column).
    type aliases
    For example, with the above settings:
    • The first entry registers all the classes in com.example.domain package as type aliases.
    • The second entry registers the single class domain.Person.
    • The third entry registers the single class domain.SomeLongNamedBean under the alias SomeBean.
    • Note that, in any case, MyBatipse respects @Alias annotation if it exists.

Tips

  • To move MyBatis proposals to the top of the XML proposal list, quit Eclipse and open the following file in the workspace: .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.xml.ui.prefs Find the line started with xml_content_assist_default_page_sort_order= and insertnet.harawata.mybatis.proposalCategory.xml\u0000 right after the equal sign.
    xml proposal order

分类

标签

归档

最新评论

Abyss在00:04:28评论了
Linux中ramdisk,tmpfs,ramfs的介绍与性能测试
shallwe99在10:21:17评论了
【原创】如何在微信小程序开发中正确的使用vant ui组件
默一在09:04:53评论了
Berkeley DB 由浅入深【转自架构师杨建】
Memory在14:09:22评论了
【原创】最佳PHP框架选择(phalcon,yaf,laravel,thinkphp,yii)
leo在17:57:04评论了
shell中使用while循环ssh的注意事项

我看过的书

链接

其他

访问本站种子 本站平均热度:8823 c° 本站链接数:1 个 本站标签数:464 个 本站被评论次数:94 次