在路上

路上有惊慌,路上有理想

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

#

常用sql:

SHOW VARIABLES LIKE 'character%';查看字符集
SHOW VARIABLES LIKE 'collation_%';
show engines;查看引擎
show databases; 查看数据库

show tables;

desc table_name;

GRANT ALL PRIVILEGES ON *.* TO 'guming'@'localhost' IDENTIFIED BY 'guming' WITH GRANT OPTION;授权
show PRIVILEGES;查看权限
show grants for test@localhost;查看用户权限
select * from mysql.user where user='test';

函数
逻辑:case when,isnull,IFnull等

数学:mod,cell,floor,round(),trancate(),abs()

字符串函数:rtrim,ltrim,substring,locate(),INSTR(),length,left,right
   REPEAT(str,count)
    返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。 若 count <= 0,则返回一个空字符串。若str 或 count 为 NULL,则返回 NULL 。
   REPLACE(str,from_str,to_str)
    返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
   REVERSE(str)
   返回字符串 str ,顺序和字符顺序相反。

日期函数:current_date,datediff,adddate,date_add,dayofweek,dayofyear,dayofmonth,month,hour(),
      str_to_date: SELECT STR_TO_DATE('20031031',GET_FORMAT(DATE,'ISO'));
      select date_format(current_date(),'%Y-%m-%d %W');
      select extract(YEAR_MONTH FROM current_date());
转换函数:
cast:可使用CAST()函数将某个值转为另外一种类型。CONVERT
convert_TZ:CONVERT_TZ()  将时间日期值dt  从from_tz  给出的时区转到to_tz给出的时区
concat:返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

全文检索
 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');
  在默认状态下, 搜索的执行方式为不区分大小写方式。然而,你可以通过对编入索引的列使用二进制排序方式执行区分大小写的全文搜索。     例如,可以向一个使用latin1字符集的列给定latin1_bin   的排序方式,对于全文搜索区分大小写。
 利用IN BOOLEAN MODE修改程序, MySQL 也可以执行布尔全文搜索:
mysql> SELECT * FROM articles WHERE MATCH (title,body)
    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
这个问询检索所有包含单词“MySQL”的行,但不检索包含单词“YourSQL”的行。

 全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索 “database” 一词的用户,
 可能认为“MySQL”、“Oracle”、“DB2” and “RDBMS”均为符合 “databases”的项,因此都应被返回。这既为内隐知识。
mysql> SELECT * FROM articles
    -> WHERE MATCH (title,body)
    -> AGAINST ('database' WITH QUERY EXPANSION);
   
加密函数:
ENCRYPT()
md5()
password()
字符集操作
SELECT CHARSET(CONVERT('abc' USING utf8));SELECT CHARSET(USER());

查询缓存设置:
服务器启动时要禁用查询缓存,设置query_cache_size系统变量为0,query_cache_type=on
SET GLOBAL query_cache_size = 40000;
SHOW VARIABLES LIKE 'query_cache_size';
SHOW VARIABLES LIKE 'query_cache%';
开启缓存后:
select * from ad_position where id=201;
SHOW STATUS LIKE 'Qcache_hits';  查询命中次数

 SET SESSION query_cache_type = ON;(ON:1,OFF:0,2:DEMAND)
  on 启用缓存,SELECT SQL_NO_CACHE除外
  off 不用缓存,
  DEMAND 仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存。
清除缓存:
 可以使用FLUSH QUERY CACHE语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。
 RESET QUERY CACHE语句从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作。
 
什么类型的数据缓存?
查询结果集缓存,对于动态的结果集是不缓存的。必须是一样的sql,并且结果集无变化。
表更新后,对应表的缓存失效,此时同一sql有很能结果集不同了。
注释:查询缓存不返回旧的数据。当表更改后,查询缓存值的相关条目被清空。
注释:如果你有许多mysqld服务器更新相同的MyISAM表,在这种情况下查询缓存不起作用。
注释:查询缓存不适用于服务器方编写的语句。如果正在使用服务器方编写的语句,要考虑到这些语句将不会应用查询缓存
调整缓存:
·         query_cache_min_res_unit默认值是4KB。这应该适合大部分情况。

·         如果你有大量返回小结果数据的查询,默认数据块大小可能会导致内存碎片,显示为大量空闲内存块。由于缺少内存,内存碎片会强制查询缓存从缓存内存中修整(删除)查询。这时,你应该减少query_cache_min_res_unit变量的值。
          空闲块和由于修整而移出的查询的数量通过Qcache_free_blocks和Qcache_lowmem_prunes变量的值给出。

·         如果大量查询返回大结果(检查 Qcache_total_blocks和Qcache_queries_in_cache状态变量),你可以通过增加 query_cache_min_res_unit变量的值来提高性能。但是,注意不要使它变得太大(参见前面的条目)。

更改存储引擎
ALTER TABLE engineTest ENGINE = ARCHIVE;

字符集设置:

在ini文件中加入下面配置:

default-character-set = utf8
character_set_server = utf8

导入数据库备份时遇到的问题,空间不够

修改ini文件中的配置:max_allowed_packet = 16M

 

参考文档:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/

posted @ 2010-09-09 11:10 阮步兵 阅读(1933) | 评论 (0)编辑 收藏

集群后,受管appserver1,appserver2,appserver13,无法启动,报错如下:

<BEA-090504> <Certificate chain received from localhost - 127.0.0.1 failed hostname verification check. Certificate contained LENOVO-D01793DE but check expected localhost>

问题的原因:主机名验证不通过。在安装bea weblogic时,当时的主机名为 LENOVO-D01793DE,后进行了变更。而weblogic的服务器证书没有更新,还是老的主机名,所以始终不匹配。注:即使写 ip/localhost也没用,发送url时是附带主机名的。

方案1:更改notemanger.hosts文件,加入主机名和ip,结果还是不起作用。

方案2:在server的StartWeblogic.sh  java参数加入-Dweblogic.security.SSL.ignoreHostnameVerification=true

           在startNodeManager.sh java参数加入 -Dweblogic.security.SSL.hostnameVerifier=examples.security.sslclient.NulledHostnameVerifier

            结果还是不起作用

方案3:在keystore ssl的配置中,高级配置有一项客户端特性-->主机名验证 选为 ‘无’,结果测试通过,成功

下面是此项配置的说明,估计在java 参数里加入 -Dweblogic.security.SSL.HostnameVerifier=none 应该也可以

如果不愿意加,就在console里一个一个改吧

weblogic.security.SSL.HostnameVerifier

在 SSL 握手期间,主机名验证可确定 URL 中的主机名是否与服务器标识中的主机名相匹配;需要进行此验证以防止中间人攻击。
WebLogic Server 提供了基于证书的 HostnameVerifier 实现,默认情况下使用该实现,它用于验证 URL 主机名是否与服务器证书的 CN 字段值相匹配。
您可以使用管理控制台“SSL”选项卡之下的“高级选项”窗格,用自定义主机名验证器替换此默认的主机名验证器;这将影响在使用 WebLogic SSL API 的服务器上运行的 SSL 客户端的默认值。另外,通过诸如 HttpsURLConnectionSSLContext 的 WebLogic SSL API,可以显式设置自定义 HostnameVerifier。
posted @ 2010-09-02 22:53 阮步兵 阅读(4187) | 评论 (1)编辑 收藏

     摘要:   Weblogic server 端口号  内存分配  ...  阅读全文
posted @ 2010-09-01 21:58 阮步兵 阅读(2369) | 评论 (0)编辑 收藏

写在前面的话:spring的监听事件模型应该是观察者模式。本人项目里的应用在process方法按日期同步某个库的数据,在方法最后publish一个event事件,这个事件用于后续同步过来的数据处理。事件处理采用了spring的监听模型.这样可以做到process方法与event可以异步分离执行。(注:这个事件模型缺省使用SyncTaskExecutor来执行listener的注册event,所有该listener注册的event事件为同步执行的)。

当然,spring的这个机制还有很多应用的场景,就不一一列举了。

ApplicationEvent

事件抽象类,里面只有一个构造函数和一个timestamp。

ApplicationListener

监听接口,里面只有一个onApplicationEvent方法。需要用户自己编写ApplicationListener的实现。

ApplicationContext

spring上下文,其publishEvent方法用于通知监听器(ApplicationListener的实现)注册event时间.

publishEvent

void publishEvent(ApplicationEvent event)

Notify all listeners registered with this application of an application event.

源码解读:
1.作为ApplicationContext的实现AbstractApplicationContext.java的成员变量applicationListeners,是一个ArrayList,保存了所有的ApplicationListener
2.利用ApplicationEventMulticaster接口里的方法来完成注册监听addApplicationListener,移除监听removeApplicationListener,removeAllListeners,以及通知监听注册事件event:multicastEvent(ApplicationEvent event);
上面说到的publishEvent方法即使用了multicastEvent方法

SimpleApplicationEventMultucaster作为ApplicationEventMulticaster的一个实现,提供了multicastEvent的实现代码,其实就是迭代所有的监听器,用SyncTaskExecutor同步执行listener的onApplicationEvent

public void multicastEvent(final ApplicationEvent event) {

for (Iterator it = getApplicationListeners().iterator(); it

.hasNext();) {

final ApplicationListener listener = (ApplicationListener) it

.next();

getTaskExecutor().execute(new Runnable() {

public void run() {

listener.onApplicationEvent(event);
}
});
}

3.注意事项:自己编写ApplicationListener的实现时,要注意不同的监听器处理不同的事件(复写onApplicationEvent)。原因就是multicastEvent的执行原理。它是迭代执行所有的监听器onApplicationEvent

这里是ApplicationEventMulticaster的类分布图



abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
public interface ApplicationEventMulticaster (Code)(Java Doc)

public class SimpleApplicationEventMulticaster extends

这里是ApplicationContext的类分布图
public class DefaultResourceLoader implements ResourceLoader(Code)(Java Doc)
public interface ResourceLoader (Code)(Java Doc)

abstract public class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext,DisposableBean(Code)(Java Doc)
public interface ConfigurableApplicationContext extends ApplicationContext,Lifecycle(Code)(Java Doc)
public interface DisposableBean (Code)(Java Doc)

public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry(Code)(Java Doc)
public interface BeanDefinitionRegistry (Code)(Java Doc)

abstract public class AbstractRefreshableApplicationContext extends
下面是spring自身的事件应用
1) ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件。
2) ContextClosedEvent:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
3) RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件。
4) ContestStartedEvent:当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
5) ContestStopedEvent:当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。

posted @ 2010-09-01 10:41 阮步兵 阅读(5331) | 评论 (6)编辑 收藏

1.类介绍:
Executor
接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
它只有一个方法excute(Runnable command),你可以复写此方法,让Runnable同步或异步执行
ExecutorServiceExecutor的一个子接口,提供了管理线程的方法,可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。
ThreadPoolExecutor是ExecutorService的一个实现类,它通常与Executors工厂一起使用。
下面的方法取自Executors类
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
这里面使用ThreadPoolExecutor创建一个线程数为nThreads的线程池。
类似的工厂方法还有很多,可以查看JDK
ExecutorService的常用方法:
invokeAll 执行所有任务,全部执行完毕后返回每个任务的结果(FutureList),包括每个任务的状态
invokeAny 与上面方法的区别是,只返回一个任务成功执行结果Future
submit 提交一个Task去执行,并返回执行结果
awaitTermination 当执行线程中断、超时,或调用了shutdown方法后,阻塞直到所有的Task都执行结束。
shutdown 关闭所有执行过的Task,并不再接收新线程
isTerminated 如果所有Task都关闭则返回True,前提是调用过shutdown或shutdownNow
2.使用示例:
a.首先定义一个辅助类SystemConstant,大致方法如下:
//初始化一个线程池
public static ExecutorService getExecutor() {
if(PROCESS_EXECUTOR == null || PROCESS_EXECUTOR.isTerminated()) {
PROCESS_EXECUTOR = Executors.newFixedThreadPool(EXECUTOR_SIZE);
}
return PV_PROCESS_EXECUTOR;
}
//定义关闭方法
public static void awaitTerminationExecutor(long timeout, TimeUnit unit) {
getExecutor().shutdown();
try {
getExecutor().awaitTermination(timeout, unit);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
b.接下来是调用:
try {
SystemConstant.getExecutor().invokeAll(SystemUtils.toCallable(
new SystemUtils.CallableHandle<IPvProcess>() {

public void handle(Process process) throws Exception {
process.processLogs(logs, statDate);
}

}, prepareProcesses), perOutOfTime, TimeUnit.HOURS);
} catch (Exception e) {
logger.error(e);
}
SystemConstant.awaitTerminationProgramExecutor(allOutOfTime, TimeUnit.HOURS);

3. 类结构图

java.util.concurrent
Class ThreadPoolExecutor

java.lang.Object
extended by java.util.concurrent.AbstractExecutorService
extended by java.util.concurrent.ThreadPoolExecutor
All Implemented Interfaces:
Executor, ExecutorService
Direct Known Subclasses:
ScheduledThreadPoolExecutor
posted @ 2010-08-31 21:37 阮步兵 阅读(4865) | 评论 (0)编辑 收藏

1.实体map.xml中配置:
主键获取方式配置,mysql
<selectKey  resultClass="java.lang.Integer" keyProperty="id">
          select LAST_INSERT_ID()
</selectKey>

动态拼接where条件
<dynamic prepend="where">
            <isNotNull>
                plateId=#value#
            </isNotNull>
</dynamic>
2.config配置
typeAlias 定义类型别名
<typeAlias alias="Item" type="com.tudou.tudoupromotion.entity.Item"/>

typeHandler 自定义类型转换
比如,将数据库中的1,2,3格式的数据转换为java 枚举
 <typeHandler javaType="com.tudou.tudoupromotion.entity.Plate" callback="com.tudou.tudoupromotion.ext.ibatis.PlateHandler"/>

线程缓存等配置

    <settings
     cacheModelsEnabled="true"
     enhancementEnabled="true"
     lazyLoadingEnabled="false"
     maxRequests="32"
     maxSessions="10"
     maxTransactions="5"
     useStatementNamespaces="true"
    />
   cacheModelsEnabled="true"  是否启动缓存机制
  enhancementEnabled="true"  是否针对POJO启动字节码增强机制以提升getter/setter的调用效能避免使用javaReflect所带来的性能开销。同时Lazy Loading带来极大的性能提升。
  maxRequests最大并发请求数(Statement数)
  maxTransactions最大并发事务数
  maxSessions最大Session数,即当前最大允许的并发SqlMapCliect数maxSessions设定必须界于 maxTransactions和maxRequests之间.即   maxTransactions>maxSessions>maxRequests

posted @ 2010-08-30 22:31 阮步兵 阅读(246) | 评论 (0)编辑 收藏

如果用过python,就知道它有了command line 工具,比如你输入 print 'a' ,该工具输出:a,好处是便于快速学习python 语法。

其实java也可以做到。

下面是一个java 脚本解释器的helloword版本,思路如下:

1动态创建一个Temp.java类文件,里面只有一个excute方法,把从控制台输入 的字符串加入到类方法中,比如for(int i=0;i<10;i++){System.out.println(i);}。

2再利用com.sun.tools.javac.Main.compile 动态编译Temp.java 生成class

3将Temp.class载入到jvm

4生成object实例,利用反射执行excute方法

说明,这只是个test版本。

public class Test {
   public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException{
      
       
        BufferedReader reader  = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            String js=reader.readLine();
           OutputStream os = new FileOutputStream("Temp.java"); 
            String tempJava="public class Temp"+
               " {   "+
                " public void excute() "+
                " {  "+
                 js+
                " }  "+
               " }  ";
            os.write(tempJava.getBytes());  
            os.close();
            String[] compileArgs = new String[] {"Temp.java"};  
            com.sun.tools.javac.Main.compile(compileArgs);  
            URLClassLoader loader =  
               new URLClassLoader(new URL[]{new File(".").toURI().toURL()}); 
            Class<?> scriptClass = loader.loadClass("Temp");
            Object obj = scriptClass.newInstance();
            obj.getClass().getDeclaredMethod("excute").invoke(obj);
            obj=null;
        }
   }
}

posted @ 2010-08-30 22:29 阮步兵 阅读(390) | 评论 (0)编辑 收藏

ORMUnit下载链接:
http://code.google.com/p/ormunit/
    在做面向关系数据库的应用系统的时候,db表结构在开发过程中,可能会由于前期的设计不足导致不断的修改表结构。如果Java层面采用类似Hibernate ORM,随之对应的是maps & pojos的修改。此时修改后的简单测试就显得尤为重要。
    ORMUnit功能比较多,本文只取其少数几个类,完成上面的功能。
    1.首先改写:HibernateORMTestCase类,指定加载的hibernate.cfg.xml位置
    public abstract class HibernateORMTestCase extends TestCase {
    protected Log logger = LogFactory.getLog(getClass());
    protected SessionFactory sessionFactory;
    //Location of hibernate.cfg.xml file.
    private static String CONFIG_FILE_LOCATION = "com/mmm/china/xxx/dbtest/hibernate.cfg.xml";
   
    protected Configuration cfg;
   
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    /**
     * make configuration
     * @return
     */
    protected Configuration getConfiguration() {
        if (cfg == null) {
            cfg=new Configuration().configure(CONFIG_FILE_LOCATION);
        }
        return cfg;
    }

   } 
    2.HibernateSchemaChecker类(检查db schema map pojo):改写输出不符合map关系的表以及变更脚本,并增加计数功能
     List getSignificantDifferences(
            String[] script) {
        int num=0;
        List differences = new ArrayList();
        for (int i = 0; i < script.length; i++) {
            String line = script[i];
          
            if (line.indexOf("add constraint") == -1)
                {
                 differences.add(line);
                 logger.error("DIFF_LINE>>>>>>>>>>="+line);
                }
            else{
                num++;//计算有多少个外键有问题
                logger.info("CONSTRAINT_LINE>>>>>>>>>>"+num+"="+line);
            }
        }
        return differences;
    }
      注:ORMUnit 检查CONSTRAINT 有问题,在db为sqlserver时,生成的外键约束的名称是自动命名的,与实际数据库的命名不一致,ORMUnit就认为不匹配,所以,要过滤add constraint的error信息
   3.使用HibernateSchemaTests 进行junit测试
    public class HibernateSchemaTests extends HibernateORMTestCase  {
   
    private HibernateSchemaChecker schemaChecker;

    protected void setUp() throws Exception {
        super.setUp();
        schemaChecker = new HibernateSchemaChecker(getConfiguration(), getConfiguration().buildSessionFactory());
    }

    /**
     * Verifies  all tables and columns referenced by the object/relational
     * mapping exist
     *
     * @throws Exception
     */
    public void assertDatabaseSchema() throws Exception {
        schemaChecker.assertDatabaseSchema();
    }

   }
  总结:只需要三个类,即可测试数据库schema与hibernate maps & pojo的map关系是否完全匹配,事半功倍。
posted @ 2010-03-03 14:55 阮步兵 阅读(292) | 评论 (0)编辑 收藏

在数据库从sqlserver2000升级到2005后,原有的左右连接(*=和=*)写法均不在支持,为了不修改app的代码,可以通过以下语句 调整sqlserver2005 database的兼容级别:

sp_dbcmptlevel [ [ @dbname = ] name ]
    [ , [ @new_cmptlevel = ] version ]

参数
[@name =] name

数据库的名称,将对此数据库的兼容级别进行更改。数据库的名称必须遵循标识符的规则。name 的数据类型为 sysname,默认值为 NULL。

[@new_cmptlevel =] version

数据库要兼容的 SQL Server 版本,对于sqlserver2000来说,version的值为80。

For example: sp_dbcmptlevel dbname,80

查看兼容级别:sp_helpdb dbname

 

posted @ 2010-03-02 21:56 阮步兵 阅读(369) | 评论 (0)编辑 收藏

   ——Apache Roller源码分析

    系统中,某些DB数据需要频繁更新,但实时性不强,可以采用延时更新的方式。设定一个间隔时间,累计更新数据,再通过特定的work thread统一更新。Apache Roller这个开源的Java Blog 正是才用了这种方式,实现站点计数的延时更新。

   优点:减少了数据库的一部分压力。尤其是在高并发下,数据库I/O及并发处理的压力

   缺点:实效性差,用户在某个时间点内获取的数据不准确。

   附图为 实现数据延时更新的Class Diagram

   

 

 说明:

     HitCountQueue.java 为站点计数队列,singleton instance,通过processHit 方法添加站点计数,通过resetHits方法清空Queue,为防止同步问题,增加了synchronized。在其构造函数内,会启动一个 workThread实例,完成队列数据到数据库的持久化工作。

    Job interface 为任务接口

    HitCountProcessingJob.java 实现了Job接口,完成数据更新的任务。

    WorkerThread.java 执行Job的工作线程,ContinuousWorkerThread继承自WorkerThread,增加了时间间隔的功能。线程执行后,会sleep 指定的时间。

posted @ 2010-02-27 15:38 阮步兵 阅读(305) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 下一页