zoukankan      html  css  js  c++  java
  • mybatis+spring+c3p0+maven+ehcache

    项目截图

    pom.xml如下

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.alibaba</groupId>
        <artifactId>mybatispring</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <springversion>4.0.0.RELEASE</springversion>
            <junitversion>4.12</junitversion>
        </properties>
    
        <dependencies>
        
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junitversion}</version>
                <scope>test</scope>
            </dependency>
            
            <!-- db -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.35</version>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.1.1</version>
            </dependency>
                    <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.2.2</version>
            </dependency>
    
            <!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${springversion}</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
    
            <!-- cglib -->
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>
            
            <!-- log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
            <!-- c3p0数据源 -->
            <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.5-pre10</version>
            </dependency>
        </dependencies>
    
    </project>

    然后配置spring,applicationContext.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-4.0.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">
    
        <!-- 加载配置文件 -->
        <context:property-placeholder location="classpath:db.properties" />
    
        <!-- 数据源,使用dbcp -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
            destroy-method="close">
            <property name="driverClass" value="${jdbc.driverClass}" />
            <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
            <property name="user" value="${jdbc.user}" />
            <property name="password" value="${jdbc.password}" />
            <property name="minPoolSize" value="${jdbc.miniPoolSize}" />
            <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
            <property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
            <property name="maxIdleTime" value="${jdbc.maxIdleTime}" />
            <property name="acquireIncrement" value="${jdbc.acquireIncrement}" />
    
            <property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}" />
            <property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}" />
            <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" />
            <property name="automaticTestTable" value="${jdbc.automaticTestTable}" />
            <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
            <property name="checkoutTimeout" value="${jdbc.checkoutTimeout}" />
    
        </bean>
    
    
        <!-- sqlSessinFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 加载mybatis的配置文件 -->
            <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" />
            <!-- 数据源 -->
            <property name="dataSource" ref="dataSource" />
        </bean>
    
        <!-- 原始dao接口 -->
    
        <bean id="userDao" class="com.alibaba.dao.UserDaoImpl">
            <property name="sqlSessionFactory" ref="sqlSessionFactory" />
        </bean>
    
        <!-- mapper配置 MapperFactoryBean:根据mapper接口生成代理对象 -->
        <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
            mapperInterface指定mapper接口 <property name="mapperInterface" value="cn.itcast.ssm.mapper.UserMapper"/> 
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> -->
        <!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 
            中 自动扫描出来的mapper的bean的id为mapper类名(首字母小写) -->
        <!-- 指定扫描的包名 如果扫描多个包,每个包中间使用半角逗号分隔 -->
        <!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property 
            name="basePackage" value="cn.itcast.ssm.mapper"/> <property name="sqlSessionFactoryBeanName" 
            value="sqlSessionFactory"/> </bean> -->
    
    
    </beans>

    引用的db.properties如下

    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test
    jdbc.user = root
    jdbc.password = 123456
    jdbc.miniPoolSize = 1
    jdbc.maxPoolSize = 20
    jdbc.initialPoolSize = 1
    jdbc.maxIdleTime = 25000
    jdbc.acquireIncrement = 1
    
    jdbc.acquireRetryAttempts = 30
    jdbc.acquireRetryDelay = 1000
    jdbc.testConnectionOnCheckin = true
    jdbc.automaticTestTable = c3p0TestTable
    jdbc.idleConnectionTestPeriod = 18000
    jdbc.checkoutTimeout=3000

    SqlMapConfig.xml如下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
      
        <!-- 别名定义 -->
        <typeAliases>
    
            <!-- 批量别名定义 
            指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)
            -->
            <package name="com.alibaba"/>
            
        </typeAliases>
        
        <!-- 加载 映射文件 -->
        <mappers>
            <mapper resource="mybatis/UserMapper.xml"/>
     
            <!-- 批量加载mapper
            指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载
            遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 中
            上边规范的前提是:使用的是mapper代理方法
            
            和spring整合后,使用mapper扫描器,这里不需要配置了
             -->
            <!-- <package name="cn.itcast.ssm.mapper"/> -->
    
        </mappers>
        
    </configuration>

    UserDao.java

    package com.alibaba.dao;
    
    import com.alibaba.po.User;
    
    public interface UserDao {
        public User findUserById(int id) throws Exception;
    }

    UserDaoImpl.java

    package com.alibaba.dao;
    
    import org.apache.ibatis.session.SqlSession;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    
    import com.alibaba.po.User;
    
    public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
    
        public User findUserById(int id) throws Exception {
            SqlSession sqlSession = this.getSqlSession();
            User user = sqlSession.selectOne("mapper.UserMapper.getUser", id);
            return user;
        }
    
    }

    UserDaoTest.java

    package com.alibaba.dao;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.alibaba.po.User;
    
    public class UserDaoTest {
        
        private ApplicationContext applicationContext;
    
        //在setUp这个方法得到spring容器
        @Before
        public void setUp() throws Exception {
            applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
        }
    
        @Test
        public void testFindUserById() throws Exception {
            
            UserDao userDao = (UserDao) applicationContext.getBean("userDao");
            
            //调用userDao的方法
            User user = userDao.findUserById(1);
            
            System.out.println(user);
            
        }
    
    }

     log4j如下

    # Global logging configuration
    #u5728u5f00u53d1u73afu5883u4e0bu65e5u5fd7u7ea7u522bu8981u8bbeu7f6eu6210DEBUGuff0cu751fu4ea7u73afu5883u8bbeu7f6eu6210infou6216error
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    如果项目运行会报c3p0找不到文件错误,那个没影响,只需要把Log4jdebug改为Info即可,生产环境就不会报错。



    加入ehcache

        <!-- ehcache -->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.11</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>

    配置文件ehcache.xml

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
        <diskStore path="D:developehcache" />
        <defaultCache 
            maxElementsInMemory="1000" 
            maxElementsOnDisk="10000000"
            eternal="false" 
            overflowToDisk="false" 
            timeToIdleSeconds="120"
            timeToLiveSeconds="120" 
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        </defaultCache>
    </ehcache>

    <!-- name:缓存名称。
    maxElementsInMemory:缓存最大个数。
    eternal:对象是否永久有效,一但设置了,timeout将不起作用。
    timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
    timeToLiveSeconds:设置对象在失效前允许存活时间,最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时 间无穷大。
    overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
    diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
    maxElementsOnDisk:硬盘最大缓存个数。
    diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
    diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
    memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU。你可以设置为 FIFO或是LFU。
    clearOnFlush:内存数量最大时是否清除。 -->

     

    在SqlMapConfig.xml里设置,其实是默认设置好的,另外两个是设置延迟加载的没影响,第三个默认是true放这只是方便管理

    <settings>
            <!-- 打开延迟加载 的开关 -->
            <setting name="lazyLoadingEnabled" value="true" />
            <!-- 将积极加载改为消极加载即按需要加载 -->
            <setting name="aggressiveLazyLoading" value="false" />
            <!-- 开启二级缓存 -->
            <setting name="cacheEnabled" value="true" />
        </settings>

    在UserMapper.xml里配置

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

    此外User需要序列化,因为有可能缓存是存在硬盘上。

    此时就可以使用ehcache了。

  • 相关阅读:
    CacheHelper
    自动完成 或者动态匹配
    http://www.jb51.net/article/28619.htm
    http://www.kindsoft.net/docs/qna.html
    开发测试的理想模型
    关于浮点数的死区问题
    ZOJ Problem Set – 2321 Filling Out the Team
    Input类、四元数、
    忙蒙蔽了
    2014-03-28
  • 原文地址:https://www.cnblogs.com/tuifeideyouran/p/4580775.html
Copyright © 2011-2022 走看看