未分类
spring事务错误:no matching editors or conversion strategy
错误日志:no matching editors or conversion strategy spring事务中会出现。
spring bean proxy默认代理的是接口,如果用来代理类,要在事务配置中添加以下代码声明:
<property name="proxyTargetClass" >
<value>true</value>
</property>, 否则就会出现上面的错误。
spring 声明式事务,Propagation属性列表
这些属性在TransactionDefinition接口中定义,共有7种选项可用:
PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务(还不是太明白),如果当前没有事务,就新建一个事务。
TransactionDefinition中定义的隔离(isolation)级别,有5种:
1 ISOLATION_DEFAULT 默认的隔离级别
下面几个都是 JDBC isolation levels 一一对应:
2 ISOLATION_READ_UNCOMMITTED Connection.TRANSACTION_READ_UNCOMMITTED
指示防止发生脏读的常量;不可重复读和虚读有可能发生。
3 ISOLATION_READ_COMMITTED Connection.TRANSACTION_READ_COMMITTED
指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
4 ISOLATION_REPEATABLE_READ Connection.TRANSACTION_REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION_SERIALIZABLE Connection.TRANSACTION_SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。
注:
脏读 dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction [...]
struts2 错误解决
错误日志:
[com.opensymphony.xwork2.interceptor.ParametersInterceptor]-[ERROR] ParametersInterceptor - [setParameters]: Unexpected Exception catched: Error setting expression ’start’ with value ‘[Ljava.lang.String;@2a590d’
解决方法:
在action 添加相应的属性(start). 或是删除页面表单和url中的多余的参数。
这个问题并不影响运行,干嘛要报个error呢,提示个警告不就OK,不明白 。
eclipse设置
1. myeclipse默认编码设置
项目默认编码设置:Window–>Preferences–>General–>WorkSpace
文件系统默认编码设置:Window–>Preferences–>General–>Content Types
2. Eclipse 中Alt+/快捷键失效的解决办法
Eclipse下进入Windows ->Preperences ->General ->keys(快捷键按住ctrl+shif同时双击L )
把word completion的快捷键设置alt+/删掉或改成其他的!
把Content Assist的快捷键由ctrl+space改成alt+/
关于Hibernate源码 org.hibernate.hql.antlr包为空的问题
Hibernate3的源码中org.hibernate.hql.antlr包是空的,代码是由Antlr产生的。
1, 配置ANtlr, 将antlr.jar设置到CLASSPATH环境变量或拷贝到jdk的lib下边。懒得写配置环境,直接拷贝到JDK的lib下方便。
2, 开始生成java 文件 到源码的grammar下看到有3个.g文件,
首先运行>java antlr.Tool hql.g
接着运行>java antlr.Tool hql-sql.g
最后运行>java antlr.Tool sql-gen.g OK,
关于HSQL的源码生成完毕,拷贝到org.hibernate.hql.antlr包下即可。
struts2.0标签应用(2)–for循环的实现
Java代码
<s:bean name="org.apache.struts2.util.Counter" id="counter">
<s:param name="first" value="1" />
<s:param name="last" value="10" />
<s:iterator>
counter:<s:property value="current-1"/>
</s:iterator>
</s:bean>
其中first属性指定循环起始值,last指定循环终止值,其它相关属性可以查看org.apache.struts2.util.Counter类源码。在下面迭代器中输入循环的当前值,即:current-1
Counter类源码
/*
* $Id: Counter.java 471756 2006-11-06 15:01:43Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.util;
import java.io.Serializable;
/**
* A bean that can be used to keep track of a counter.
* <p/>
* Since it is an Iterator it can be used by the iterator tag
*
*/
public class Counter implements java.util.Iterator, Serializable {
private static final long serialVersionUID = 2796965884308060179L;
boolean wrap = false;
// Attributes —————————————————-
long first = 1;
long current = first;
long interval = 1;
long last = -1;
public void setAdd(long addition) {
current += addition;
}
public void setCurrent(long current) {
this.current = current;
}
public long getCurrent() {
return current;
}
public void setFirst(long first) {
this.first = first;
current = first;
}
public long getFirst() {
return first;
}
public void setInterval(long interval) {
this.interval = interval;
}
public long getInterval() {
return interval;
}
public void setLast(long last) {
this.last = last;
}
public long getLast() {
return last;
}
// Public ——————————————————–
public long getNext() {
long next = current;
current += interval;
if (wrap && (current > last)) {
current -= ((1 + last) - first);
}
return next;
}
public long getPrevious() {
current -= interval;
if (wrap && (current < first)) {
current += (last - first + 1);
}
return current;
}
public void setWrap(boolean wrap) {
this.wrap = wrap;
}
public boolean isWrap() {
return wrap;
}
public boolean hasNext() {
return ((last == -1) || wrap) ? true : (current <= last);
}
public Object next() {
return new Long(getNext());
}
public void remove() {
// Do nothing
}
}
struts2.0标签应用(1)
%{}用于计算表达式
如%{10+20}结果将输出30
如%{"a"+"b"}结果将输出"ab"
#通常强调从上下文取
如#parameters.name[0]等价于request.getParameter("name")
如#session.name等价于session.getAttribute("name")
如#request.name等价于request.getAttribute("name")
%{#}仍然用于计算表达式,只不过操作元可以是变量
如先定义一个变量
<s:set name="age" value="%{25}"/>
则%{#age}将输出25,也可以省略"#",写为%{age}
若将age加10,可这么写:
%{#age+10},将输出30.不能省略"#"。也就说变量用于计算时不能省略"#"
关于搜索提示功能的实现(一)
/**
*
*作者:野四abin
* 时间:2009-3-27
*/
搜索引擎现在越来越流行了,好多网站都有了自己的搜索引擎,但是对于类型GOOGLE的提示并不多,在我的印象中并没有太多(google,baidu.todou,youku…),而大多数都是一些比较大型的网站在使用这个功能.由于公司的搜索引擎的需求要求实现关于类型google提示功能!
如下图
通过浏览别人做的搜索引擎提示总结出来我所面临的问题如下:
1、提示中的那些关键字是如何获得的
2、提示中的关于那些关键字的搜索数据条数如何获得的
3、关于得到这些数据的访问速度
通过上述问题我总结出来了关于这些问题的实现方案
对于第1个问题,我认为应当是用户通过搜索引擎搜索使用关键字的记录的。我是如果得到这些记录和如何存储这些记录的呢!
首先我新建一个表(关键字搜索记录表)主要是存储使用关键字搜索记录,它包括以下几个字段(ID,关键字,使用次数) 其中关键字是唯一的!我是怎样存储这些数据的呢!首先我创建一个searchkeys.txt文本文件,每个搜索使用的关键字写入文本中,每个关键字点一行,我是通过定时器来把这个数据存储到数据库当中的,通过分析这些数据如果有N个相同的关键字使用次数就为N个,我是每天0点的时候把这些数据存储在数据库中,为什么要选择0点,因为0点的时候访问量并不会太多,加入数据库中也不会影响网站的速度。同时能过分析数据中的记录生成一个名叫searchkeys.js的文件,它的格式如下:
JavaScript代码
var keyArr1=new Array();
keyArr1[0]=["1","办公摆挂件","1000"]
keyArr1[1]=["2","办公剪刀","1000"]
keyArr1[2]=["3","办公沙发","1000"]
keyArr1[3]=["4","办公饰品","1000"]
function getArr1(skey){
function funsort(x,y){//通过使用次数来排序
return y[1] - x[1];
}
var j=0;
var testArray = new Array();
var keyArray = new Array();
for (var i = 0; i < keyArr1.length; i++) {
if (keyArr1[i][1].indexOf(skey)==0) {//根据字来查找
testArray[j]= new Array(keyArr1[i][1],keyArr1[i][2]);
j++;
}
}
testArray.sort(funsort);
for (var sk = 0; sk < testArray.length; sk++) {
if(sk<10){//只取前10条结果
keyArray[sk]= new Array(testArray[sk][0],testArray[sk][1]);
}else{
break;
}
}
return keyArray;
}
为什么要使用这个JS呢?减少与数据库连接,
那关键字后面的结果条数怎么得来的呢,我认为是通过对关键字的的分词,再去通过分词后的字,去索引中查找关于这些关键字的HITS的记录,这里我只得到这些个数,并通过使用memcached来存储这个使用关键字与得到的结果个数!
测试结果:
输入关键字和出现提示的时间差<0.001s
ubuntu下nagios的安装配置
nagios是一款开源的网络管理软件。能够对网络内的主机和硬件设备进行状态监控,并可以在发生故障的时候给管理人员发送手机短信或email进行报警。
nagios能实现的功能:
1. 状态监控
2. 预警处理
3. 集中,规模化管理
4. 可视化显示方式
nagios的实现方式:nagios采用分布-集中的管理模式。在nagios服务器上安装nagios主程序,
在被监控主机上安装nagios代理程序。通过nagios主程序和nagios代理程序之间的通讯,监视
主机状态。
