Java堂  


MySQL中更新与子查询条件中同一个表中的字段数据

Filed under: Database — Jet @ 4:29 下午
Tags:
原文出处: MySQL中更新与子查询条件中同一个表中的字段数据
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在MySQL中使用update语句的时候,Where条件或者值都可以使用子查询,比如:

  1. UPDATE table_a SET name=(SELECT name FROM table_b WHERE id=1) 
  2. WHERE id IN (SELECT id FROM table_c WHERE age > 24);

但是如果子查询和更新的表是同一个表的话,MySQL会报如下的错误:

Error Code : 1093
You can’t specify target table ‘table_a’ for update in FROM clause

这种情况下就需要使用MySQL的临时表做一个中转,代码如下:

  1. -- 将查询的结果写入到临时表中
  2. CREATE TEMPORARY TABLE tmp_table (SELECT * FROM table_a WHERE NAME='Tom');
  3. UPDATE table_a SET parentId=(SELECT id FROM tmp_table WHERE NAME='Tom') WHERE id = 100;
  4. -- 删除临时表
  5. DROP TABLE tmp_table;

参考资料:
语法:MySQL中INSERT INTO SELECT的使用
MySQL中的临时表使用方法
关于mysql的 SELECT … INTO 语法
MySQL select into 和 SQL select into

Ext中设置Ajax超时时间

Filed under: DynamicLanguage — Jet @ 8:18 下午
原文出处: Ext中设置Ajax超时时间
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Ext中无论是在Grid、Combox中使用Store加载数据,还是直接使用Ajax发送请求,其超时时间均可以统一使用如下代码进行设置:

  1. // 超时时间,单位毫秒
  2. Ext.Ajax.timeout = 5 * 60 * 1000;

注意,单位是毫秒。

不过以前不知道是因为在哪里搜索的结果,还是Ext 2.x版本中的问题,使用了Ext.lib.Ajax.timeout = 5 * 60 * 1000;的方式进行设置,但是这种方式是无效的。

Ext的版本是3.2.1.

Apache+Resin发布程序时一直出现403错误的解决办法

Filed under: Web&Server — Jet @ 11:28 下午
原文出处: Apache+Resin发布程序时一直出现403错误的解决办法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

今天在Linux下面把Apach和Resin整合之后,程序发布的时候总是出现403错误。首先检查了一下Apache和Resin的配置文件,新建一个webapp显示解析成功,这样证明二者整合是正确的;另外还有一个现象,就是同样的程序在Windows下也是使用Apache和Resin进行整合的,但是运行正常,这样就排除了程序自身的问题。

因为页面总是显示403错误,又想到Windows和Linux下面最大的区别就是对文件权限的设置,于是使用 ls -l 命令查看了目录的权限,果然发现目录的权限只是 drwx——,应该设置为 drwxr-xr-x,于是使用

  1. chmod -R 755 directory

其中-R参数用于使设定的权限用于该目录及子目录下所有文件和目录。

另外再复习一下权限的基础知识:

“rwx”表示 4(r)+2(w)+1(x)=7
“rw-”表示 {4(r)+2(w)+0(-)=6

参考资料:
linux修改文件夹-文件目录权限

解决Google浏览器自动更新后一直提示重启浏览器的问题

Filed under: Tools — Jet @ 4:30 下午
Tags:
原文出处: 解决Google浏览器自动更新后一直提示重启浏览器的问题
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Google浏览器中的“关于”窗口中可以自动更新浏览器,但是有时候使用自动更新完成后,会提示:

Restart google chrome to finish updating

点击“Restart Now”按钮之后再打开“关于”对话框之后还是有上面的提示,反反复复总是这样,更新失败,但是也没有办法再更新。后来Google找到了解决的方法:

首先打开Google浏览器,然后进入浏览器的安装目录(可以右键快捷方式,选择属性,然后再点击“查找目标”按钮),接下来将chrome.exe修改一个其他的名称,比如chrome-old.exe,最后关掉浏览器再打开,就不会有上面的问题了。

参考资料:
Issue 58256: Dev cannot update

Apache2.x中设置gzip

Filed under: Web&Server — Jet @ 1:28 下午
Tags: ,
原文出处: Apache2.x中设置gzip
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Apache2.x中使用mod_deflate进行gzip压缩,配置信息如下:

  1. LoadModule deflate_module modules/mod_deflate.so
  2. LoadModule headers_module modules/mod_headers.so
  3.  
  4. # gzip 设置
  5. # Only compress specified content type
  6. # see also http://www.devside.net/guides/config/compression
  7. <IfModule mod_deflate.c>
  8.     # The value must between 1 (less compression) and 9 (more compression)
  9.     DeflateCompressionLevel 7
  10.     # compress content with type html, text, and css
  11.     AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/json
  12.     # place filter 'DEFLATE' on all outgoing content
  13.     SetOutputFilter DEFLATE
  14.     # Properly handle old browsers that do not support compression
  15.     BrowserMatch ^Mozilla/4 gzip-only-text/html
  16.     BrowserMatch ^Mozilla/4\.0[678] no-gzip
  17.     BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  18. </IfModule>

参考资料:
apache 2.2.15中配置mod_deflate
httpd.conf — compression

JRebel运行缓慢或提示内存不足的解决方法

Filed under: JavaPlateform — Jet @ 5:33 下午
Tags:
原文出处: JRebel运行缓慢或提示内存不足的解决方法
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!


JRebel是一个Java类热启动的工具,使Java开发(特别是Web开发)可以实现像PHP开发那样即时刷新的效果,这样再也不用修改java文件之后频繁的去重启Web Server了,用起来非常的顺手。

最近JRebel好像更新也非常频繁,8月份刚发布3.0版本,11月份就发布了3.5版本,而且这个新版本用下来非常给力,针对了spring增加了许多扩展(默认是打开的),比如可以实时更新所有Spring的配置文件等等,手痒痒的同学可以下载下来试试。BTW,我用的是正式版,:)

安装的方法也非常简单,就在vm后面增加一个-noverify 参数:

  1. -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar

当然还是记得将上面的路径修改成你自己本机JRebl的存放路径。

上面的都不是本文的重点,这里需要说一下的就是,或许3.5版本增加的功能特性太多的缘故(特别是针对Spring),刚开始启动的时候速度非常的慢,开始的时候我怀疑是spring插件的问题,于是使用 -Djrebel.spring_plugin=false将spring插件关闭了,之后启动的速度可以接受了,但是运行程序的时候速度非常非常的慢,点一个按钮要等半天。如果不使用JRebel的话程序运行正常,所以排除了程序本身的问题。

刚开始一直在怀疑是不是新版本的问题,因为用2.x和3.0的时候都很正常,所以在这方面查了很多资料,都没有发现好的解决办法。后来,无意中发现程序出现了“java.lang.OutOfMemoryError: PermGen space”的错误,突然才想到是否是给JRebel分配的内存太小了,于是使用下面的参数增加了内存:

  1. -noverify -javaagent:E:\UsualTools\JRebel\jrebel.jar -Xmx512M -Xms512M -XX:MaxPermSize=1024m

然后在运行的时候发现速度是非一般的快啊,使用JRebel的spring插件之后启动速度也非常的块了,看来就是这个问题,后来在JRebel官方上的Q&A上面也得到了印证。

需要说明一点的是,如果上面的参数无法启动,需要将内存数设置小一些;还有,增加Eclipse的内存对JRebl是没有任何效果的,虽然现在想起来和可笑,但是当时在这个方面也浪费了不少时间。BTW,Eclipse3.3+内置了一个内存查看的工具,可以在“Windows”-”Preferences”中,选择左边的”General”,然后选择右边的”Show heap status”。

参考资料:
I’m getting Java.lang.OutOfMemoryError: PermGen space!??
Javarebel启动程序java.lang.OutOfMemoryError: PermGen space问题的解决

Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题

Filed under: OS — Jet @ 12:16 下午
Tags: ,
原文出处: Ubuntu下面安装Macbuntu及安装之后需要修改的几个问题
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Macbuntu是一个可以将Ubuntu修改为Mac风格的集合包,使用shell指令进行安装,其模拟到效果非常逼真和实用,效果图如上,官方网站为:http://sourceforge.net/projects/macbuntu/

首先介绍一下安装步骤:
1. 在Macbuntu官方网站http://sourceforge.net/projects/macbuntu/上下载最新到集成包文件,目前到版本为10.10,即支持Ubuntu10.10版本,下载下来到文件为Macbuntu-10.10.tar.gz。
2. 定位到上述文件到目录,然后输入下面命令进行安装:

  1. tar zxvf Macbuntu-10.10.tar.gz
  2. sudo ./Macbuntu-10.10/install.sh

接下来就按照提示进行选择安装即可,全程都是自动的,安装完成之后需要重启。

上面是安装到步骤,下面再说几个安装之后遇到问题到程序:
OpenOffice

安装Macbuntu之后发现OpenOffice打开之后,菜单和对话框中到文字都不能正常显示,如下图所示

解决的方法是:在“系统”-“首选项”-“外观”,选择“字体”标签,然后将“应用程序字体”设置为“文泉驿等宽微米黑“。

Eclipse
因为Mac中是将每个应用程序到菜单都集成到最上面到菜单栏中到,但是对于有些应用程序来说,Macbuntu没有很好的进行处理,其中Eclipse就是一个例子。这个时候打开Eclipse之后发现菜单项不见来,而最上面到菜单栏中只有一个File-Exit项。解决的方式就是创建一个shell脚本,命名为eclipse.sh,内容如下:

  1. #!/bin/bash
  2. export UBUNTU_MENUPROXY=0
  3. PATH=/usr/lib/java/jdk1.6.0_22/bin:/usr/lib/java/jdk1.6.0_22/jre/bin
  4. ~/Development/eclipse-java-helios-SR1-linux-gtk/eclipse/eclipse

记住将中间到java和eclipse路径修改为你自己到路径,然后再执行下面到命令:

  1. chmod u+x eclipse.sh
  2. sudo ./eclipse.sh

这个时候你会发现Eclipse到菜单栏又出现了,你可以将这个eclipse.sh文件放在桌面上,然后直接双击选择“运行”即可。

参考资料:
Macbuntu:把 Ubuntu 一键打造成完整的 Mac 风格
求教:openoffice菜单不能显示汉字
Eclipse menubar not appearing in Ubuntu 10.10

Spring MVC中修改校验的异常信息

Filed under: JavaPlateform — Jet @ 4:58 下午
Tags:
原文出处: Spring MVC中修改校验的异常信息
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

使用一个例子来说明一下,Spring使用的是3.0.x:

  1. public class Account {
  2.     @Pattern(regexp = "[a-z0-9]{3,50}")
  3.     private String name;
  4.  
  5.     @NotNull
  6.     @NumberFormat(style=Style.CURRENCY)
  7.     private BigDecimal balance = new BigDecimal("1000");
  8.  
  9.     @DateTimeFormat(style="S-")
  10.     @Future
  11.     private Date renewalDate = new Date(new Date().getTime() + 31536000000L);
  12.  
  13.     // 省略 getter & setter...
  14. }

接下来使用注解创建一个Controller:

  1. @Controller
  2. @RequestMapping(value="/account")
  3. public class AccountController {
  4.  
  5.     /**
  6.      * 如果view采用JSP的话<code>@ModelAttribute</code>注解可以省略,但是如果是使用Velocity或FreeMarker
  7.      * 的话必须要加上,而且<code>@Valid</code>注解和后面的BindingResult类型的参数之间不能有其他参数。
  8.      */
  9.     @RequestMapping(method=RequestMethod.POST)
  10.     public String create(@Valid @ModelAttribute("account") Account account, BindingResult result) {
  11.         if (result.hasErrors()) {
  12.             return "account/createForm";
  13.         }
  14.         // ...
  15.         return "redirect:/account/" + account.getId();
  16.     }
  17.  
  18. }

另外还有一个view文件、配置文件等等,具体的可以查看Spring MVC Basic Sample

OK,接下来说重点。我参考上面的Spring MVC Basic Sample中的做法也做了一个类似的表单,在表单中的balance中输入非数字的时候旁边的错误信息会出现下面的异常信息:

Failed to convert property value of type java.lang.String to required type java.math.BigDecimal for property balance; nested exception is org.springframework.core.convert.ConversionFailedException: Unable to convert value “eff” from type java.lang.String to type java.math.BigDecimal; nested exception is java.lang.IllegalArgumentException: Unable to parse eff

这个就很郁闷了,明显是格式转换出错,但是列出来一堆的异常信息,对用户来说非常不友好。于是开始在Google中搜索也没有找到比较好的说法,后来运行了Spring MVC Basic Sample,不显示上面的异常信息,而只是显示一句话:”could not be parsed“,这个效果正是我们所期待的。于是我将例子中的所有spring配置文件、Bean信息、Controller都做了对比,甚至JSP模板都一样,但是一到我自己的项目中就会出现那个异常,当时非常郁闷。

后来无意中在Google中查到到了参考资料中的一篇帖子,里面提到只要在messages.properties文件中设置typeMismatch属性就可以了,于是我猛然想到Spring MVC Basic Sample中也有个messages.properties文件,打开之后赫然看到果然有一条typeMismatch属性:

  1. typeMismatch=could not be parsed

原来是在这里设置的,真的很郁闷。还好,参考资料中的帖子中还提到可以设置具体的类型,比如可以这样设置:

  1. ## 全局的配置信息
  2. typeMismatch=输入的数据格式不正确
  3. ## 针对BigDecimal类型的错误信息
  4. typeMismatch.java.math.BigDecimal=请输入数字
  5. ## 针对Date类型的错误信息
  6. typeMismatch.java.util.Date=请在{0}中输入正确的日期

参考资料:
Spring MVC Data Binding and user-friendly error messages

Resin中对日志输出的配置

Filed under: JavaPlateform,Web&Server — Jet @ 2:17 下午
Tags:
原文出处: Resin中对日志输出的配置
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Resin中对日志的设置主要有如下参数:log、logger、access-log、stdout-log和stderr-log。前两个放在<resin>标签,也就是主标签下面,其中log主要用于配置JDK logging API,logger用于指定需要log的包及level,跟log4j中的用法相似,只不过resin中level有个特殊的选项就是off,用于关闭日志输出;而后面三个*-log放在<host>或<host-default>下面,access用于HTTP输出,stdout用于标准输出(System.out),stderr用于错误输出(System.err,对应log4j中的log.error)。

三个*-log中间的属性是相同的,所以我们集中来说明一下:

  • path: 用于设定日志文件的路径,非常有意思的是它支持所谓的El Variables and Functions,也就是resin中的变量,比如${host.name}就是虚拟站点的id名称,所以如果将它放在<host-default>下面的话,将path设置为 logs/${host.name}/access.log的话可以将不同站点的日志存放在不同的目录下面。
  • archive-format: 这个参数可以设置日志归档的格式,如设置为access-%Y%m%d.log可以在归档的时候自动按日期进行归档命名。另外还有一个特性需要说明的是,resin竟然支持自动压缩log文件,而且设置的方法非常简单,只要后缀名是gz就可以了,如access-%Y%m%d.log.gz,这样归档的时候会自动压缩,而且支持windows和linux系统。
  • format: 用于设置每条日志输出的格式,这个非常简单,而且通常使用系统内置的格式就可以了。
  • rollover-size: 用来设置归档日志文件的最小尺寸,单位可以设置成kb、mb等等,默认为1mb。
  • rollover-period: 用来设置归档日志文件的周期,单位可以是1D(一天)、1W(一周)、1M(一个月)等。
  • 最后给出一个范例供大家参考:

    1. <!--
    2.    - Resin 3.1 configuration file.
    3.   -->
    4. <resin xmlns="http://caucho.com/ns/resin"
    5.        xmlns:resin="http://caucho.com/ns/resin/core">
    6.   <!--
    7.      - Logging configuration for the JDK logging API.
    8.     -->
    9.   <log name="" level="off" path="stdout:"
    10.        timestamp="[%H:%M:%S.%s] {%{thread}} "/>
    11.  
    12.   <!--
    13.      - 'info' for production
    14.      - 'fine' or 'finer' for development and troubleshooting
    15.     -->
    16.   <logger name="com.caucho" level="info"/>
    17.  
    18.   <logger name="com.caucho.java" level="config"/>
    19.   <logger name="com.caucho.loader" level="config"/>
    20.  
    21.     <host-default>
    22.       <!--
    23.          - With another web server, like Apache, this can be commented out
    24.          - because the web server will log this information.
    25.         -->
    26.       <access-log path="logs/${host.name}/access.log" 
    27.             archive-format="access-%Y%m%d.log.gz"
    28.             format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
    29.             rollover-size="10mb"
    30.             rollover-period="1D"/>
    31.       <!--
    32.          - stdout log and stderr log
    33.         -->
    34.       <stdout-log path="logs/${host.name}/stdout.log" 
    35.             archive-format="stdout-%Y%m%d.log.gz"
    36.             timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
    37.             rollover-size="10mb"
    38.             rollover-period="1D"/>
    39.       <stderr-log path="logs/${host.name}/stderr.log" 
    40.             archive-format="stderr-%Y%m%d.log.gz"
    41.             timestamp="[%Y.%m.%d %H:%M:%S.%s]" 
    42.             rollover-size="10mb"
    43.             rollover-period="1D"/>
    44.     </host-default>
    45. </resin>

    最后还有一个事情需要说明一下,如果在windows系统下将resin注册成服务程序之后就会在log目录下产生jvm-defautl.log文件,而且这个文件会一直累加,所以会变的文件非常大而影响resin的性能。原来在Apache和Resin产生大容量日志的解决办法这篇文件中提到的使用httpd -jvm-log NUL的方法在3.1中无法使用,而且查找了大量的文档也没有找到合适的方法,后来索性将log目录中的写入权限去掉了,重启resin也没有任何影响,算是解决了这个问题。

    参考资料:

    http://caucho.com/resin-3.1/doc/config-log.xtp

    http://caucho.com/resin-3.1/doc/el-var.xtp#host

    Apache和Resin组合时间歇性出现503错误的解决方法

    Filed under: JavaPlateform,Web&Server — Jet @ 5:12 下午
    Tags: ,
    原文出处: Apache和Resin组合时间歇性出现503错误的解决方法
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    使用Apache和Resin进行组合时,如果Resin关闭或中断的时会出现如下的HTTP 503错误:

    Service Temporarily Unavailable
    The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

    造成这个错误的原因是因为Resin无法启动,可以单独访问resin(如8080端口)查看具体的错误。

    我这里要说的是,在Resin和Apache都非常非常正常的情况下,间歇性的出现上述错误,也就是说不是一直有,而是偶尔出现这个错误,刷新下页面就好了。这个问题非常郁闷,后来在resin的bug报告中(见参考资料)竟然发现了解决的办法:

    The important configuration are load-balance-socket-timeout, socket-timeout, load-balance-idle-time and keepalive-timeout. The two load-balance-* configure mod_caucho. socket-timeout and keepalive-timeout configure the Resin side.

    load-balance-socket-timeout needs to be large enough to handle any server-side processing delays before the first data.

    socket-timeout and keepalive-timeout need to be larger than load-balance-idle-time because they need to keep the connection open for a keepalive request.

    For a diagram, see

    http://caucho.com/resin/admin/load-balancing.xtp

    也就是说,Resin在同Apache进行组合通讯的时候主要依靠四个参数:load-balance-socket-timeout, socket-timeout, load-balance-idle-time 和 keepalive-timeout,其中两个load-balance-*参数用来设置mod_caucho(就是与Apache组合的so文件),socket-timeout和keepalive-timeout用来设置Resin。至于参数数值的大小顺序依此是:load-balance-socket-timeout > socket-timeout 和 keepalive-timeout > load-balance-idle-time。上述四个参数的官方说明地址为:http://caucho.com/resin-3.1/doc/server-tags.xtp

    那为什么会间歇性出现503错误呢?这个是因为resin默认的socket-timeout为65s,时间太短了,有些比较大的请求在这个时间之内还没有进行完。综合上面所说,参考的配置如下:

    1. <resin ...>
    2.     <cluster id="app-tier">
    3.         <server-default>
    4.             <socket-timeout>180s</socket-timeout>
    5.             <keepalive-max>3000</keepalive-max>
    6.             <keepalive-timeout>180s</keepalive-timeout>
    7.             <load-balance-idle-time>120s</load-balance-idle-time>
    8.         </server-default>
    9.     </cluster>
    10. </resin>

    从此,这个世界清净了。

    参考资料:
    Apache 2.2.x + Resin 3.1.x: frequent 503 status error messages (Service Temporarily Unavailable)
    0002862: Apache + Resin and 503 HTTP Error
    resin apache问题

    下一页 »