Java

Java的方方面面

YourKit Java Profiler

前天正好要用到profiler,看到yourkit有新版,以前网上有流传它的破解版,而且还是SHOCK做的,我一向是很欣赏SHOCK的破解能力的,但看到只有破解版,估计也是不对称加密导致的。新版没有破解,所以就自己准备研究一下。

yourkit的license配置分成服务器分配和文件分配两种,我手头也没有正版的license,所以就用了一个试用版的,然后结合静态分析,得出了结论。

Resin的connectionMax

  最近在工作中遇到resin3.x在高负荷情况下有系统停摆现象,恰好找到一篇文章,和我所遇到的一模一样。很奇怪的无论是3.0开发树还是3.1开发树都没有公开这个参数,在配置文件中无法进行配置。

  错误表现为当待处理链接达到512后,系统停止处理(打开页面超慢)。

  处理方法:把com.caucho.server.port.Port中的_connectionMax变量适当进行调整。

com.caucho.server.port.Port
 // default timeout
  private long _socketTimeout = DEFAULT;

  private int _connectionMax = 512;//这个参数外部无法调节
  private int _minSpareConnection = 16;

  private int _keepaliveMax = DEFAULT;
 
  private long _keepaliveTimeout = DEFAULT;
  private long _keepaliveSelectThreadTimeout = DEFAULT;
Parsed in 0.001 seconds

下载源码包,重新进行编译并替换运行库后生效。

ElGamal

  上个星期日,在公司做完事,上网无意之中看到QuipuKit,一个java faces的商用组件。查看之下发觉好像还不错的样子,450美刀一份。想起来自resin 3.1.x破解之后,好像好久没反编译过东西了,碰巧这个东西的试用版还是全功能的,就拉下来看了一下。很快就定位了注册验证的部分。用的是ElGamal算法(离散对数问题),注册信息用ElGamal签名之后,通过公钥验证。本来以为会是RSA或是DSA的,以前没接触过ElGamal,于是本着探索的精神,去挖了一下这个算法。原理性的东西不多写了,和RSA有点像,大数,乘方,模运算,三者混合而成,签名过程会产生两个Signature,然后目的端用一个等式验证。

ElGamal wrote:

  ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。

myface1.1.5中的默认转换

  今天在做一个数据导出JSF的时候,发现新的myfaces1.1.5的数据默认转换写法有点不一样了。

itemValue赋值的变化
<f:view>
  <h:form>
    <h:selectOneMenu id="exptype" value="#{exp.type_no}">
      <f:selectItem itemLabel="业务1" itemValue="#{1}"/>
    </h:selectOneMenu>
    <h:commandButton value="导出指定用户"/>
    <h:messages showDetail="true"/>
  </h:form>
</f:view>
Parsed in 0.001 seconds

并且默认对应的数值转换类型为Long,对应上面的itemValue,Java的Bean的写法为

默认格式转换getter和setter
 public void setType_no(Long type_no) {
      //...
  }

  public Long getType_no() {
    return type_no;
  }
Parsed in 0 seconds

crontab中java程序乱码

  最近部署一个JAVA程序到Linux中的crontab,遇到了乱码。因为以前一直都用英文信息,所以一直没遇到这个问题。原来还是环境变量的问题,因为在crontab系统里不会携带用户的环境参数。因此,需要额外添加。不过有点奇怪的是其中一些变量,不需要显式export出来就可以了,比如PATH,JAVA_HOME之类的,而LANG参数则需要显式export才可以,否则,就是好多问号,乱码....

crontab所引用的sync.cron
#!/bin/sh
export LANG="en_US.UTF-8"
JAVA_HOME=/opt/jdk1.6.0_01
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:/usr/bin:/bin

LogFile=$HOME/pubprogram/dataimp3/logs/sync2no_$(date +%Y%m%d).log
echo "-------------------------------------------" >> $LogFile
echo $(date +"%Y-%m-%d %H:%M:%S") >> $LogFile
echo "-------------------------------------------" >> $LogFile
$HOME/pubprogram/dataimp3/syncn2o >> $LogFile 2>&1
echo "------------------End----------------------" >> $LogFile
Parsed in 0.008 seconds

Java中操作超大ResultSet

  以前同事曾经遇到这个毛病,一直以为是程序编写方面的问题。简单来说就是rs.next()到一定的数目,程序退出。自己重新写时候,参照oracle的优化规则,对程序进行了手工提交,批量更新等优化措施。但是执行到一定时候还是这样,不过我接到了异常是OutOfMemoryError。

  于是我去掉了rs.last()这一句,程序得以执行,但也在8万条记录后退出,报相同异常,看起来似乎是油标把记录都读到内存引起的。但程序结构应该没什么大的问题。于是上网查了一下,发现也有人有相同的问题,有人也指出毛病,但没有明确的解决办法。还有人说分开几个记录集来处理...

聚合内容