<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>robustwang</title>
    <description></description>
    <link>http://robustwang.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>详细讲解在Spring中进行集成测试</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/222927" style="color:red;">http://robustwang.javaeye.com/blog/222927</a>&nbsp;
          发表时间: 2008年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          让测试方法自动拥有回滚能力<br /><br />AbstractTransactionalSpringContextTests专为解决以上问题而生，也就是说前面我们所提及的第3)个问题在此得到了回答。只要继承该类创建测试用例，在默认情况下，测试方法中所包含的事务性数据操作都会在测试方法返回前被回滚。由于事务回滚操作发生在测试方法返回前的点上，所以你可以象往常一样在测试方法体中对数据操作的正确性进行校验。 代码清单 6 UserServiceIntegrateTest：<br />package com.baobaotao.service;<br />import org.springframework.test.AbstractTransactionalSpringContextTests;<br />import com.baobaotao.domain.User;<br />public class UserServiceIntegrateTest extends AbstractTransactionalSpringContextTests {<br />private UserService userService;<br />public void setUserService(UserService userService) {<br />this.userService = userService;<br />}<br />@Override<br />protected String[] getConfigLocations() {<br />return new String[]{"baobaotao-service.xml", "baobaotao-dao.xml"};<br />}<br />public void testRegisterUser(){ ①测试方法中的数据操作将在方法返回前被回滚，不会对数据库<br />User user = new User(); 产生永久性数据操作，第二次运行该测试方法时，依旧可以<br />user.setUserId(2); 成功运行。<br />user.setUserName("john");<br />user.setPassword("123456");<br />userService.registerUser(user);<br />User user1 = userService.findUserByUserName("john"); ②对数据操作进行<br />assertEquals(user.getUserId(), user1.getUserId()); 正确性检验<br />}<br />} <br /><br />如果testRegisterUser()是直接继承于AbstractDependencyInjectionSpringContextTests类的测试方法，则重复运行该测试方法就会发生数据冲突问题。但因为它位于继承于AbstractTransactionalSpringContextTests的测试用例类中，测试方法中对数据库的操作会被正确回滚，所以重复运行不会有任何问题。 <br /><br />如果你确实希望测试方法中对数据库的操作持久生效而不是被回滚，Spring也可以满足你的要求，你仅需要在测试方法中添加setComplete()方法就可以了。 <br /><br />public void testRegisterUser(){<br />…<br />User user1 = userService.findUserByUserName("john");<br />assertEquals(user.getUserId(), user1.getUserId());<br />setComplete(); ①测试方法中的事务性数据操作将被提交<br />} <br /><br />AbstractTransactionalSpringContextTests还拥有几个可用于初始化测试数据库，并在测试完成后清除测试数据的方法，分别介绍如下： <br /> onSetUpBeforeTransaction()/onTearDownAfterTransaction()：子类可以覆盖这两个方法，以便在事务性测试方法运行的前后执行一些数据库初始化的操作并在事务完成后清除之； <br /><br /> onSetUpInTransaction()/onTearDownInTransaction()：这对方法和前面介绍的方法完成相同的功能，只不过它们是在测试方法的相同事务中执行的。 <br /><br />AbstractTransactionalSpringContextTests另外还提供了一组用于测试延迟数据加载的方法：endTransaction()/startNewTransaction()。我在测试Hibernate、JPA等允许延迟数据加载的应用时，如何模拟数据在Service层事务中被部分加载，当传递到Web层时重新打开事务完成延迟部分数据加载的测试场景呢？这两个方法即为此用途而生：你可以在测试方法中显式调用endTransaction()方法以模拟从Service层中获取部分数据后返回，尔后，再通过startNewTransaction()开启一个和原事务无关新事务——模拟在Web层中重新打开事务，接下来你就可以访问延迟加载的数据，看是否一切如期所料了。 <br /><br />在代码清单 6的②处，我们通过UserService#findUserByUserName()方法对前面registerUser(user)方法数据操作的正确性进行检验。应该说，我们非常幸运，因为在UserService中刚好存在一个可用于检测registerUser(user)数据操作正确性的方法。让我们考虑另外的一种情况：要是 UserService不存在这样的方法，我们该如何检测registerUser(user)数据操作结果的正确性呢？显然我们不能使用肉眼观察的方法，那难道为了验证数据操作正确性专门编写一个配合性的数据访问类不成？<br /><br />通过JDBC访问数据库，检测数据操作正确性 <br /><br />正当我们“山重水复疑无路”的时候，让我们再往前走上一程，柳暗花明将倏忽而至 <br />——AbstractTransactionalDataSourceSpringContextTests就是花开景明之所。该类继承于AbstractTransactionalSpringContextTests，它添加了一个JdbcTemplate，你可以借由此道快意直达数据库。它自动使用Spring容器中的数据源（DataSource）创建好一个JdbcTemplate实例并开放给子类使用。值得注意的是，如果你采用byName自动装配机制，数据源Bean的名称必须取名为“dataSource”。 <br /><br />让我们对UserServiceIntegrateTest进行改造，以便让其自动拥有访问数据库的设施（JdbcTemplate），并用灵活的方法访问数据库进行数据操作的检验，其代码如下所示： <br /><br />代码清单 7 UserServiceIntegrateWithJdbcTest<br />package com.baobaotao.service;<br />import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;<br />…<br />public class UserServiceIntegrateWithJdbcTest<br />extends AbstractTransactionalDataSourceSpringContextTests {①注意：继承类发生调整<br />private UserService userService;<br />public void setUserService(UserService userService) {<br />this.userService = userService;<br />}<br />@Override<br />protected String[] getConfigLocations() {<br />return new String[]{"baobaotao-service.xml", "baobaotao-dao.xml"};<br />}<br />public void testRegisterUser(){<br />User user = new User();<br />user.setUserId(2);<br />user.setUserName("john");<br />user.setPassword("123456");<br />userService.registerUser(user);<br />String sqlStr = " SELECT user_id FROM t_user WHERE user_name ='john' ";<br />int userId = jdbcTemplate.queryForInt(sqlStr); ①可以直接使用JdbcTemplate访问数据库了<br />assertEquals(user.getUserId(), userId);<br />setComplete();<br />}<br />}<br /><br />jdbcTemplate是AbstractTransactionalDataSourceSpringContextTests类中定义的，子类可以直接使用它访问数据库。这样我们就可以灵活地访问数据库以检验目标测试方法的数据操作正确性。至此，我们终于毕其功于一役于AbstractTransactionalDataSourceSpringContextTests，顺利解决前面我们中指出的最后问题。 <br /><br />只要你通过扩展AbstractTransactionalSpringContextTests及其子类创建测试用例，所有测试方法都会工作了事务环境下。也就是说，即使某些测试方法不需要访问数据库，也会产生额外的事务管理开销，是否可以对测试方法启用事务管理的行为进行控制呢？此外，在一些情况下，除对目标方法逻辑运行的正确性进行检验外，我们还希望对目标方法的运行性能进行测试：如当目标方法运行时间超过200毫秒时，则测试用例视为未通过。诸如此类的问题，我们目前学习到的知识还不能很好的应付。Spring 2.0新增了注解驱动的测试工具为我们指明了道路，你仅需要通过简单为测试方法标注注解，我们刚才提出的“疑难”问题就可以迎刃而解了。<br /><br />小结 <br /><br />本文我们讲述了使用Spring提供的一套测试工具对Spring应用程序进行集成测试所需的所有知识。 <br />Spring建议你不应该在单元测试时使用到Spring容器，你应该在集成测试时才使用到Spring容器。手工创建测试固件或者手工装配测试固件的工作都是单调乏味没有创意的工作，通过使用Spring为集成测试提供了帮助类，你就可以享受测试固件自动装配的好处，将精力集中到目标类逻辑测试编写的工作上。 <br /><br />应该说大部分的Java应用都是Web应用，而大部分的Java Web应用都是数据库相关的应用，对数据库应用进行测试经常要考虑数据准备、数据库现场恢复、灵活访问数据以验证数据操作正确性等等的问题。这些问题如果没有一个很好的支持工具，将给编写测试用例造成挑战，幸好Spring都为我们搭建好满足这些需求的测试平台，你仅需要在此基础上编写特定的测试用例就可以了。 <br /><br />1
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/222927#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Aug 2008 18:01:58 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/222927</link>
        <guid>http://robustwang.javaeye.com/blog/222927</guid>
      </item>
          <item>
        <title>Hibernate 与 Spring 多数据源的配置 </title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/214581" style="color:red;">http://robustwang.javaeye.com/blog/214581</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spring2.0.1以后的版本已经支持配置多数据源，并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源，每个数据源的表结构都是相同的，所以要求数据源的变动对于编码人员来说是透明，也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下： <br />一、首先需要写一个静态的键值对照类：<br /><br /><br />代码<br />package cn.com.xinli.ccp.dynamicds;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />public class DataSourceMap {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static final String Admin="Admin";&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static final String Yxh = "Yxh";&nbsp;&nbsp;&nbsp; <br />}&nbsp; <br /><br /><br /><br />这个类主要在使用的时候当作获得数据源的标志使用。 <br />二、建立一个获得和设置上下文的类： <br /><br /><br />代码<br />package cn.com.xinli.ccp.dynamicds;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />public class CustomerContextHolder {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; private static final ThreadLocal contextHolder =&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ThreadLocal();&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static void setCustomerType(String customerType) {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contextHolder.set(customerType);&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static String getCustomerType() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String) contextHolder.get();&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public static void clearCustomerType() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contextHolder.remove();&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />}&nbsp; <br /><br />这个主要负责设置上下文环境和获得上下文环境。 <br />三、建立动态数据源类，这个类必须继承AbstractRoutingDataSource： <br /><br />代码<br />package cn.com.xinli.ccp.dynamicds;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />public class DynamicDataSource extends AbstractRoutingDataSource {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; protected Object determineCurrentLookupKey() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CustomerContextHolder.getCustomerType();&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />}&nbsp; <br /><br />这个类实现了determineCurrentLookupKey方法，该方法返回一个Object，一般是返回字符串，也可以是枚举类型。该方法中直接使用了CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。 <br />四、编写spring的配置文件配置数据源 <br /><br />代码<br />&lt;bean id="parentDataSource"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.jdbc.datasource.DriverManagerDataSource">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>COM.ibm.db2.jdbc.net.DB2Driver&lt;/value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="url">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>jdbc:db2:127.0.0.1:TEST&lt;/value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;bean id="adminDataSource" parent="parentDataSource">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username" value="admin"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="master997mb"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;bean id="yxhDataSource" parent="parentDataSource">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username" value="yxh"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="yxh"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp; <br /><br />在这个配置中可以看到首先有个parentDataSource，这个主要配置一些数据源的公用信息，项目中都是链接DB2数据库；adminDataSource和yxhDataSource是根据不同需要配置的个性化信息，但都必须加parent属性，值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库，那么parentDataSource就可以不要了，直接配置两个不同的数据源链接就可以了。 <br />五、编写spring配置文件配置多数据源映射关系 <br /><br />代码<br />&lt;bean id="dataSource" class="cn.com.xinli.ccp.dynamicds.DynamicDataSource">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="targetDataSources">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map key-type="java.lang.String">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;entry key="Yxh" value-ref="yxhDataSource"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="defaultTargetDataSource" ref="adminDataSource"/>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp; <br /><br />在这个配置中第一个property属性配置目标数据源，&lt;map key-type="java.lang.String">中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相同；&lt;entry key="Yxh" value-ref="yxhDataSource"/>中key的值必须要和静态键值对照类中的值相同，如果有多个值，可以配置多个&lt;entry>标签。第二个property属性配置默认的数据源。 <br />六、配置hibernate。 <br />Hibernate的配置和普通的hibernate、spring结合的配置一样 <br /><br />代码<br />&lt;bean id="sessionFactory"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- to override, use the "SpringDatasourceConfig" snippet in your project -->&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dataSource">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="dataSource" />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="mappingResources">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cn/com/xinli/ccp/entity/User.hbm.xml&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cn/com/xinli/ccp/entity/Test.hbm.xml&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/value>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernateProperties">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.hibernate.dialect.DB2Dialect&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql">true&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.use_outer_join">true&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.batch_size">50&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.fetch_size">5&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.connection.pool_size">2&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.connection.autocommit">false&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.cache.use_query_cache">false&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.max_fetch_depth">1&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.bytecode.use_reflection_optimizer">true&lt;/prop>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&lt;bean id="mydao" class="cn.com.xinli.ccp.dao.HibernateBaseDao">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory">&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory" />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property>&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;/bean>&nbsp; <br /><br />关于dao的代码这里就省略了。 <br />七、配置结束，可以使用了。 <br /><br />代码<br />public class DaoTest extends TestCase {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; public void testSave() throws Exception{&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerContextHolder.setCustomerType(DataSourceMap.Admin);//设置数据源&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //hibernate创建实体&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test test = new Test();&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test.setTest("22222222");&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mydao.save(test);//使用dao保存实体&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerContextHolder.setCustomerType(DataSourceMap.Yxh);//设置为另一个数据源&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mydao.save(test);//使用dao保存实体到另一个库中&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />}&nbsp; <br />在项目中对于编码人员对多数据源的切换可以做成透明的，操作同样的dao，就可以访问不同的数据库了
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/214581#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 15:12:41 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/214581</link>
        <guid>http://robustwang.javaeye.com/blog/214581</guid>
      </item>
          <item>
        <title>镇保介绍</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/212639" style="color:red;">http://robustwang.javaeye.com/blog/212639</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          小城镇社会保险（简称镇保）是上海市政府在普通社会保险（下称城保）的基础上推出的一项差异化社会保险方案，主要针对上海郊区注册的用人单位选择使用。让求职者措手不及的是，镇保的对象是注册地在郊区的单位，而并非办公室在郊区。过去在郊区注册企业往往有各项优惠，因此很多单位的注册地都在郊区，所以可以实施镇保的单位不在少数。求职者在面试时没有问及此事的话，很容易“吃药”。 <br />　　 <br />&nbsp;&nbsp;&nbsp; 镇保与城保的缴费比例是不一样的。镇保个人不缴费，单位按照上年度全市职工月平均工资的60%缴纳24.5%（养老保17%，医疗5%，失业2%，生育0.5%）加工伤（0.5~3%浮动）；城保个人需要缴纳11%（养老8%，医疗2%，失业1%），单位缴纳36.5%（养老22%，医疗12%，失业2%，生育0.5%）加工伤（0.5~3%浮动）。单从数字上比较，镇保对于单位和个人的负担都比城保要低。 <br />　　 <br />&nbsp;&nbsp;&nbsp; 以你的工资基数3500元计算，按城保方案，你的工资要扣掉385元社保费，公司缴纳1295元社保费（工伤暂以0.5%计算）；而按照镇保，你的工资不必扣任何费用，公司缴纳369.5元（工伤暂以0.5%计算）。两者累计缴费差距高达：1310.5元，几乎达到城保缴费的78%。 <br />　　 <br />&nbsp;&nbsp;&nbsp; 那是否你就吃亏了78%了呢？其实不然。城保的缴纳费用只有个人缴纳部分可以计入自己的养老保险账户（上海实施单位缴纳部分中3%划归个人账户，所以个人养老可记11%，但这一制度在社保案后不知道能继续多久，具体请看每年的社保结算单），公司缴纳部分大多作为社保基金统筹以弥补现在退休人员的养老金发放缺口。按照上海市的养老保险办法，你的月养老金就是你自己养老保险账户储存额÷120。举例你缴纳15年，缴纳基数一直不变，退休时每月养老金约577元（按11%计算，不考虑账户收益）。 <br />　　 <br />&nbsp;&nbsp;&nbsp; 根据镇保养老金发放的规定：“缴费年限满15年的，养老金按其办理手续时上年度全市职工月平均工资的20%计发，缴费年限每增加1年，相应增加上年度全市职工月平均工资的0.5%的养老金，但最高不超过上年度全市职工月平均工资的30%。”以今年为例，2006年的全市职工月平均工资为2464元，其20%为492.8元（这一数字不具参考性，因为你退休后社会平均工资必然比这高很多）。所以长久来看，城保和镇保的养老金差距可能不明显。 <br />　　 <br />&nbsp;&nbsp;&nbsp; 城保和镇保的比较是复杂的，而且其中的政策也很多变，加上现在社保问题比较敏感，个人去预料将来的发展是不现实的。如果你认为这对你来说是重要的，那再将来的求职中可以在例行的提问中向单位询问这一待遇，以满足自己的要求。（
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/212639#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jul 2008 10:52:39 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/212639</link>
        <guid>http://robustwang.javaeye.com/blog/212639</guid>
      </item>
          <item>
        <title>ORACLE函数大全 </title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/212025" style="color:red;">http://robustwang.javaeye.com/blog/212025</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ORACLE函数大全 <br />________________________________________<br />作者：[本站编辑] 来源：[CSDN] 浏览：[ ]<br /><br /><br /><br /> <br />SQL中的单记录函数<br />1.ASCII<br />返回与指定的字符对应的十进制数;<br />SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;<br />A A ZERO SPACE<br />--------- --------- --------- ---------<br />65 97 48 32<br />2.CHR<br />给出整数,返回对应的字符;<br />SQL> select chr(54740) zhao,chr(65) chr65 from dual;<br />ZH C<br />-- -<br />赵 A<br />3.CONCAT<br />连接两个字符串;<br />SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;<br />高乾竞电话<br />----------------<br />010-88888888转23<br />4.INITCAP<br />返回字符串并将字符串的第一个字母变为大写;<br />SQL> select initcap('smith') upp from dual;<br />UPP<br />-----<br />Smith<br />5.INSTR(C1,C2,I,J)<br />在一个字符串中搜索指定的字符,返回发现指定的字符的位置;<br />C1 被搜索的字符串<br />C2 希望搜索的字符串<br />I 搜索的开始位置,默认为1<br />J 出现的位置,默认为1<br />SQL> select instr('oracle traning','ra',1,2) instring from dual;<br />INSTRING<br />---------<br />9<br />6.LENGTH<br />返回字符串的长度;<br />SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;<br />NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))<br />------ ------------ ---------------- ------------ --------- --------------------<br />高乾竞 3 北京市海锭区 6 9999.99 7<br />7.LOWER<br />返回字符串,并将所有的字符小写<br />SQL> select lower('AaBbCcDd')AaBbCcDd from dual;<br />AABBCCDD<br />--------<br />aabbccdd<br />8.UPPER<br />返回字符串,并将所有的字符大写<br />SQL> select upper('AaBbCcDd') upper from dual;<br />UPPER<br />--------<br />AABBCCDD<br />9.RPAD和LPAD(粘贴字符)<br />RPAD 在列的右边粘贴字符<br />LPAD 在列的左边粘贴字符<br />SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;<br />LPAD(RPAD('GAO',1<br />-----------------<br />*******gao*******<br />不够字符则用*来填满<br />10.LTRIM和RTRIM<br />LTRIM 删除左边出现的字符串<br />RTRIM 删除右边出现的字符串<br />SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;<br />LTRIM(RTRIM('<br />-------------<br />gao qian jing<br />11.SUBSTR(string,start,count)<br />取子字符串,从start开始,取count个<br />SQL> select substr('13088888888',3,8) from dual;<br />SUBSTR('<br />--------<br />08888888<br />12.REPLACE('string','s1','s2')<br />string 希望被替换的字符或变量 <br />s1 被替换的字符串<br />s2 要替换的字符串<br />SQL> select replace('he love you','he','i') from dual;<br />REPLACE('H<br />----------<br />i love you<br />13.SOUNDEX<br />返回一个与给定的字符串读音相同的字符串<br />SQL> create table table1(xm varchar(8));<br />SQL> insert into table1 values('weather');<br />SQL> insert into table1 values('wether');<br />SQL> insert into table1 values('gao');<br />SQL> select xm from table1 where soundex(xm)=soundex('weather');<br />XM<br />--------<br />weather<br />wether<br />14.TRIM('s' from 'string')<br />LEADING 剪掉前面的字符<br />TRAILING 剪掉后面的字符<br />如果不指定,默认为空格符 <br />15.ABS<br />返回指定值的绝对值<br />SQL> select abs(100),abs(-100) from dual;<br />ABS(100) ABS(-100)<br />--------- ---------<br />100 100<br />16.ACOS<br />给出反余弦的值<br />SQL> select acos(-1) from dual;<br />ACOS(-1)<br />---------<br />3.1415927<br />17.ASIN<br />给出反正弦的值<br />SQL> select asin(0.5) from dual;<br />ASIN(0.5)<br />---------<br />.52359878<br />18.ATAN<br />返回一个数字的反正切值<br />SQL> select atan(1) from dual;<br />ATAN(1)<br />---------<br />.78539816<br />19.CEIL<br />返回大于或等于给出数字的最小整数<br />SQL> select ceil(3.1415927) from dual;<br />CEIL(3.1415927)<br />---------------<br />4<br />20.COS<br />返回一个给定数字的余弦<br />SQL> select cos(-3.1415927) from dual;<br />COS(-3.1415927)<br />---------------<br />-1<br />21.COSH<br />返回一个数字反余弦值<br />SQL> select cosh(20) from dual;<br />COSH(20)<br />---------<br />242582598<br />22.EXP<br />返回一个数字e的n次方根<br />SQL> select exp(2),exp(1) from dual;<br />EXP(2) EXP(1)<br />--------- ---------<br />7.3890561 2.7182818<br />23.FLOOR<br />对给定的数字取整数<br />SQL> select floor(2345.67) from dual;<br />FLOOR(2345.67)<br />--------------<br />2345<br />24.LN<br />返回一个数字的对数值<br />SQL> select ln(1),ln(2),ln(2.7182818) from dual;<br />LN(1) LN(2) LN(2.7182818)<br />--------- --------- -------------<br />0 .69314718 .99999999<br />25.LOG(n1,n2)<br />返回一个以n1为底n2的对数 <br />SQL> select log(2,1),log(2,4) from dual;<br />LOG(2,1) LOG(2,4)<br />--------- ---------<br />0 2<br />26.MOD(n1,n2)<br />返回一个n1除以n2的余数<br />SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;<br />MOD(10,3) MOD(3,3) MOD(2,3)<br />--------- --------- ---------<br />1 0 2<br />27.POWER<br />返回n1的n2次方根<br />SQL> select power(2,10),power(3,3) from dual;<br />POWER(2,10) POWER(3,3)<br />----------- ----------<br />1024 27<br />28.ROUND和TRUNC<br />按照指定的精度进行舍入<br />SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;<br />ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)<br />----------- ------------ ----------- ------------<br />56 -55 55 -55<br />29.SIGN<br />取数字n的符号,大于0返回1,小于0返回-1,等于0返回0<br />SQL> select sign(123),sign(-100),sign(0) from dual;<br />SIGN(123) SIGN(-100) SIGN(0)<br />--------- ---------- ---------<br />1 -1 0<br />30.SIN<br />返回一个数字的正弦值<br />SQL> select sin(1.57079) from dual;<br />SIN(1.57079)<br />------------<br />1<br />31.SIGH<br />返回双曲正弦的值<br />SQL> select sin(20),sinh(20) from dual;<br />SIN(20) SINH(20)<br />--------- ---------<br />.91294525 242582598<br />32.SQRT<br />返回数字n的根<br />SQL> select sqrt(64),sqrt(10) from dual;<br />SQRT(64) SQRT(10)<br />--------- ---------<br />8 3.1622777<br />33.TAN<br />返回数字的正切值<br />SQL> select tan(20),tan(10) from dual;<br />TAN(20) TAN(10)<br />--------- ---------<br />2.2371609 .64836083<br />34.TANH<br />返回数字n的双曲正切值<br />SQL> select tanh(20),tan(20) from dual;<br />TANH(20) TAN(20)<br />--------- ---------<br />1 2.2371609<br />35.TRUNC<br />按照指定的精度截取一个数<br />SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;<br />TRUNC1 TRUNC(124.16666,2)<br />--------- ------------------<br />100 124.16<br />36.ADD_MONTHS<br />增加或减去月份<br />SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;<br />TO_CHA<br />------<br />200002<br />SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;<br />TO_CHA<br />------<br />199910<br />37.LAST_DAY<br />返回日期的最后一天<br />SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;<br />TO_CHAR(SY TO_CHAR((S<br />---------- ----------<br />2004.05.09 2004.05.10<br />SQL> select last_day(sysdate) from dual;<br />LAST_DAY(S<br />----------<br />31-5月 -04<br />38.MONTHS_BETWEEN(date2,date1)<br />给出date2-date1的月份<br />SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;<br />MON_BETWEEN<br />-----------<br />9<br />SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;<br />MON_BETW<br />---------<br />-60<br />39.NEW_TIME(date,'this','that')<br />给出在this时区=other时区的日期和时间<br />SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time<br />2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;<br />BJ_TIME LOS_ANGLES<br />------------------- -------------------<br />2004.05.09 11:05:32 2004.05.09 18:05:32<br />40.NEXT_DAY(date,'day')<br />给出日期date和星期x之后计算下一个星期的日期<br />SQL> select next_day('18-5月-2001','星期五') next_day from dual;<br />NEXT_DAY<br />----------<br />25-5月 -01<br />41.SYSDATE<br />用来得到系统的当前日期<br />SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;<br />TO_CHAR(SYSDATE,'<br />-----------------<br />09-05-2004 星期日<br />trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒<br />SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,<br />2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;<br />HH HHMM<br />------------------- -------------------<br />2004.05.09 11:00:00 2004.05.09 11:17:00<br />42.CHARTOROWID<br />将字符数据类型转换为ROWID类型<br />SQL> select rowid,rowidtochar(rowid),ename from scott.emp;<br />ROWID ROWIDTOCHAR(ROWID) ENAME<br />------------------ ------------------ ----------<br />AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH<br />AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN<br />AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD<br />AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES<br />43.CONVERT(c,dset,sset)<br />将源字符串 sset从一个语言字符集转换到另一个目的dset字符集<br />SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;<br />conver<br />------<br />strutz<br />44.HEXTORAW<br />将一个十六进制构成的字符串转换为二进制<br />45.RAWTOHEXT<br />将一个二进制构成的字符串转换为十六进制<br />46.ROWIDTOCHAR<br />将ROWID数据类型转换为字符类型<br />47.TO_CHAR(date,'format')<br />SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;<br />TO_CHAR(SYSDATE,'YY<br />-------------------<br />2004/05/09 21:14:41<br />48.TO_DATE(string,'format')<br />将字符串转化为ORACLE中的一个日期<br />49.TO_MULTI_BYTE<br />将字符串中的单字节字符转化为多字节字符<br />SQL> select to_multi_byte('高') from dual;<br />TO<br />--<br />高<br />50.TO_NUMBER<br />将给出的字符转换为数字<br />SQL> select to_number('1999') year from dual;<br />YEAR<br />---------<br />1999<br />51.BFILENAME(dir,file)<br />指定一个外部二进制文件<br />SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));<br />52.CONVERT('x','desc','source')<br />将x字段或变量的源source转换为desc<br />SQL> select sid,serial#,username,decode(command,<br />2 0,'none',<br />3 2,'insert',<br />4 3,<br />5 'select',<br />6 6,'update',<br />7 7,'delete',<br />8 8,'drop',<br />9 'other') cmd from v$session where type!='background';<br />SID SERIAL# USERNAME CMD<br />--------- --------- ------------------------------ ------<br />1 1 none<br />2 1 none<br />3 1 none<br />4 1 none<br />5 1 none<br />6 1 none<br />7 1275 none<br />8 1275 none<br />9 20 GAO select<br />10 40 GAO none<br />53.DUMP(s,fmt,start,length)<br />DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值<br />SQL> col global_name for a30<br />SQL> col dump_string for a50<br />SQL> set lin 200<br />SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;<br />GLOBAL_NAME DUMP_STRING<br />------------------------------ --------------------------------------------------<br />ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D<br />54.EMPTY_BLOB()和EMPTY_CLOB()<br />这两个函数都是用来对大数据类型字段进行初始化操作的函数<br />55.GREATEST<br />返回一组表达式中的最大值,即比较字符的编码大小.<br />SQL> select greatest('AA','AB','AC') from dual;<br />GR<br />--<br />AC<br />SQL> select greatest('啊','安','天') from dual;<br />GR<br />--<br />天<br />56.LEAST<br />返回一组表达式中的最小值 <br />SQL> select least('啊','安','天') from dual;<br />LE<br />--<br />啊<br />57.UID<br />返回标识当前用户的唯一整数<br />SQL> show user<br />USER 为"GAO"<br />SQL> select username,user_id from dba_users where user_id=uid;<br />USERNAME USER_ID<br />------------------------------ ---------<br />GAO 25<br />58.USER<br />返回当前用户的名字<br />SQL> select user from dual;<br />USER<br />------------------------------<br />GAO<br />59.USEREVN<br />返回当前用户环境的信息,opt可以是:<br />ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE<br />ISDBA 查看当前用户是否是DBA如果是则返回true<br />SQL> select userenv('isdba') from dual;<br />USEREN<br />------<br />FALSE<br />SQL> select userenv('isdba') from dual;<br />USEREN<br />------<br />TRUE<br />SESSION<br />返回会话标志<br />SQL> select userenv('sessionid') from dual;<br />USERENV('SESSIONID')<br />--------------------<br />152<br />ENTRYID<br />返回会话人口标志<br />SQL> select userenv('entryid') from dual;<br />USERENV('ENTRYID')<br />------------------<br />0<br />INSTANCE<br />返回当前INSTANCE的标志<br />SQL> select userenv('instance') from dual;<br />USERENV('INSTANCE')<br />-------------------<br />1<br />LANGUAGE<br />返回当前环境变量<br />SQL> select userenv('language') from dual;<br />USERENV('LANGUAGE')<br />----------------------------------------------------<br />SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br />LANG<br />返回当前环境的语言的缩写<br />SQL> select userenv('lang') from dual;<br />USERENV('LANG')<br />----------------------------------------------------<br />ZHS<br />TERMINAL<br />返回用户的终端或机器的标志<br />SQL> select userenv('terminal') from dual;<br />USERENV('TERMINA<br />----------------<br />GAO<br />VSIZE(X)<br />返回X的大小(字节)数<br />SQL> select vsize(user),user from dual;<br />VSIZE(USER) USER<br />----------- ------------------------------<br />6 SYSTEM<br />60.AVG(DISTINCT|ALL)<br />all表示对所有的值求平均值,distinct只对不同的值求平均值<br />SQLWKS> create table table3(xm varchar(8),sal number(7,2));<br />语句已处理。<br />SQLWKS> insert into table3 values('gao',1111.11);<br />SQLWKS> insert into table3 values('gao',1111.11);<br />SQLWKS> insert into table3 values('zhu',5555.55);<br />SQLWKS> commit;<br />SQL> select avg(distinct sal) from gao.table3;<br />AVG(DISTINCTSAL)<br />----------------<br />3333.33<br />SQL> select avg(all sal) from gao.table3;<br />AVG(ALLSAL)<br />-----------<br />2592.59<br />61.MAX(DISTINCT|ALL)<br />求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次<br />SQL> select max(distinct sal) from scott.emp;<br />MAX(DISTINCTSAL)<br />----------------<br />5000<br />62.MIN(DISTINCT|ALL)<br />求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次<br />SQL> select min(all sal) from gao.table3;<br />MIN(ALLSAL)<br />-----------<br />1111.11<br />63.STDDEV(distinct|all)<br />求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差<br />SQL> select stddev(sal) from scott.emp;<br />STDDEV(SAL)<br />-----------<br />1182.5032<br />SQL> select stddev(distinct sal) from scott.emp;<br />STDDEV(DISTINCTSAL)<br />-------------------<br />1229.951<br />64.VARIANCE(DISTINCT|ALL)<br />求协方差 <br />SQL> select variance(sal) from scott.emp;<br />VARIANCE(SAL)<br />-------------<br />1398313.9<br />65.GROUP BY<br />主要用来对一组数进行统计<br />SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;<br />DEPTNO COUNT(*) SUM(SAL)<br />--------- --------- ---------<br />10 3 8750<br />20 5 10875<br />30 6 9400<br />66.HAVING<br />对分组统计再加限制条件<br />SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;<br />DEPTNO COUNT(*) SUM(SAL)<br />--------- --------- ---------<br />20 5 10875<br />30 6 9400<br />SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;<br />DEPTNO COUNT(*) SUM(SAL)<br />--------- --------- ---------<br />20 5 10875<br />30 6 9400<br />67.ORDER BY<br />用于对查询到的结果进行排序输出<br />SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;<br />DEPTNO ENAME SAL<br />--------- ---------- ---------<br />10 KING 5000<br />10 CLARK 2450<br />10 MILLER 1300<br />20 SCOTT 3000<br />20 FORD 3000<br />20 JONES 2975<br />20 ADAMS 1100<br />20 SMITH 800<br />30 BLAKE 2850<br />30 ALLEN 1600<br />30 TURNER 1500<br />30 WARD 1250<br />30 MARTIN 1250<br />30 JAMES 950
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/212025#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 13:50:26 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/212025</link>
        <guid>http://robustwang.javaeye.com/blog/212025</guid>
      </item>
          <item>
        <title>Spring配置总结 </title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/210678" style="color:red;">http://robustwang.javaeye.com/blog/210678</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          web.xml<br />载入Log4j配置<br />&lt;context-param>&lt;!--Log4j配置 在同一容器中部署多个应用不能使用默认的webAppRootKey,必须指定唯一KEY,以免冲突--><br />&nbsp;&nbsp;&nbsp; &lt;param-name>webAppRootKey&lt;/param-name><br />&nbsp;&nbsp;&nbsp; &lt;param-value>itservice.root&lt;/param-value><br />&nbsp;&nbsp;&nbsp; &lt;!--在log4j.properties中设置日志路径log4j.appender.file.File=${itservice.root}/WEB-INF/itservice.log--><br />&lt;/context-param><br />&lt;context-param><br />&nbsp;&nbsp;&nbsp; &lt;param-name>log4jConfigLocation&lt;/param-name><br />&nbsp;&nbsp;&nbsp; &lt;param-value>/WEB-INF/classes/log4j.properties&lt;/param-value><br />&lt;/context-param><br />&lt;listener><br />&nbsp;&nbsp;&nbsp; &lt;listener-class>org.springframework.web.util.Log4jConfigListener&lt;/listener-class><br />&lt;/listener><br /><br /><br /><br />&nbsp; 载入Spring配置文件<br />&lt;context-param><br />&nbsp;&nbsp;&nbsp; &lt;param-name>contextConfigLocation&lt;/param-name><br />&nbsp;&nbsp;&nbsp; &lt;param-value>/WEB-INF/classes/applicationContext.xml&lt;/param-value><br />&nbsp;&nbsp;&nbsp; &lt;!--可载入多个配置文件分隔符 , ;&nbsp; \t \n --><br />&nbsp; &lt;/context-param><br />&nbsp; &lt;listener><br />&nbsp;&nbsp;&nbsp; &lt;listener-class>org.springframework.web.context.ContextLoaderListener&lt;/listener-class><br />&nbsp; &lt;/listener><br /><br /><br /><br />&nbsp; 字符编码过滤器<br />&lt;filter><br />&nbsp;&nbsp;&nbsp; &lt;filter-name>encodingFilter&lt;/filter-name><br />&nbsp;&nbsp;&nbsp; &lt;filter-class>org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class><br />&nbsp;&nbsp;&nbsp; &lt;init-param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>encoding&lt;/param-name><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>UTF-8&lt;/param-value><br />&nbsp;&nbsp;&nbsp; &lt;/init-param><br />&nbsp; &lt;/filter><br /> &lt;filter-mapping><br />&nbsp;&nbsp;&nbsp; &lt;filter-name>encodingFilter&lt;/filter-name><br />&nbsp;&nbsp;&nbsp; &lt;url-pattern>/*&lt;/url-pattern><br />&nbsp; &lt;/filter-mapping><br />&nbsp; &lt;filter-mapping><br /><br /><br /><br />配置延迟加载时使用OpenSessionInView<br />&lt;filter><br />&nbsp;&nbsp;&nbsp; &lt;filter-name>openSessionInViewFilter&lt;/filter-name><br />&nbsp;&nbsp;&nbsp; &lt;filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class><br />&nbsp;&nbsp;&nbsp; &lt;init-param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>singleSession&lt;/param-name><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>true&lt;/param-value><br />&nbsp;&nbsp;&nbsp; &lt;/init-param><br />&nbsp;&nbsp;&nbsp; &lt;init-param><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>sessionFactoryBeanName&lt;/param-name><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--指定对Spring配置中哪个sessionFactory使用OpenSessionInView--><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>sessionFactory_itdb&lt;/param-value><br />&nbsp;&nbsp;&nbsp; &lt;/init-param><br />&nbsp; &lt;/filter><br />&nbsp;&nbsp;&nbsp; &lt;filter-name>openSessionInViewFilter&lt;/filter-name><br />&nbsp;&nbsp;&nbsp; &lt;url-pattern>/*&lt;/url-pattern><br />&nbsp; &lt;/filter-mapping><br />Struts-config.xml<br />&lt;action input="/index.jsp" name="loginActionForm" parameter="method" path="/loginAction" scope="session" type="org.springframework.web.struts.DelegatingActionProxy" validate="true" /><br /><br />&lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"><br />&nbsp;&nbsp;&nbsp; &lt;set-property property="contextConfigLocation" value="/WEB-INF/classes/action-servlet.xml" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--将spring配置中关于ACTION的配置独立到一个action-servlet.xml文件中--><br />&nbsp; &lt;/plug-in><br />ApplicationContext.xml<br />&lt;!--直接使用hibernate配置文件--><br /> &lt;bean id="sessionFactory_itdb" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><br />&nbsp;&nbsp;&nbsp; &lt;property name="configLocation"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>classpath:hibernate_itdb.cfg.xml&lt;/value><br />&nbsp;&nbsp;&nbsp; &lt;/property><br />&nbsp; &lt;/bean><br /><br /><br /><br />&lt;!--使用JNDI DataSource--><br />&lt;bean id="it_dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><br />&lt;property name="jndiName"><br />&nbsp; &lt;value>jdbc/itdb&lt;/value><br />&lt;/property><br />&lt;/bean><br /><br />&lt;!-- Spring配置DataSource --><br />&nbsp; &lt;bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><br />&nbsp;&nbsp;&nbsp; &lt;property name="location"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value>classpath:init.properties&lt;/value><br />&nbsp;&nbsp;&nbsp; &lt;/property><br />&nbsp; &lt;/bean><br /> &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><br />&nbsp;&nbsp; &lt;property name="driverClassName" value="${dataSource.driverClassName}">&lt;/property><br />&nbsp;&nbsp; &lt;property name="url" value="${dataSource.url}">&lt;/property><br />&nbsp;&nbsp; &lt;property name="username" value="${dataSource.username}">&lt;/property><br />&nbsp;&nbsp; &lt;property name="password" value="${dataSource.password}">&lt;/property><br /> &lt;/bean><br />&lt;!-- *********************Hibernate*********************** --><br />&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><br /> &lt;property name="dataSource" ref="dataSource">&lt;/property><br />&nbsp; &lt;property name="mappingResources"><br />&nbsp; &lt;list><br />&nbsp;&nbsp;&nbsp; &lt;value>com/usish/shweb/hbm/ShwebFile.hbm.xml&lt;/value><br />&nbsp;&nbsp;&nbsp; &lt;value>com/usish/shweb/hbm/ShwebLog.hbm.xml&lt;/value><br />&nbsp; &lt;/list><br /> &lt;/property><br /> &lt;property name="hibernateProperties"><br />&nbsp; &lt;props><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql">false&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.fetch_size">50&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.batch_size">30&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.cache.use_second_level_cache">true&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.cache.use_query_cache">true&lt;/prop><br />&nbsp; &lt;/props><br /> &lt;/property><br />&lt;/bean><br /><br /><br /><br />&lt;!--******************TransactionManager***********************--><br />&lt;bean id="transactionManager"<br />&nbsp;&nbsp;&nbsp; class="org.springframework.orm.hibernate3.HibernateTransactionManager"><br />&nbsp;&nbsp; &lt;property name="sessionFactory"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory" /><br />&nbsp;&nbsp; &lt;/property><br />&lt;/bean><br />&lt;bean id="baseTxProxy"&nbsp; class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"><br />&nbsp; &lt;property name="transactionManager"><br />&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionManager" /><br />&nbsp; &lt;/property><br />&nbsp; &lt;property name="transactionAttributes"><br />&nbsp;&nbsp;&nbsp; &lt;props><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="find*">PROPAGATION_REQUIRED,readOnly&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="get*">PROPAGATION_REQUIRED&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="save*">PROPAGATION_REQUIRED&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="insert*">PROPAGATION_REQUIRED&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="update*">PROPAGATION_REQUIRED&lt;/prop><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="delete*">PROPAGATION_REQUIRED&lt;/prop><br />&nbsp;&nbsp;&nbsp; &lt;/props><br />&nbsp; &lt;/property><br />&lt;/bean><br /><br />&lt;!--AOP TX--><br />&lt;tx:advice id="txAdvice" transaction-manager="txManager"><br />&nbsp;&nbsp; &lt;tx:attributes><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;tx:method name="get*" propagation="NEVER"/><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;tx:method name="find*" propagation="NEVER"/><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;tx:method name="*" propagation="REQUIRED"/><br />&nbsp;&nbsp; &lt;/tx:attributes><br /> &lt;/tx:advice><br /> <br /> &lt;aop:config><br />&nbsp;&nbsp;&nbsp; &lt;aop:pointcut id="txBusinessMethods" expression="execution(* com.ztgame.blog.business.*BusinessImpl.*(..))"/><br />&nbsp;&nbsp;&nbsp; &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="txBusinessMethods"/> <br /> &lt;/aop:config><br /><br />&lt;!--annotation TX--><br />&lt;tx:annotation-driven proxy-target-class="true" transaction-manager="txManager"/><br /><br /> <br /><br />Spring编程式事物<br />&lt;bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="TransactionManager"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property><br />&nbsp;&nbsp;&nbsp; &lt;/bean><br />&nbsp;&nbsp;&nbsp; &lt;bean id="courseService" class="com.test.CourseService"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionTemplate"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionTemplate"/><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property><br /> &lt;/bean><br /><br /><br />private TransactionTemplate transactionTemplate;<br />&nbsp;&nbsp;&nbsp; public void enrollStudent()...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactionTemplate.execute(new TransactionCallback()...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object doInTransaction(TransactionStatus ts)...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 需要事务控制的方法代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) ...{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ts.setRollbackOnly();&nbsp; //回滚<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;&nbsp; //事务提交<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br /><br /><br />7个事务策略：<br />1、&nbsp; PROPAGATION_REQUIRED -- 支持当前的事务，如果不存在就创建一个新的。这是最常用的选择。 <br />2 、 PROPAGATION_SUPPORTS -- 支持当前的事务，如果不存在就不使用事务。 <br />3 、 PROPAGATION_MANDATORY -- 支持当前的事务，如果不存在就抛出异常。 <br />4 、 PROPAGATION_REQUIRES_NEW -- 创建一个新的事务，并暂停当前的事务（如果存在）。 <br />5 、 PROPAGATION_NOT_SUPPORTED -- 不使用事务，并暂停当前的事务（如果存在）。 <br />6 、 PROPAGATION_NEVER -- 不使用事务，如果当前存在事务就抛出异常。 <br />7 、 PROPAGATION_NESTED -- 如果当前存在事务就作为嵌入事务执行，否则与 PROPAGATION_REQUIRED 类似。<br /><br />&nbsp;&nbsp; <br />&nbsp; 5个隔离策略：&nbsp;&nbsp; <br />&nbsp; ISOLATION_DEFAULT&nbsp;&nbsp; <br />&nbsp; ISOLATION_READ_UNCOMMITED&nbsp;&nbsp; <br />&nbsp; ISOLATION_COMMITED&nbsp;&nbsp; <br />&nbsp; ISOLATION_REPEATABLE_READ&nbsp;&nbsp; <br />&nbsp; ISOLATION_SERIALIZABLE <br /> ●&nbsp;&nbsp; 未授权读取（Read Uncommitted）：允许脏读取，但不允许更新丢失。如果一个事务已经开始写数据，则另外一个数据则不允许同时进行写操作，但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。<br /> ●&nbsp;&nbsp; 授权读取（Read Committed）：允许不可重复读取，但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据，但是未提交的写事务将会禁止其他事务访问该行。<br /> ●&nbsp;&nbsp; 可重复读取（Repeatable Read）：禁止不可重复读取和脏读取，但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务（但允许读事务），写事务则禁止任何其他事务。<br /> ●&nbsp;&nbsp; 序列化（Serializable）：提供严格的事务隔离。它要求事务序列化执行，事务只能一个接着一个地执行，但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的，必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。<br /><br /><br /> ●&nbsp;&nbsp; 更新丢失（Lost update）：两个事务都同时更新一行数据，但是第二个事务却中途失败退出，导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作，因此并发事务并没有被隔离开来。<br /> ●&nbsp;&nbsp; 脏读取（Dirty Reads）：一个事务开始读取了某行数据，但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的，因为很可能所有的操作都被回滚。<br /> ●&nbsp;&nbsp; 不可重复读取（Non-repeatable Reads）：一个事务对同一行数据重复读取两次，但是却得到了不同的结果。例如，在两次读取的中途，有另外一个事务对该行数据进行了修改，并提交。<br /> ●&nbsp;&nbsp; 两次更新问题（Second lost updates problem）：无法重复读取的特例。有两个并发事务同时读取同一行数据，然后其中一个对它进行修改提交，而另一个也进行了修改提交。这就会造成第一次写操作失效。<br /> ●&nbsp;&nbsp; 虚读（Phantom Reads）：事务在操作过程中进行两次查询，第二次查询的结果包含了第一次查询中未出现的数据（这里并不要求两次查询的SQL语句相同）。这是因为在两次查询过程中有另外一个事务插入数据造成的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dirty reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; non-repeatable reads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; phantom reads<br />SERIALIZABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会<br />REPEATABLE READ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会<br />READ COMMITTED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会<br />READ UNCOMMITTED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/210678#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 16:06:57 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/210678</link>
        <guid>http://robustwang.javaeye.com/blog/210678</guid>
      </item>
          <item>
        <title>Spket Eclipse插件与IDE</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/210266" style="color:red;">http://robustwang.javaeye.com/blog/210266</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spket Eclipse插件与IDE<br />&nbsp;&nbsp;&nbsp; Spket IDE是目前支持Ext 2.0最为出色的IDE。 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中。<br />&nbsp;&nbsp;&nbsp; 由于Spket只是一个单纯的编辑器，没有其它格式的支持（如CSS），所以我的做法是用它的Eclipse插件形式，安装到Aptana。安装办法如下：<br /><br />&nbsp;&nbsp;&nbsp; 1.下载安装Aptana Studio（包含有Eclipse）；<br />&nbsp;&nbsp;&nbsp; 2.启动Aptana并打开程序菜单到：Help → Software Updates → Find and Install… → Search for new features to install → New remote site… <br />&nbsp;&nbsp;&nbsp; 3.名称: “Spket”，地址URL是http://www.spket.com/update/ <br />&nbsp;&nbsp;&nbsp; 4.重启Aptana；<br />&nbsp;&nbsp;&nbsp; 5.观看一下这个SketIDE的教程，看看Ext代码提示的功能有多省事（你可以修改/src/ext.jsb 保持最新版的Ext），基本步骤如下：<br /><br />Window → Preferences → Spket → JavaScript Profiles → New ；<br />输入“ExtJS”点击OK； <br />选择“ExtJS” 并点击“Add Library”然后在下拉条中选取“ExtJS”； <br />选择 “ExtJS”并点击“Add File”，然后在你的./ext-2.x/source目录中选取“ext.jsb” 文件；<br />设置新的ExtJS Profile，选中并点击“JavaScript Profiles” 对话框右手边的“Defalut”按钮；<br />重启Aptana； <br />创建新的JS文件并输入： Ext这样就可设置Ext Code代码自动完成的功能。<br /><br />&nbsp;&nbsp;&nbsp; 由于你是在Aptana中安装插件的，Aptana还是你默认的JS编辑器，所以要试用Spket，你要在那个文件上选中“Open with”－> Spket JavaScript Editor 。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/210266#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 19:27:41 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/210266</link>
        <guid>http://robustwang.javaeye.com/blog/210266</guid>
      </item>
          <item>
        <title>Weblogic 9.2产品直接下载</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/209880" style="color:red;">http://robustwang.javaeye.com/blog/209880</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Weblogic 9.2产品直接下载，及Weblogic 9.2 破解补丁<br />WebLogic Server 9.2直接下载：<br />http://download2.bea.com/pub/platform/92/server920_win32.exe<br />http://download2.bea.com/pub/platform/92/server920_linux32.bin<br />http://download2.bea.com/pub/platform/92/server920_hpux32.bin<br />http://download2.bea.com/pub/platform/92/server920_solaris32.bin<br /><br />中文版：<br />http://download2.bea.com/pub/platform/92/server920_zh_CN_win32.exe <br /><br /><br />WebLogic Portal 9.2直接下载：<br />http://download2.bea.com/pub/platform/92/portal920_win32.exe<br />http://download2.bea.com/pub/platform/92/portal920_linux32.bin<br />http://download2.bea.com/pub/platform/92/portal920_hpux32.bin<br />http://download2.bea.com/pub/platform/92/portal920_solaris32.bin<br /><br />Weblogic Integration 9.2直接下载：<br />http://download2.bea.com/pub/platform/92/integration920_win32.exe<br />http://download2.bea.com/pub/platform/92/integration920_linux32.bin<br />http://download2.bea.com/pub/platform/92/integration920_hpux32.bin<br />http://download2.bea.com/pub/platform/92/integration920_solaris32.bin<br /><br />Weblogic Express 9.2直接下载：<br />http://download2.bea.com/pub/platform/92/express920_win32.exe<br />http://download2.bea.com/pub/platform/92/express920_linux32.bin<br />http://download2.bea.com/pub/platform/92/express920_hpux32.bin<br />http://download2.bea.com/pub/platform/92/express920_solaris32.bin<br /><br />Weblogic Workshop 9.2直接下载：<br />http://download2.bea.com/pub/platform/92/workshop920_win32.exe<br />http://download2.bea.com/pub/platform/92/workshop920_linux32.bin<br />http://download2.bea.com/pub/platform/92/workshop920_hpux32.bin<br />http://download2.bea.com/pub/platform/92/workshop920_solaris32.binWeblogic 破解补丁下载weblogic 9.2 破解包weblogic 10 破解包破解方法：win下的使用方法1.将license.bea和weblog_crack.jar拷贝到bea安装目录下，例如d:\bea2.修改d:\bea\user_projects\domains\odpsdomain(你建立的域)\bin\startWeblogic.cmd<br />修改<br />set CLASSPATH=%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSP<br />为<br />set CLASSPATH=d:\bea\weblogic_crack.jar;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSP3. 重启weblogiclinux下使用方法：1.将license.bea和weblog_crack.jar拷贝到bea安装目录下，例如:/opt/bea2.修改/opt/bea/user_projects/domains/你自己定义的域/bin/startWebLogic.sh修改<br />CLASSPATH="${CLASSPATH}${CLASSPATHSEP}${MEDREC_WEBLOGIC_CLASSPATH}"<br />为<br />CLASSPATH="/opt/bea/weblogic_crack.jar:${CLASSPATH}${CLASSPATHSEP}${MEDREC_WEBLOGIC_CLASSPATH}"3. 重启weblogic
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/209880#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 18:01:54 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/209880</link>
        <guid>http://robustwang.javaeye.com/blog/209880</guid>
      </item>
          <item>
        <title>JSEclipse的下载 </title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/208991" style="color:red;">http://robustwang.javaeye.com/blog/208991</a>&nbsp;
          发表时间: 2008年06月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          插件介绍：JSEclipse是个Eclipse下的免费Javascript脚本编辑器，最大的特点就是对js的自动完成功能非常完美，支持普通DOM对象的点取，如document对象，screen对象等等... <br /> 下面我将介绍在Eclipse中如何安装JSEclipse:<br /> 在http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/中下载JSEclipse中下载JSEclipse_1.5.5.jar(此时的最新版本);我们将JSEclipse_1.5.5解压后在产生的文件夹中的readme.txt里有解压产生的文件夹的说明,其中有描述如下:<br />&nbsp;&nbsp; - features/ - this folder includes the JSEclipse features<br />&nbsp;&nbsp; - plugins/ - this folder includes the JSEclipse plugin<br />&nbsp;&nbsp; - documentation - this folder contains the JSEclipse user manual in two different formats: Windows Help File (CHM) and FlashHelp<br />&nbsp;&nbsp; - License/ - the file includes the JSEclipse license (please select the one in your language)<br />&nbsp;&nbsp; - site.xml - this file is the site descriptor. It is used by the Eclipse IDE to determine the JSEclipse package location.<br />&nbsp; - Install.txt - the file includes the JSEclipse installation notes<br />&nbsp; - Readme.txt - this file<br />显示了各个文件夹的作用;<br />我们打开documentation 这个文件夹,有chm和flash这两中说明文档,其中有在Eclipse中安装JSEclipse的说明(见2000_installing.htm)<br />让Eclipse在网络上来查找JSEclipse的安装文件<br />&nbsp; 在Eclipse里如下选择:Help > Software Updates ->Find and Install再随后打开的对话框里选择Search for new features to install,再随后打开的对话框里选择New remote site按钮,在打开的"New Update Site"中输入如下:<br />&nbsp;&nbsp; Name: JSEclipse from Adobe Labs<br />&nbsp;&nbsp; URL : http://download.macromedia.com/pub/labs/jseclipse/autoinstall<br />&nbsp;&nbsp; 点击OK<br />随后将 JSEclipse from Adobe Labs 选中,然后就是安装了;
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/208991#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jun 2008 19:00:40 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/208991</link>
        <guid>http://robustwang.javaeye.com/blog/208991</guid>
      </item>
          <item>
        <title>EXT2 下载</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/206518" style="color:red;">http://robustwang.javaeye.com/blog/206518</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://download.csdn.net/source/506407" target="_blank">http://download.csdn.net/source/506407</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/206518#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 00:33:19 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/206518</link>
        <guid>http://robustwang.javaeye.com/blog/206518</guid>
      </item>
          <item>
        <title>在Eclipse中使用debug调试程序</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/204972" style="color:red;">http://robustwang.javaeye.com/blog/204972</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最基本的操作是：<br />1, 首先在一个java文件中设断点，然后运行，当程序走到断点处就会转到debug视图下，<br />2, F5键与F6键均为单步调试，F5是step into,也就是进入本行代码中执行，F6是step over，<br />&nbsp;&nbsp; 也就是执行本行代码，跳到下一行，<br />3,F7是跳出函数<br />4,F8是执行到最后。<br /><br />////////////////////////////////////////////////<br />1.Step Into (also F5) 跳入<br />2.Step Over (also F6) 跳过<br />3.Step Return (also F7) 执行完当前method，然后return跳出此method<br />4.step Filter 逐步过滤 一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering)<br />5.resume 重新开始执行debug,一直运行直到遇到breakpoint<br />6.hit count 设置执行次数&nbsp; 适合程序中的for循环(设置 breakpoint view-右键hit count)<br />7.inspect 检查 运算。执行一个表达式显示执行值<br />8.watch 实时地监视变量的变化<br /><br />9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型：field(watchpoint)breakpoint,method breakpoint,exception breakpoint.<br />10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂<br />11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint)<br />12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...)<br />断点属性：<br />&nbsp;&nbsp;&nbsp; 1.hit count 执行多少次数后暂挂 用于循环<br />&nbsp;&nbsp;&nbsp; 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂<br />&nbsp;&nbsp;&nbsp; 3.suspend thread 多线程时暂挂此线程<br />&nbsp;&nbsp;&nbsp; 4.suspend VM 暂挂虚拟机<br /><br />13.variables 视图里的变量可以改变变量值，在variables 视图选择变量点击右键--change value.一次来进行快速调试。<br />14.debug 过程中修改了某些code后--〉save&amp;build-->resume-->重新暂挂于断点
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/204972#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jun 2008 02:41:44 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/204972</link>
        <guid>http://robustwang.javaeye.com/blog/204972</guid>
      </item>
          <item>
        <title>定义事务代理</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/199867" style="color:red;">http://robustwang.javaeye.com/blog/199867</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          定义事务代理<br /><br />　　除JdbcClinic实例之外，配置还为其定义了一个事务代理。如果需要，可以显式地指定该事务代理所暴露的实际接口。默认状态下，目标对象实现的所有接口都将被暴露--在本例中是应用程序的Clinic服务接口。<br /><br />　　从客户端的角度来看，“clinic”bean只是应用程序的Clinic接口的实现。客户端不必知道自己正在和事务代理打交道。这就是接口的力量：目标对象的直接引用可以很轻松地由实现了相同接口的代理取代--在本例中是一个隐式地创建事务的代理。<br /><br />　　对于特定的方法或方法命名模式，代理的具体事务行为由事务属性驱动，如下面的例子所示：<br /><br />&lt;prop key="load*">PROPAGATION_REQUIRED,readOnly&lt;/prop>&lt;prop key="store*">PROPAGATION_REQUIRED&lt;/prop> <br />　　key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用：<br /><br />PROPAGATION_REQUIRED--支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择。 <br />PROPAGATION_SUPPORTS--支持当前事务，如果当前没有事务，就以非事务方式执行。 <br />PROPAGATION_MANDATORY--支持当前事务，如果当前没有事务，就抛出异常。 <br />PROPAGATION_REQUIRES_NEW--新建事务，如果当前存在事务，把当前事务挂起。 <br />PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。 <br />PROPAGATION_NEVER--以非事务方式执行，如果当前存在事务，则抛出异常。 <br />PROPAGATION_NESTED--如果当前存在事务，则在嵌套事务内执行。如果当前没有事务，则进行与PROPAGATION_REQUIRED类似的操作。 <br />　　前六个策略类似于EJB CMT：常量名相同，因此，对EJB开发人员来说，应该立刻就感到熟悉。第七个（PROPAGATION_NESTED）是Spring所提供的一个特殊变量。它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为（如Spring的DataSourceTransactionManager），或者通过JTA支持嵌套事务。<br /><br />　　事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。这是一个最优化提示。在一些情况下，一些事务策略能够起到显著的最优化效果，例如在使用Object/Relational映射工具（如：Hibernate或TopLink）时避免dirty checking（试图“刷新”）。<br /><br />　　在事务属性中还有定义“timeout”值的选项，指定事务超时为几秒。在JTA中，这将被简单地传递到J2EE服务器的事务协调程序，并据此得到相应的解释。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/199867#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 20:47:37 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/199867</link>
        <guid>http://robustwang.javaeye.com/blog/199867</guid>
      </item>
          <item>
        <title>DOCTYPE(文档类型)</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/197481" style="color:red;">http://robustwang.javaeye.com/blog/197481</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DOCTYPE(文档类型)DOCTYPE是document type(文档类型)的简写，用来说明你用的XHTML或者HTML是什么版本。 <br /><br />他们是什么和他们为什么是重要的？<br />所有的HTML和XHTML文档必须有一个有效的doctype声明。 <br /><br />Doctype规定了文档使用的HTML或XHTML的版本。 <br /><br />当校验的时候doctype被校验器使用，WEB浏览器通过它来决定那种渲染模式被使用。 <br /><br />Doctype影响设备渲染web页面的方式。 <br /><br />如果文档使用了正确的doctype，一些浏览器将切换到标准模式，那意味着浏览器会遵守更多的CSS规则。 <br /><br />如果文档使用了正确的doctype，文档会渲染更快，因为浏览器不需要花时间去思考怎样正确地去渲染HTML。 <br />主要的几种DOCTYPE<br />HTML 4.01 Strict <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <br /><br />在上面的声明中，声明了文档的根元素是html，它在公共标识符为"-//W3C//DTD HTML 4.01//EN"的DTD中进行了定义。浏览器将明白如何寻找匹配此公共标识符的DTD。如果找不到，浏览器将使用公共标识符后面的URL作为寻找DTD的位置。<br /><br />HTML 4.01 Transitional<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><br /><br />HTML 4.01 Frameset <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <br /><br />XHTML 1.0 Strict <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <br /><br />XHTML 1.0 Transitional <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><br />XHTML 1.0 Frameset <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <br /><br />XHTML 1.1 <br />&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <br /><br />Standards compliant (or strict) and quirks modes<br />大多数浏览器有两种模式：怪异模式（quirks mode 使用老的规则）和严格模式（strict mode遵守标准）。Mozilla, Safari, Opera, Mac/Explorer, Windows/Explorer 6实现了这两种模式。Windows/Explorer 5和老的浏览器像Netscape 4执行的是怪异模式。<br /><br />使用严格模式（strict mode 或者说遵守标准的模式）有一些非常重要的原因。例如，Windows/Explorer 6 将会使用正确的盒模型（box model）当使用strict mode 时，而使用quirks mode 时会执行错误的盒模型。另外在quirks mode下，一些现代的浏览器将不允许fonts被继承。<br /><br />XML声明需要吗？<br />W3C推荐在XHTML文档里使用XML声明，但也不是必须要这么做。所以这就要看开发者本人来决定了。如果有了这个声明,Windows/IE6将会忽略任何使用的doctype 而执行quirks mode。XML声明看起来如下示：<br />&lt;?xml version="1.0" encoding="utf-8"?> <br /><br />关于DOCTYPE你也可以看看阿捷的选择什么样的DOCTYPE这篇文章。<br /><br />如果想对DOCTYPE了解更多细节，可以阅读《网站重构》122页或者《HTML和XHTML权威指南(第五版)》580页。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/197481#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 15:24:49 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/197481</link>
        <guid>http://robustwang.javaeye.com/blog/197481</guid>
      </item>
          <item>
        <title>mysql连接数据库出现Communication failure during handshake</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/195476" style="color:red;">http://robustwang.javaeye.com/blog/195476</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          net&nbsp;&nbsp; start&nbsp;&nbsp; mysql&nbsp;&nbsp; ,会返回mysql已经启动说明已经服务已经启动了，不然你工具怎么能连上呢Communication&nbsp;&nbsp; failure&nbsp;&nbsp; during&nbsp;&nbsp; handshake.&nbsp;&nbsp; Is&nbsp;&nbsp; there&nbsp;&nbsp; a&nbsp;&nbsp; server&nbsp;&nbsp; running&nbsp;&nbsp; on&nbsp;&nbsp; 127.0.0.1:3306?，是什么时候出现的，以前jdbc连mysql时曾有不少人出这个问题，如果这样的话可以：&nbsp;&nbsp; <br />&nbsp; 尝试下一个新版本的驱动:http://dev.mysql.com/downloads/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; Class.forName("org.gjt.mm.mysql.Driver")&nbsp;&nbsp;&nbsp;&nbsp; 换成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp; Class.forName("com.mysql.jdbc.Driver")
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/195476#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 May 2008 03:33:04 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/195476</link>
        <guid>http://robustwang.javaeye.com/blog/195476</guid>
      </item>
          <item>
        <title>由MyEclipse内存不足谈谈JVM内存</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/193814" style="color:red;">http://robustwang.javaeye.com/blog/193814</a>&nbsp;
          发表时间: 2008年05月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文出处: http://www.javatang.com/archives/2007/12/03/1653250.html<br />作者: Jet Mah from Java堂<br />声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明！<br /><br />如果没有进行设置的话，在使用MyEclipse的经常出现如下图所示内存不足的提示。<br />myeclipse.png<br />提示中说的很明白：“MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.”意思是说当前只有小于5%的非堆内存是空闲的。所以我们只要将这个值设置大一些就可以了。<br /><br />提示中给出了设置的参数：<br /><br />&nbsp;&nbsp; 1. -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M<br /><br />这里有几个问题：<br />1. 各个参数的含义什么？<br />2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动，而有些机器无法启动？<br />3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置？<br /><br />下面我们一一进行回答<br /><br />1. 各个参数的含义什么？<br /><br />参数中-vmargs的意思是设置JVM参数，所以后面的其实都是JVM的参数了，我们首先了解一下JVM内存管理的机制，然后再解释每个参数代表的含义。<br /><br />&nbsp; # 堆(Heap)和非堆(Non-heap)内存<br />&nbsp;&nbsp;&nbsp; 按照官方的说法：“Java 虚拟机具有一个堆，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存：堆和非堆。简单来说堆就是Java代码可及的内存，是留给开发人员使用的；非堆就是JVM留给自己用的，所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。<br />&nbsp; # 堆内存分配<br />&nbsp;&nbsp;&nbsp; JVM初始分配的内存由-Xms指定，默认是物理内存的1/64；JVM最大分配的内存由 -Xmx指定，默认是物理内存的1/4。默认空余堆内存小于40%时，JVM就会增大堆直到-Xmx的最大限制；空余堆内存大于70%时，JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。<br />&nbsp; # 非堆内存分配<br />&nbsp;&nbsp;&nbsp; JVM使用-XX:PermSize设置非堆内存初始值，默认是物理内存的1/64；由XX:MaxPermSize设置最大非堆内存的大小，默认是物理内存的1/4。<br />&nbsp; # JVM内存限制(最大值)<br />&nbsp;&nbsp;&nbsp; 首先JVM内存限制于实际的最大物理内存(废话！呵呵)，假设物理内存无限大的话，JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制，这个限制一般是 2GB-3GB（一般来说Windows系统下为1.5G-2G，Linux系统下为2G-3G），而64bit以上的处理器就不会有限制了。<br /><br />2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动，而有些机器无法启动？<br /><br />通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种：堆内存和非堆内存，另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因：<br /><br />&nbsp;&nbsp;&nbsp; 1) 参数中-Xms的值大于-Xmx，或者-XX:PermSize的值大于-XX:MaxPermSize；<br /><br />&nbsp;&nbsp;&nbsp; 2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制，比如当前操作系统最大内存限制，或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是，如果你的内存是1024MB，但实际系统中用到的并不可能是1024MB，因为有一部分被硬件占用了。 <br /><br />3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置？<br /><br />那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢？这是因为我们没有遵守eclipse.ini文件的设置规则：<br /><br />&nbsp;&nbsp;&nbsp; 参数形如“项 值”这种形式，中间有空格的需要换行书写，如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机，在eclipse.ini文件中要写成这样：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. -vm<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. C:\Java\jre1.6.0\bin\javaw.exe<br /><br />按照上面所说的，最后参数在eclipse.ini中可以写成这个样子：<br /><br />&nbsp;&nbsp; 1. -vmargs<br />&nbsp;&nbsp; 2. -Xms128M<br />&nbsp;&nbsp; 3. -Xmx512M<br />&nbsp;&nbsp; 4. -XX:PermSize=64M<br />&nbsp;&nbsp; 5. -XX:MaxPermSize=128M<br /><br />实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。<br /><br />另外需要说明的是，Eclipse压缩包中自带的eclipse.ini文件内容是这样的：<br /><br />&nbsp;&nbsp; 1. -showsplash<br />&nbsp;&nbsp; 2. org.eclipse.platform<br />&nbsp;&nbsp; 3. --launcher.XXMaxPermSize<br />&nbsp;&nbsp; 4. 256m<br />&nbsp;&nbsp; 5. -vmargs<br />&nbsp;&nbsp; 6. -Xms40m<br />&nbsp;&nbsp; 7. -Xmx256m<br /><br />其中–launcher.XXMaxPermSize（注意最前面是两个连接线）跟-XX:MaxPermSize参数的含义基本是一样的，我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数，而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了，所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。<br /><br />参考资料：<br />JDK5.0垃圾收集优化之–Don’t Pause<br />提问：如何超越JVM内存限制？<br />MemoryMXBean (Java 2 Platform SE 5.0)<br />MyEclipse/Eclipse的内存优化与内存不足的解决办法<br />eclipse.ini文件的问题<br />eclipse 为什么报错
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/193814#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 May 2008 01:19:40 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/193814</link>
        <guid>http://robustwang.javaeye.com/blog/193814</guid>
      </item>
          <item>
        <title>MySQL5.0+Tomcat6.0的数据源配置</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/193426" style="color:red;">http://robustwang.javaeye.com/blog/193426</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Java Web开发中都要与数据库打交道，为了不频繁地打开和关闭数据库，以减少数据库操作负荷,可使数据库在开发过程中保持打开状态，在这里我们采用配置数据源的方式(JNDI)，而不是传统地JDBC方式。下面就针对常规型的MySQL5.0.15和Tomcat6.0的数据源的基本配置进行简单的介绍：<br />&nbsp; 首先声明,如果数据源没有配置好的话，在开发过程中会抛出诸如下列异常等：<br />&nbsp; 1、org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'<br />&nbsp; 2、Caused by: java.sql.SQLException: No suitable driver<br />&nbsp; 3、Name jdbc is not bound in this context<br />现在开始讲下如何配置好数据源同时也是解决上述异常的办法：<br />&nbsp; 方案一：<br />&nbsp; 步骤一、在Tomcat6.0解压目录conf下找到context.xml,在其中的&lt;Context>&lt;/Context> 中加入如下代码(要根据自己的情况稍加修改)： &lt;Resource name="jdbc/myznt"&nbsp; auth="Container" type="javax.sql.DataSource" password="localhost" username="root"&nbsp; driverClassName="org.gjt.mm.mysql.Driver"&nbsp; url="jdbc:mysql://localhost/myznt"&nbsp; maxActive="100"&nbsp; maxIdle="30"&nbsp; maxWait="5000"/><br />&nbsp; 步骤二、在工程应用中/WEB-INF/下的web.xml中加入如下代码(要根据自己的情况稍加修改):<br />&lt;resource-ref> <br />&nbsp;&nbsp;&nbsp; &lt;description>MySQL DataSource&lt;/description><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-ref-name>jdbc/myznt&lt;/res-ref-name><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-type>javax.sql.DataSource&lt;/res-type><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-auth>Container&lt;/res-auth><br /> &lt;/resource-ref><br /> 步骤三、把MySQL-Connector-java-3.0.12-bin.jar(可换更高版本)加到Tomcat安装目录中的lib目录下和工程中的lib目录下。<br />&nbsp;&nbsp;&nbsp; 通过这三步，一个基本的数据源就配置成功了!<br />&nbsp; 方案二<br /> 步骤一、在Tomcat6.0解压目录conf下找到server.xml,在其中的&lt;GlobalNamingResources>&lt;/GlobalNamingResources>中加入如下代码(要根据自己的情况稍加修改)：<br />&lt;Resource name="jdbc/myznt"&nbsp; auth="Container" type="javax.sql.DataSource" password="localhost" username="root"&nbsp; driverClassName="org.gjt.mm.mysql.Driver"&nbsp; url="jdbc:mysql://localhost/myznt"&nbsp; maxActive="100"&nbsp; maxIdle="30"&nbsp; maxWait="5000"/><br />步骤二、在Tomcat6.0解压目录conf下找到context.xml,在其中的&lt;Context>&lt;/Context>中加入并修改成如下代码(要根据自己的情况稍加修改):<br />&lt;Context path="/znt" debug="1" reloadable="true"&nbsp; docBase="E:\EclipseWorkPlace\MyZNT\WebRoot"><br />&lt;ResourceLink global="jdbc/myznt" name="jdbc/myznt" type="javax.sql.Datasource"/><br />................&lt;!--此间可能有系统其它自配的内容，可不管--><br />&lt;/Context><br />步骤三、在工程中/WEB-INF/下的web.xml中加入如下代码(要根据自己的情况稍加修改):<br />&lt;resource-ref> <br />&nbsp;&nbsp;&nbsp; &lt;description>MySQL DataSource&lt;/description><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-ref-name>jdbc/myznt&lt;/res-ref-name><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-type>javax.sql.DataSource&lt;/res-type><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-auth>Container&lt;/res-auth><br /> &lt;/resource-ref><br /> 步骤四、把MySQL-Connector-java-3.0.12-bin.jar(可换更高版本)加到Tomcat安装目录中的lib目录下和工程中的lib目录下。<br />&nbsp;&nbsp; 通过以上四步就好了!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方案三(具有不稳定性,慎用)<br />步骤一、在Tomcat6.0解压目录conf下找到server.xml,在其中的&lt;Host>&lt;/Host>中加入如下代码(要根据自己的情况稍加修改)：<br />&lt;Context path="/znt" docBase="E:\EclipseWorkPlace\MyZNT\WebRoot"<br />&nbsp; debug="5" reloadable="true" crossContext="true"><br /> <br />&lt;Logger className="org.apache.catalina.logger.FileLogger"<br />&nbsp;&nbsp;&nbsp;&nbsp; prefix="localhost_MysqlTest_log." suffix=".txt"<br />&nbsp;&nbsp;&nbsp;&nbsp; timestamp="true"/><br />&lt;Resource name="jdbc/myznt"&nbsp; auth="Container" type="javax.sql.DataSource" password="localhost" username="root"&nbsp; driverClassName="org.gjt.mm.mysql.Driver"&nbsp; url="jdbc:mysql://localhost/myznt"&nbsp; maxActive="100"&nbsp; maxIdle="30"&nbsp; maxWait="5000"/><br />&lt;/Context><br />步骤二、在工程中/WEB-INF/下的web.xml中加入如下代码(要根据自己的情况稍加修改):<br />&lt;resource-ref> <br />&nbsp;&nbsp;&nbsp; &lt;description>MySQL DataSource&lt;/description><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-ref-name>jdbc/myznt&lt;/res-ref-name><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-type>javax.sql.DataSource&lt;/res-type><br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-auth>Container&lt;/res-auth><br /> &lt;/resource-ref><br />步骤三、把MySQL-Connector-java-3.0.12-bin.jar(可换更高版本)加到Tomcat安装目录中的lib目录下和工程中的lib目录下。<br />&nbsp;&nbsp;&nbsp; 通过以上三步，大部分时候还是起作用的，但有时会出现异常，因此不建议使用。<br />&nbsp;&nbsp;&nbsp; 以上几种方案在实践中经受了测试，方案一和二比较稳定，方案三最好别用，同时只是进行了大致地归纳，其中的哪些地方没有必要或哪里欠妥还没有去测试，望读者进行批评指正。
          <br/><br/>
          <span style="color:red;">
            <a href="http://robustwang.javaeye.com/blog/193426#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 21:22:06 +0800</pubDate>
        <link>http://robustwang.javaeye.com/blog/193426</link>
        <guid>http://robustwang.javaeye.com/blog/193426</guid>
      </item>
          <item>
        <title>Log4j详细解</title>
        <author>robustwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://robustwang.javaeye.com">robustwang</a>&nbsp;
                    链接：<a href="http://robustwang.javaeye.com/blog/189871" style="color:red;">http://robustwang.javaeye.com/blog/189871</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          .1. 背景 <br />　　在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。 <br />　　最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。 <br />1.2. Log4j简介 <br />　　在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。 <br />　 　Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。 <br />　　此外，通过Log4j其他语言接口，您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通 过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。 <br />Log4j有三个主要的组件： <br />Loggers(记录器)，Appenders (输出源)和Layouts(布局)，这里可简单理解为日志类别，日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和 级别，并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明： <br />1、 Loggers <br />　 　Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的，DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL，分别用来指定这条日志信息的重要程度,明白这一点很重要，这里Log4j有一个规则：假设Loggers级别为P，如果在Loggers中发 生了一个级别Q比P高，则可以启动，否则屏蔽掉。 <br />假设你定义的级别是info，那么error和warn的日志可以显示而比他低的debug信息就不显示了。 <br />Java程序举例来说： <br />　　 ***建立Logger的一个实例，命名为“com.foo”*** <br />　　　Logger　logger = Logger.getLogger("com.foo"); <br />***"com.foo"是实例进行命名，也可以任意*** <br />　　 ***设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。*** <br />　　logger.setLevel(Level.INFO); <br />　　Logger barlogger = Logger.getLogger("com.foo.Bar"); <br />　　***下面这个请求可用，因为WARN >= INFO*** <br />　　logger.warn("Low fuel level."); <br />　　***下面这个请求不可用，因为DEBUG &lt; INFO*** <br />　　logger.debug("Starting search for nearest gas station."); <br />　　***命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此，下面这个请求可用，因为INFO >= INFO*** <br />　　barlogger.info("Located nearest gas station."); <br />　　***下面这个请求不可用，因为DEBUG &lt; INFO*** <br />　　barlogger.debug("Exiting gas station search"); <br />　　这里“是否可用”的意思是能否输出Logger信息。 <br />　　　　在对Logger实例进行命名时，没有限制，可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例，这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息，便于管理。比如： <br />　　static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName()); <br />2、Appenders <br />　　禁用与使用日志请求只是Log4j其中的一个小小的地方，Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。 <br />　　 <br />　　其语法表示为： <br />　　 <br />　　org.apache.log4j.ConsoleAppender（控制台） <br />　　org.apache.log4j.FileAppender（文件） <br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件） <br />org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件） <br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） <br />　　 <br />　　配置时使用方式为： <br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class <br />　　log4j.appender.appenderName.option1 = value1 <br />　　… <br />log4j.appender.appenderName.option = valueN <br />　　这样就为日志的输出提供了相当大的便利。 <br />3、Layouts <br />　 　有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了 四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。 <br />　　 <br />　　其语法表示为： <br />　　 <br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） <br />　　 <br />　　配置时使用方式为： <br />　　 <br />　　log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class <br />　　log4j.appender.appenderName.layout.option1 = value1 <br />　　… <br />　　log4j.appender.appenderName.layout.option = valueN <br />4 . Log4j的配置 　 <br />　　以上是从原理方面说明Log4j的使用方法，在具体Java编程使用Log4j可以参照以下示例： <br />　　1、 建立Logger实例： <br />　　语法表示：public static Logger getLogger( String name) <br />　　实际使用：static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ; <br />　　2、 读取配置文件： <br />　　获得了Logger的实例之后，接下来将配置Log4j使用环境： <br />　　语法表示： <br />　　BasicConfigurator.configure()：自动快速地使用缺省Log4j环境。 <br />　　PropertyConfigurator.configure(String configFilename)：读取使用Java的特性文件编写的配置文件。 <br />　　DOMConfigurator.configure(String filename)：读取XML形式的配置文件。 <br />　　实际使用： <br />PropertyConfigurator.configure("ServerWithLog4j.properties"); <br />　　3、 插入日志信息 <br />　　完成了以上连个步骤以后，下面就可以按日志的不同级别插入到你要记录日志的任何地方了。 <br />　　语法表示： <br />　　Logger.debug(Object message);//调试信息 <br />　　Logger.info(Object message);//一般信息 <br />　　Logger.warn(Object message);//警告信息 <br />　　Logger.error(Object message);//错误信息 <br />　　Logger.fatal(Object message);//致命错误信息 <br />　　实际使用：logger.info("ServerSocket before accept: " + server); <br /><br />5. 配置过程 <br /><br />　在实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。 <br />Log4j支持两种配置文件格式，一种是XML格式的文件，一种是java properties（key=value）【Java特性文件（键=值）】。下面我们介绍使用Java特性文件做为配置文件的方法 <br />具体如下： <br />　　 <br />　　1、配置根Logger，其语法为： <br />　　log4j.rootLogger = [ level ] , appenderName1, appenderName2, … <br />level : 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 <br />　　 appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。 <br />例如：log4j.rootLogger＝info,A1,B2,C3 <br />　　 <br />　　2、配置日志信息输出目的地，其语法为： <br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class // <br />　　 "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个： <br />1.org.apache.log4j.ConsoleAppender（控制台） <br />2.org.apache.log4j.FileAppender（文件） <br />3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件） <br />4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件） <br />5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） <br />1.ConsoleAppender选项 <br />Threshold=WARN:指定日志消息的输出最低层次。 <br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 <br />Target=System.err：默认情况下是：System.out,指定输出控制台 <br />2.FileAppender 选项 <br />Threshold=WARN:指定日志消息的输出最低层次。 <br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 <br />File=mylog.txt:指定消息输出到mylog.txt文件。 <br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。 <br />3.DailyRollingFileAppender 选项 <br />Threshold=WARN:指定日志消息的输出最低层次。 <br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 <br />File=mylog.txt:指定消息输出到mylog.txt文件。 <br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。 <br />DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下： <br />1)'.'yyyy-MM: 每月 <br />2)'.'yyyy-ww: 每周 <br />3)'.'yyyy-MM-dd: 每天 <br />4)'.'yyyy-MM-dd-a: 每天两次 <br />5)'.'yyyy-MM-dd-HH: 每小时 <br />6)'.'yyyy-MM-dd-HH-mm: 每分钟 <br />4.RollingFileAppender 选项 <br />Threshold=WARN:指定日志消息的输出最低层次。 <br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 <br />File=mylog.txt:指定消息输出到mylog.txt文件。 <br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。 <br />MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。 <br />MaxBackupIndex=2:指定可以产生的滚动文件的最大数。 <br />实际应用： <br />　　log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender <br />　　 <br />　　3、配置日志信息的格式，其语法为： <br />　　A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class <br />"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个： <br />1.org.apache.log4j.HTMLLayout（以HTML表格形式布局）， <br />　　 2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式）， <br />　　 3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）， <br />　　 4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） <br />1.HTMLLayout 选项 <br />LocationInfo=true:默认值是false,输出java文件名称和行号 <br />Title=my app file: 默认值是 Log4J Log Messages. <br />2.PatternLayout 选项 <br />ConversionPattern=%m%n :指定怎样格式化指定的消息。 <br />3.XMLLayout 选项 <br />LocationInfo=true:默认值是false,输出java文件和行号 <br />实际应用： <br />　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n <br />这里需要说明的就是日志信息格式中几个符号所代表的含义： <br />　　 －X号: X信息输出时左对齐； <br />%p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL, <br />%d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921 <br />%r: 输出自应用启动到输出该log信息耗费的毫秒数 <br />%c: 输出日志信息所属的类目，通常就是所在类的全名 <br />%t: 输出产生该日志事件的线程名 <br />%l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10) <br />%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 <br />%%: 输出一个"%"字符 <br />%F: 输出日志消息产生时所在的文件名称 <br />%L: 输出代码中的行号 <br />%m: 输出代码中指定的消息,产生的日志具体信息 <br />%n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行 <br />可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如： <br />1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。 <br />2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。 <br />3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。 <br />4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边交远销出的字符截掉。 <br />　　这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行： <br />　　log4j.rootLogger=INFO,A1，B2 <br />　　log4j.appender.A1=org.apache.log4j.ConsoleAppender <br />　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br />　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n <br />　　根据上面的日志格式，某一个程序的输出结果如下： <br />　　0　　INFO　2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014] <br />16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003' <br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD <br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.' <br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP <br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT' <br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT <br /><br />4. # 当输出信息于回滚文件时 <br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志 <br />log4j.appender.ROLLING_FILE.Threshold=ERROR <br />log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log <br />log4j.appender.ROLLING_FILE.Append=true <br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 <br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数 <br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br />6. Log4j比较全面的配置 <br />LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br />log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />log4j.addivity.org.apache=true <br /># 应用于控制台 <br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />log4j.appender.Threshold=DEBUG <br />log4j.appender.CONSOLE.Target=System.out <br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />#应用于文件 <br />log4j.appender.FILE=org.apache.log4j.FileAppender <br />log4j.appender.FILE.File=file.log <br />log4j.appender.FILE.Append=false <br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /># Use this layout for LogFactor 5 analysis <br /># 应用于文件回滚 <br />log4j