ms



public static Object getMethInfo(String xmlStr,String method,String serviceUrl,String nameSpace) throws Exception {
JaxWsDynamicClientFactory jcf = JaxWsDynamicClientFactory.newInstance();
Client client = jcf.createClient(serviceUrl);
QName name=new QName(nameSpace,method);
Object[] objArray = client.invoke(name, xmlStr);
System.out.println(objArray[0]);
return objArray[0];

  <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
      <bean id="jobService" class="com.dcits.djk.img.service.impl.JobServiceImpl"></bean> 
      <jaxws:server id="yyghJobService" serviceClass="com.dcits.djk.img.service.impl.JobServiceImpl" address="/jobService"> 
        <jaxws:serviceBean>     
            <ref bean="jobService"/> 
        </jaxws:serviceBean>
    </jaxws:server>


========================
//xml 解析  并生成对象
DocXmlParse dxp = new DocXmlParse();
OrderEntity orderentity=new OrderEntity();
List<Object> listXml = new ArrayList<Object>();
StringBuffer sbfReturn = new StringBuffer();
sbfReturn.append(IsVersionAndEncoding.getVersionAndEncoding());
sbfReturn.append("<Message>");
String hoscode="";
listXml = dxp.xmlHYElements(xml.toString());
List<String> xmlName = (List<String>) listXml.get(0); // 获取xml名称
List<String> xmlValue = (List<String>) listXml.get(1); // 获取xml名称中值
for(int i = 0 ; i < xmlName.size() ; i ++){
if(xmlName.get(i).equals("Username")){
System.out.println("Username: "+ xmlValue.get(i));
String userName=StringEx.sNull(xmlValue.get(i));
orderentity.setUsername(userName);
}
=============================================================
CDN即内容分发网络,基本原理是用放置在各处的节点服务器将用户的访问导向到离用户最近的一台服务器上,提高internet访问速度。
================================================================
1 mybatis
数据库《===》映射《=====》对象    
数据库和对象的映射。Object Relation Mapping,简称ORM
特点:1灵活性 2
参数+sql=Entity/List
sql写那?
 xml提供sql(标签)sql拼接和处理逻辑的标签
 <if test="distinct" >
      distinct
    </if>
<foreach collection="example.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
  注解提供SQL
实现Dao
Mapper  mapper机制自动实现DAO的接口(知道参数 返回值 返回什么)
<!-- 配置全局属性 -->
<settings> 
   <!--     <!– 配置全局性 cache 的 ( 开 / 关) default:true –>   -->
        <setting name="cacheEnabled" value="false" /> 
         <!--使用jdbc 的getGeneratedKeys  获取数据库的自增主键值  -->
        <setting name="useGeneratedKeys" value="true" /> 
          <!-- 这是默认的执行类型   
                 SIMPLE :简单    


                 REUSE:执行器可能重复使用prepared statements 语句   


                 BATCH:执行器可以重复执行语句和批量更新   -->


        <setting name="defaultExecutorType" value="REUSE" /> 
    </settings>
更少的编码 只写接口 不写实现类
更少的配置 package scan
自动扫描配置文件
更少的配置
自动实现DAO接口   自动注入Spring容器
足够的灵活性
org.mybatis.spring.SqlSessionFactoryBean
org.mybatis.spring.mapper.MapperScannerConfigurer
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:spring-context.xml" })
==================================================================
spring
ioc功能的理解(依赖注入  控制反转)
对象工厂+依赖管理====》一致的访问接口
service==》dao===》SqlSessionFactory===>dataSource
ioc  对象创建统一管理  生命周期的管理,灵活的依赖注入,一致获取对象
注入方式和场景
xml
注解
java配置类
==================
xml配置+packkage-scan+Annotation注解
==========================================================
SpringMvc
handler===>数据model+页面view
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
 (Model model)model.addAttribute("key","value");
 produces = "application/json;charset=utf-8"
@ResponseBody
 @DateTimeFormat(pattern="yyyy-MM-dd") //注解日期对象  字符串变日期
 @NumberFormat(pattern="#,###.##")//注解数字对象
=====================================
CREATE PROCEDURE ''
================================
 Schema<T> schema = (Schema<T>) RuntimeSchema.creatrFrom(skill.class);
 Schema<T> schema = (Schema<T>) RuntimeSchema.getSchema(o.getClass());


============================================================
public class EncodingFilter implements Filter {
public void doFilter(
public class LoginHandlerInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(


<!-- 拦截器 -->
<mvc:interceptors>
<bean class="com.dcits.djk.manager.filter.LoginHandlerInterceptor">
<property name="excludeMappings">
        <list>
               <value>loginView.do</value>
               <value>login.do</value>
               <value>isLogin.do</value>
               <value>monitor/</value>
               <value>kaptcha.do</value>
               <value>filterMiddlePage.do</value>
        </list>
        </property>
        </bean>
</mvc:interceptors>
 filterChain.doFilter(request, response);
pringMvc
1 过程及原理
 Spring工作流程描述
      1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,
调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),
最后以HandlerExecutionChain对象的形式返回;
      3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
       4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,
        根据你的配置,Spring将帮你做一些额外的工作:
      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
      5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
      6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
      7. ViewResolver 结合Model和View,来渲染视图
      8. 将渲染结果返回给客户端。
===============================================
@RequestMapping(value = "/area/deleteArea", produces = "application/json;charset=utf-8")
@ResponseBody
============================================
@Controller
@RequestMapping("/examManage")
public class ExaminationController {
@Resource
private ExaminationService examinationService;
@Resource
private UserService userService;


@RequestMapping("/manager/getUserList")
@ResponseBody
public String getUserList(HttpServletRequest request, String userName, String centerName, int rows, int page) {
Map<String, Object> returnMap = new HashMap<String, Object>();
int allRows = examinationService.getCountLoginUserListByCaseOnPage(userName, centerName);
List<ExaminationCenterLoginVo> loginUserList = examinationService.getLoginUserListByCaseOnPage(userName,
centerName, rows, page);
if (loginUserList == null) {
loginUserList = new ArrayList<ExaminationCenterLoginVo>();
}
returnMap.put("total", allRows);
returnMap.put("rows", loginUserList);
JSONObject jo = JSONObject.fromObject(returnMap);
System.out.println(jo.toString());
return jo.toString();
}
===================================================================
@Service("examinationService")
public class ExaminationServiceImpl implements ExaminationService {


@Autowired
private ExaminationAreaInfoMapper examinationAreaInfoMapper;


============================================================================
javabean


@DateTimeFormat(pattern="yyyy-MM-dd")
    private Date entitleValidityTime;
===============================================================================
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="edit*" propagation="REQUIRED" />

<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="use*" read-only="true"/>
<tx:method name="count*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
=====================================================================================
valueMap = jedis.hgetAll(key);
jedis.hmset(key, valueMap);
jedis.del(key);
value = jedis.get(key);
jedis.set(key, value);


=======================================================================================
synchronized
继承Thread类和实现Runnable接口。
只有一个抽象方法:public abstract void run();
Thread t2 = new Thread(new MyThread());
t1.start();
new MyThread().start();
===============================
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc<==打包后,以 gzip 压缩
/etc/profile
chown
pwd
mkdir
rmdir
复制档案或目录:cp
rm
移动档案与目录,或更名:mv
取得路径的文件名与目录名:basename,dirname
由第一行开始显示档案内容:cat
修改档案时间或新建档案:touch


36、寻找特定档案:whereis
==============================================
localStorage 
var baseInfo = JSON.parse(sessionStorage.baseInfo);
  sessionStorage.removeItem('errorCount');//删除数据


E-mail: <input type="email" name="user_email" />
Homepage: <input type="url" name="user_url" />
Points: <input type="number" name="points" min="1" max="10" />
range 类型显示为滑动条。
<input type="range" name="points" min="1" max="10" />
Date: <input type="date" name="user_date" />
<datalist id="url_list">
<option label="W3School" value="http://www.W3School.com.cn" />
<option label="Google" value="http://www.google.com" />
<option label="Microsoft" value="http://www.microsoft.com" />
</datalist>
<output id="result" onforminput="resCalc()"></output>
<header id="header">
</header>
<section id="content">
</section>
<footer id="footer">

</footer>

--------------------------------------------------------------------------------------

java中String、StringBuffer、StringBuilder的区别 
java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题。现在总结一下,看看他们的不同与相同。


1.可变与不可变


  String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。


    private final char value[];


  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。


    char[] value;


2.是否多线程安全


  String中的对象是不可变的,也就可以理解为常量,显然线程安全。


  AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。


  StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码:




1 public synchronized StringBuffer reverse() {
2     super.reverse();
3     return this;
4 }

6 public int indexOf(String str) {
7     return indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8 }  StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。


 3.StringBuilder与StringBuffer共同点


  StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。


  抽象类与接口的其中一个区别是:抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法;而接口中只是对方法的申明和常量的定义。


  StringBuilder、StringBuffer的方法都会调用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer会在方法上加synchronized关键字,进行同步。


  最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

-----------------------------------------------------------------------------------------------------------------------------------------

oracle数据库优化的话主要有以下几个方面(我接触过的,可能不全面):
1 查询语句的优化,这个主要是根据语句和数据库索引的情况,结合查询计划的分析结果,对性能较低的查询语句进行重写,在执行查询前执行表分析语句也可以算这里;
2 数据结构优化,这个包括根据实际的应用中业务逻辑,对数据库的结构进行重新设计,或者创建相关索引里提高查询效率;
3 数据库设置优化,这方面主要是调整数据库和数据结构的相关参数提高应用访问系统的效率;
4 存储结构优化,在数据量较大的情况下,可以考虑通过数据库的存储结构进行优化,比如对数据进行partition,将数据存储在磁盘阵列服务器上等。
我的经验有限,以上是部分建议






(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表 (intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
(2) WHERE子句中的连接顺序.:
  ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
(3) SELECT子句中避免使用 ‘ * ‘:
  ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
(4) 减少访问数据库的次数:
  ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等;
(5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200
(6) 使用DECODE函数来减少处理时间:
   使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
(7) 整合简单,无关联的数据库访问:
   如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
(8) 删除重复记录:
  最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
  DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
  FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9) 用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
(10) 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
(11) 用Where子句替换HAVING子句:
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. (非oracle中)on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后,因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该比having快点的,因为它过滤数据后才进行sum,在两个表联接时才用on的,所以在一个表的时候,就剩下where跟having比较了。在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字段,就表示在没计算之前,这个字段的值是不确定的,根据上篇写的工作流程,where的作用时间是在计算之前就完成的,而having就是在计算后才起作用的,所以在这种情况下,两者的结果会不同。在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里
(12) 减少对表的查询:
在含有子查询的SQL语句中,要特别注意减少对表的查询.例子:
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT 
TAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) 
(13) 通过内部函数提高SQL效率.:
复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的
(14) 使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
(15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.
例子:
(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')
(低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')
(16) 识别'低效执行'的SQL语句:
虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法:
  SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, 
  ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, 
  ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, 
  SQL_TEXT 
  FROM V$SQLAREA 
  WHERE EXECUTIONS>0 
  AND BUFFER_GETS > 0 
  AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 
  ORDER BY 4 DESC; 
(17) 用索引提高效率:
索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.:
  ALTER INDEX REBUILD  
18) 用EXISTS替换DISTINCT:
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子:
(低效):
  SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E 
  WHERE D.DEPT_NO = E.DEPT_NO 
(高效):
  SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' 
  FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
(19) sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行 (20) 在java代码中尽量少用连接符“+”连接字符串!
(21) 避免在索引列上使用NOT 通常,
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
(22) 避免在索引列上使用计算.
WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000; 
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12; 
(23) 用>=替代>
高效:
SELECT * FROM EMP WHERE DEPTNO >=4 
低效:
SELECT * FROM EMP WHERE DEPTNO >3 
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
(24) 用UNION替换OR (适用于索引列)
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
  SELECT LOC_ID , LOC_DESC , REGION 
  FROM LOCATION 
  WHERE LOC_ID = 10 
  UNION 
  SELECT LOC_ID , LOC_DESC , REGION 
  FROM LOCATION 
  WHERE REGION = “MELBOURNE” 
低效:
  SELECT LOC_ID , LOC_DESC , REGION 
  FROM LOCATION 
  WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
(25) 用IN来替换OR
这是一条简单易记的规则,但是实际的执行效果还须检验,在ORACLE8i下,两者的执行路径似乎是相同的.
低效:
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30 
高效
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30); 
(26) 避免在索引列上使用IS NULL和IS NOT NULL
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 
高效: (索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;




(27) 总是使用索引的第一个列:
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引
28) 用UNION-ALL 替换UNION ( 如果有可能的话):
当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是要从业务需求分析使用UNION ALL的可行性. UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量
  低效:
  SELECT ACCT_NUM, BALANCE_AMT 
  FROM DEBIT_TRANSACTIONS 
  WHERE TRAN_DATE = '31-DEC-95' 
  UNION 
  SELECT ACCT_NUM, BALANCE_AMT 
  FROM DEBIT_TRANSACTIONS 
  WHERE TRAN_DATE = '31-DEC-95' 
  高效:
  SELECT ACCT_NUM, BALANCE_AMT 
  FROM DEBIT_TRANSACTIONS 
  WHERE TRAN_DATE = '31-DEC-95' 
  UNION ALL 
  SELECT ACCT_NUM, BALANCE_AMT 
  FROM DEBIT_TRANSACTIONS 
  WHERE TRAN_DATE = '31-DEC-95' 
(29) 用WHERE替代ORDER BY:
  ORDER BY 子句只在两种严格的条件下使用索引.
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
  ORDER BY中所有的列必须定义为非空.
  WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.
  例如:
  表DEPT包含以下列:
  DEPT_CODE PK NOT NULL 
  DEPT_DESC NOT NULL 
  DEPT_TYPE NULL 
  低效: (索引不被使用)
  SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE 
  高效: (使用索引)
  SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0 
(30) 避免改变索引列的类型.:
  当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
  假设 EMPNO是一个数值类型的索引列.
  SELECT … FROM EMP WHERE EMPNO = ‘123' 
  实际上,经过ORACLE类型转换, 语句转化为:
  SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 
  幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.
  现在,假设EMP_TYPE是一个字符类型的索引列.
  SELECT … FROM EMP WHERE EMP_TYPE = 123 
  这个语句被ORACLE转换为:
  SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型
(31) 需要当心的WHERE子句:
  某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
  在下面的例子里, (1)‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. (2) ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. (3) ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. (4)相同的索引列不能互相比较,这将会启用全表扫描.
(32) a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高.
  b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
(33) 避免使用耗费资源的操作:
  带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎
  执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强
(34) 优化GROUP BY:
  提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多.
  低效:
  SELECT JOB , AVG(SAL) 
  FROM EMP 
  GROUP by JOB 
  HAVING JOB = ‘PRESIDENT' 
  OR JOB = ‘MANAGER' 
  高效:
  SELECT JOB , AVG(SAL) 
  FROM EMP 
  WHERE JOB = ‘PRESIDENT' 
  OR JOB = ‘MANAGER' 
  GROUP by JOB 
 ---------------------------------------------------------------------------------

java.util包中就包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。

Java2的集合框架,抽其核心,主要有三种:List、Set和Map。

如下图所示:


法/步骤
  1. 集合类特性(几个常用类的区别)

    ArrayList: 元素单个,效率高,多用于查询  Vector: 元素单个,线程安全,多用于查询  LinkedList: 元素单个,多用于插入和删除  HashMap: 元素成对,元素可为空  HashTable: 元素成对,线程安全,元素不可为空

    WeakHashMap: 是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收

  2. Iterator 是什么

    一些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。

     

    Iterator与ListIterator有什么区别

    1. Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。  

    2. Iterator只能正向遍历集合,适用于获取移除元素。ListIerator继承Iterator,可以双向列表的遍历,同样支持元素的修改。比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

  3. Collection 和 Collections的区别

    Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

    List、Map、Set三个接口,存取元素时,各有什么特点

    List  以特定次序来持有元素,可有重复元素;

    Set  无法拥有重复元素,内部排序(无序);

    Map 保存key-value值,value可多值。

     

    HashMap和Hashtable的区别
  4. 都属于Map接口的类,实现了将惟一键映射到特定的值上。   

    一.历史原因:

    Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现  

    二.同步性:

    Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的  

    三.值:

     HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 

     Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。

    四.效率:

    Hashtable 比 HashMap 慢,因为它是同步的。

    怎样使HashMap同步

    HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。

  5. ArrayList和Vector的区别

    ArrayList与Vector主要从二方面来说.  

    一.同步性:

       Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。

    二.操作:

        由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。

    三.数据增长:

           ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。

           Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。

           Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。

    LinkedList与ArrayList有什么区别

    两者都实现的是List接口,不同之处在于:

    (1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。

    (2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端

    (3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据

    附加:

           LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

           注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

    List list = Collections.synchronizedList(new LinkedList(…));

  6. 数组(Array)和列表集合(ArrayList)有什么区别

    下面列出了Array和ArrayList的不同点: 

            Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

            Array大小是固定的,ArrayList的大小是动态变化的。 

            ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()  等等。

           对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

    Enumeration接口和Iterator接口的区别有哪些

           Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

  7. HashSet和TreeSet有什么区别 

     

    HashSet有以下特点:

    A. 无序(不能保证元素的排列顺序,顺序有可能发生变化)B. 不同步C. 允许空值(集合元素可以是null,可以放入多个null,但会自动覆盖)

    当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相 等注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

     

    TreeSet有以下特点:

    A. 有序

          1. TreeSet是由一个树形的结构来实现的(数据结构是二叉树),它里面元            素是有序的

          2.TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于           排序状 态,支持两种排序方式,自然排序和定制排序。其中自然排序为             默认的排序方式;定制排序,TreeSet中的对象元素需要实Comparable             接口

        TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以      也只能通过迭代器方法来获取

        二叉树:

              

    B. 不允许空值

     

          1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过            Set用的只是Map的key

          2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是              多 了一个有序性.

          3. TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所            以也只能通过迭代器方法来获取

          4. HashSet是基于hash算法实现的,性能优于TreeSet,通常使用                        HashSet。在我们需要对其中元素排序的时候才使用TreeSet。


  8. HashMap,LinkedMap,TreeMap的区别

    HashMap,LinkedHashMap,TreeMap都属于Map。

    LinkedHashMap是HashMap的子类。

    Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复

     

    1.HashMap的内部结构是一个数组,线性顺序存储,二次结构使用线性的单链表。使用key的hashCode做二次hash之后,再截取小于数组长度的值为索引值。key可以为null,存在索引为0的位置上。由于使用了数组,所以有一个负载因子loadFactor的概念(临界阈值threshold)和resize。resize比较耗时,冲突时链式遍历查找也比较耗时,所以选定一个合适的初始容易比较重要。存取性能都较高。迭代遍历时一维使用数组,二维使用链表。

              HashMap            是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直              接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的            键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任             一 时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如             果需要同步,可以用 Collections的synchronizedMap方法使HashMap           具有同步的能力。

    2.LinkedHashMap是HashMap的子类。内部结构是一个数组,线性顺序存储,二次结构使用线性的单链表,但同时内部维护了一个双向循环链表,可以保持顺序。access-order=false默认为使用新增存储顺序,access-order=true则指定使用读取和访问顺序。removeEldestEntry=false(当指定为true时,就是实现LRU算法的缓存容器,当然要指定淘汰时的使用频率和容量上限,其实是一个最近最少使用-->最近使用access-order=true/最新存储access-order=false)。存取性能较HashMap差-些,但相差不大。header.after为尾方向,header.before为首方向。迭代遍历时entrySet().iterator()跟HashMap一样(有点困惑,为什么不按线性顺序进行迭代,只能重写entrySet(),keySet()和values()方法)。适用于有缓存设计需求的情况(需继承)。 3.TreeMap的内部结构是一棵红黑树(又叫排序数,是二叉树的一种),使用链式存储,可以指定比较器Comparator,key需实现Comparable接口。key不能为null。存结点性能稍差,因为需要调整树结构;取结点用的是链表遍历,但是属于有序比较,性能中等。迭代遍历时用的树的中序遍历,是一个有序序列。适用于有排序需求的情况。

     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值