晕死,刚才写完的时候chromes崩溃了,加代码的时候。。。。。貌似这个fckeditor有BUG~~
重写~~~
来河南一个多月了,一直跟进这个项目,从最开始从需求了解,需求分析,到现在跑河南和客户交流,沟通,从项目JAVA代码的框架搭建到现在代码的编写。觉得自己有了一个长足的成长,当然是非技术上的成长,技术上貌似退步了。 :cry:
首先,遇到以前头痛的项目管理上的问题,现在有了一定的认识与经验。对于项目进度与项目周期有了一定的了解。对于项目上的代码估算有了一个深层次的提高。对项目工期的安排也渐渐得心应手了。
其次是和人交流的方面,这一方面真的是靠练出来的,接触多了。和别人交流起来自然就舒畅多了。这也是个很重要的素质。
当然,在项目遇到了技术问题,现在就来总结一下:
首先是spring发邮件的问题,貌似现在很多邮件服务器都需要对用户进行身份验证,在这里就比一般的邮件发送多一步:
需要在邮件会话session里加一个验证的类PopupAuthenticator
这样才能成功发送邮件。
还有一个困扰我很久的问题,就是对于DefaultAutoProxyCreator这个自动代理的类,看上去这个自动创建代理的创建者会帮你搞定一切。但是,我在这里遇上了很大的问题,首先是在加一个jdbcTemplate类时,一启动程序就会报一个:proxy不等于代理类的错误,这很让我头痛,代理创建的类应该是所代理的类子类才对,我弄了几天,在这里卡了几天,后来分析debug信息(log4j也是个非常强大的调试工具)发现这个Creator会为每个bean文件中的bean都创建代理,这样就脱离了我们的本意,我们只需要给事务管理器创建代理(一般的项目需要创建代理的只有几个),也给项目带来了额外的性能开销,另外当把发送邮件加入时,这个creator也会为javax.mail.Session创建代理,但session是final的,不能有子类,这里也会报错。所以我决定不能偷懒,一个事务就写一个creator
这个defaultautoproxycreator引发的问题我GOOGLE了一下,也没人给出合理的解释。改成上面代码后,项目成功运行,搞定错误。暂时松了口气。
还有一个就是批量更新的问题:开始的时候我准备弄一个对象池供查询过来的数据封装成对象用,因为同步的数据有几十万条,那就得new几十万次,想当然就认为使用对象池比较好,后来拜读了robbin的一段回帖后才对对象池有一些深刻的理解:对象池不单单是用一个集合维护生成的对象就可以了,还得考虑同步的问题,多线程的环境,对于一般的小对象建对象池都是愚蠢的,只有当hold外部资源的时候才有建对象池的必要,例如:数据库连接池。现在的JVM对这些短命对象GC的效率非常高了。事实也证明了这一点,我在批量导入数据的时候,一次生成3000个POJO对象(这3000个POJO对象属性个数小于10),内存和CPU的占用率都没有明显的提高。
对于ORACLE中分页有了一个新的认识。
oracle中经典的并有很高效率的分页语句是:
但是分页语句有个很难解决的问题,那就是当要读取后面数据的时候效率还是很慢。大约一个表前2万条的时候效率还是很高的,当数据量超过2万条后,效率大大降低。
在我刚开始同步数据的时候,200条做一次批量,当数据量到了2万以后,查一次就不动了,程序也不报错,oracle也好好的。当时很纳闷,更新一次得一分钟。开始以为是ORACLE的回滚端容量小了,批量插入占满了回滚段,就调大回滚段,但调大了没多大提高。后面对SQL语句测试发现了分页的问题。后面决定把查询量设大,一次3000,终于让更新数据控制在可以容忍的地步。
继续补充:
使用了spring的quartz定时任务,在tomcat服务器下会有一个BUG,一个定时任务会启动2次。
最初的时候,我只发现一个事务在启动的时候突然报一个表被锁(我是删除一个表的数据 ),no wait~~~
~我从项目中的事务开始检查起,仔细查看日志,寻找有无hold的事务,最后找得崩溃~~断定不是事务的问题,查看启动日志,发现在tomcat启动时定时任务会启动2次,迷惑ing~~~~
google了一把,终于找到了问题~~~
当用eclipse部署应用到tomcat,然后用eclipse启动时,不会有这样的问题。当把应用打WAR包发布到生产环境时就有问题了。
请看下面这段配置就是错误的:
正确的配置如下
[code='xml']
<Host name="www.***.com" debug="0" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="" docBase="/tomcat/webapps/***" debug="1" />
<Context path="/***2" docBase="/tomcat/webapps/***2" debug="1" />
</Host>
[/code]
这两段的区别是第二段去除了appBase="webapps"中的webapps变成了appBase="",因为web应用程序都是放在webapps这个目录下的,如果不把“webapps“去掉,这里会调用一次quartz的任务调度,在接下来的“<Context path”中又会调用一次quartz的任务调度,所以就重复了2次
重写~~~
来河南一个多月了,一直跟进这个项目,从最开始从需求了解,需求分析,到现在跑河南和客户交流,沟通,从项目JAVA代码的框架搭建到现在代码的编写。觉得自己有了一个长足的成长,当然是非技术上的成长,技术上貌似退步了。 :cry:
首先,遇到以前头痛的项目管理上的问题,现在有了一定的认识与经验。对于项目进度与项目周期有了一定的了解。对于项目上的代码估算有了一个深层次的提高。对项目工期的安排也渐渐得心应手了。
其次是和人交流的方面,这一方面真的是靠练出来的,接触多了。和别人交流起来自然就舒畅多了。这也是个很重要的素质。
当然,在项目遇到了技术问题,现在就来总结一下:
首先是spring发邮件的问题,貌似现在很多邮件服务器都需要对用户进行身份验证,在这里就比一般的邮件发送多一步:
<bean id="smtpAuthenticator" class="com.xxx.base.util.PopupAuthenticator">
<property name="password">
<value>${mail.password}</value>
</property>
<property name="username">
<value>xxx</value>
</property>
</bean>
<!-- 邮件会话-->
<bean id="mailSession" class="javax.mail.Session" factory-method="getInstance" >
<constructor-arg>
<props>
<prop key="mail.smtp.auth">
${mail.smtp.auth}
</prop>
<prop key="mail.smtp.timeout">
${mail.smtp.timeout}
</prop>
</props>
</constructor-arg>
<constructor-arg ref="smtpAuthenticator"/>
</bean>
<!-- 邮件发送者 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>${mail.host}</value>
</property>
<property name="port">
<value>25</value>
</property>
<!--
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">
${mail.smtp.auth}
</prop>
<prop key="mail.smtp.timeout">
${mail.smtp.timeout}
</prop>
</props>
</property> -->
<property name="session">
<ref local="mailSession"/>
</property>
</bean>
<!-- spring的发送者 -->
<bean id="sendMailService" class="com.xxx.base.mission.service.impl.SendEMailService">
<property name="sender">
<ref local="mailSender"/>
</property>
</bean>
需要在邮件会话session里加一个验证的类PopupAuthenticator
public class PopupAuthenticator extends Authenticator {
private String username=null;
private String password=null;
public PopupAuthenticator(){}
public PasswordAuthentication performCheck(){
return getPasswordAuthentication();
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username,this.password);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这样才能成功发送邮件。
还有一个困扰我很久的问题,就是对于DefaultAutoProxyCreator这个自动代理的类,看上去这个自动创建代理的创建者会帮你搞定一切。但是,我在这里遇上了很大的问题,首先是在加一个jdbcTemplate类时,一启动程序就会报一个:proxy不等于代理类的错误,这很让我头痛,代理创建的类应该是所代理的类子类才对,我弄了几天,在这里卡了几天,后来分析debug信息(log4j也是个非常强大的调试工具)发现这个Creator会为每个bean文件中的bean都创建代理,这样就脱离了我们的本意,我们只需要给事务管理器创建代理(一般的项目需要创建代理的只有几个),也给项目带来了额外的性能开销,另外当把发送邮件加入时,这个creator也会为javax.mail.Session创建代理,但session是final的,不能有子类,这里也会报错。所以我决定不能偷懒,一个事务就写一个creator
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*WebService</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionIntercepter</value>
</list>
</property>
</bean>
这个defaultautoproxycreator引发的问题我GOOGLE了一下,也没人给出合理的解释。改成上面代码后,项目成功运行,搞定错误。暂时松了口气。
还有一个就是批量更新的问题:开始的时候我准备弄一个对象池供查询过来的数据封装成对象用,因为同步的数据有几十万条,那就得new几十万次,想当然就认为使用对象池比较好,后来拜读了robbin的一段回帖后才对对象池有一些深刻的理解:对象池不单单是用一个集合维护生成的对象就可以了,还得考虑同步的问题,多线程的环境,对于一般的小对象建对象池都是愚蠢的,只有当hold外部资源的时候才有建对象池的必要,例如:数据库连接池。现在的JVM对这些短命对象GC的效率非常高了。事实也证明了这一点,我在批量导入数据的时候,一次生成3000个POJO对象(这3000个POJO对象属性个数小于10),内存和CPU的占用率都没有明显的提高。
对于ORACLE中分页有了一个新的认识。
oracle中经典的并有很高效率的分页语句是:
select * from(
select a.*,rownum rn from
(select * from table) a where rownum<=endrow
) where rn>startrow;
但是分页语句有个很难解决的问题,那就是当要读取后面数据的时候效率还是很慢。大约一个表前2万条的时候效率还是很高的,当数据量超过2万条后,效率大大降低。
在我刚开始同步数据的时候,200条做一次批量,当数据量到了2万以后,查一次就不动了,程序也不报错,oracle也好好的。当时很纳闷,更新一次得一分钟。开始以为是ORACLE的回滚端容量小了,批量插入占满了回滚段,就调大回滚段,但调大了没多大提高。后面对SQL语句测试发现了分页的问题。后面决定把查询量设大,一次3000,终于让更新数据控制在可以容忍的地步。
继续补充:
使用了spring的quartz定时任务,在tomcat服务器下会有一个BUG,一个定时任务会启动2次。
最初的时候,我只发现一个事务在启动的时候突然报一个表被锁(我是删除一个表的数据 ),no wait~~~
~我从项目中的事务开始检查起,仔细查看日志,寻找有无hold的事务,最后找得崩溃~~断定不是事务的问题,查看启动日志,发现在tomcat启动时定时任务会启动2次,迷惑ing~~~~
google了一把,终于找到了问题~~~
当用eclipse部署应用到tomcat,然后用eclipse启动时,不会有这样的问题。当把应用打WAR包发布到生产环境时就有问题了。
请看下面这段配置就是错误的:
<Host name="www.***.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="" docBase="/tomcat/webapps/***" debug="1" />
<Context path="/***2" docBase="/tomcat/webapps/***2" debug="1" />
</Host>
正确的配置如下
[code='xml']
<Host name="www.***.com" debug="0" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="" docBase="/tomcat/webapps/***" debug="1" />
<Context path="/***2" docBase="/tomcat/webapps/***2" debug="1" />
</Host>
[/code]
这两段的区别是第二段去除了appBase="webapps"中的webapps变成了appBase="",因为web应用程序都是放在webapps这个目录下的,如果不把“webapps“去掉,这里会调用一次quartz的任务调度,在接下来的“<Context path”中又会调用一次quartz的任务调度,所以就重复了2次