SpringMVC3.2.x + Hibernate4.2.x + ecache
pom.xml
————————————————
-
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231Xml代码<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.pandy</groupId><artifactId>JBPM5sh</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>ssm3 Maven Webapp</name><url>http://maven.apache.org</url><properties><spring.version>3.2.2.RELEASE</spring.version><spring.jdbc.version>3.2.2.RELEASE</spring.jdbc.version><aspectj.version>1.6.10</aspectj.version><jetty.version>6.1.26</jetty.version><tomcat.version>2.0</tomcat.version><junit.version>4.11</junit.version><mysql.version>5.1.25</mysql.version><jtds.version>1.2.4</jtds.version><hibernate.version>4.2.1.Final</hibernate.version><hibernateCommAnn.version>3.2.0.Final</hibernateCommAnn.version><hibernateAnn.version>3.5.6-Final</hibernateAnn.version><cglib.version>2.2.2</cglib.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- JBOSS Cache & Hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-ehcache</artifactId><version>4.2.1.Final</version></dependency><dependency><groupId>hsqldb</groupId><artifactId>hsqldb</artifactId><version>1.8.0.4</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-testing</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.4.3</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.jdbc.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.jdbc.version}</version></dependency><!-- Hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-commons-annotations</artifactId><version>${hibernateCommAnn.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-annotations</artifactId><version>${hibernateAnn.version}</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>${cglib.version}</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.8.3</version></dependency><!-- Log4j --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.6.1</version></dependency><dependency><groupId>org.lazyluke</groupId><artifactId>log4jdbc-remix</artifactId><version>0.2.7</version></dependency></dependencies><build><finalName>JBPM5sh</finalName><pluginManagement><plugins><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>${jetty.version}</version></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat6-maven-plugin</artifactId><version>${tomcat.version}</version></plugin><plugin><!-- 注解支持,jdk5才具有的新特性,我们需要设置compile插件,具体可以参考Setting the -source and-target of the Java Compiler,根据说明,我们继续向pom文件中加入 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>5</source><target>5</target></configuration></plugin><plugin><!-- 我们想将所有的依赖库都打包,直接交给用户,这样用户不需要在做其他设置了,这里需要使用Assembly插件了,其说明参考Pre-definedDescriptor Files,这个参考文件也说明了有四种默认定义的打包方式,我们选择jar-with-dependencies,继续添加pom文件 --><artifactId>maven-assembly-plugin</artifactId><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy</id><phase>install</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>$/lib</outputDirectory><!-- 拷贝所以依赖存放位置 --></configuration></execution></executions></plugin></plugins></pluginManagement></build></project>
SQL
——————————————————————–
web.xml
——————————————————
src/main/resources/applicationContext.xml
——————————————————————–
-
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061Xml代码<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd"default-autowire="byName" default-lazy-init="true"><context:component-scan base-package="com"><context:exclude-filter expression="org.springframework.stereotype.Controller"type="annotation" /></context:component-scan><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><value>classpath:jdbc.properties</value></property></bean><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"p:packagesToScan="com.pandy.ssh4.domian"><property name="dataSource"><ref bean="dataSource" /></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">false</prop><prop key="hibernate.format_sql">false</prop><prop key="hibernate.cache.use_query_cache">true</prop><prop key="hibernate.cache.use_second_level_cache">true</prop><prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop><prop key="hibernate.cache.use_structured_entries">true</prop><prop key="hibernate.generate_statistics">true</prop></props></property></bean><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory"><ref local="sessionFactory" /></property></bean><tx:annotation-driven transaction-manager="transactionManager"proxy-target-class="true" /></beans>
JBPM5sh-servlet.xml
——————————
src/main/resources/ehcache.xml
——————————————————-
这个是缓存配置
src/main/resources/jdbc.properties
———————————————————
jdbc.driver=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:log4jdbc:mysql://localhost:3306/jbpmtest?createDatabaseIfNotExist=true
#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/jbpmtest?createDatabaseIfNotExist=true
jdbc.username=root
jdbc.password=root
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
src/main/resources/log4j.properties
—————————————————-
log4j.rootLogger=WARN, stdout
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%n
# log4jdbc
log4j.logger.jdbc.sqlonly=INFO
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF
src/main/java/com/pandy/ssh4/domian/BasicDomian.java
————————————————————————————–
src/main/java/com/pandy/ssh4/domian/Table3.java
——————————————————
src/main/java/com/pandy/ssh4/dao/BasicDao.java
—————————————————————————-
src/main/java/com/pandy/ssh4/dao/impl/Table3Dao.java
—————————————————————-
注意,query.setCacheable(true);//设定使用缓存是设定了缓存
src/main/java/com/pandy/ssh4/service/SampleService.java
————————————————————-
src/main/java/com/pandy/ssh4/controller/TestController.java
————————————————-
src/main/webapp/index.jsp
————————————————–
src/main/webapp/views/success.jsp
—————————————
src/main/webapp/views/failure.jsp
——————————————–
http://localhost:8080/JBPM5sh/doTest.do
———————————————–OUTPUT
12:47:13,628 INFO sqlonly:236 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy’, NULL)
12:47:13,630 INFO sqltiming:357 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy’, NULL) {executed in 0 msec}
12:47:13,638 WARN JdbcCoordinatorImpl:411 – HHH000387: ResultSet’s statement was not registered
—————————————-增加完成
12:47:13,887 INFO sqlonly:236 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_
12:47:13,888 INFO sqltiming:357 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_ {executed in 1 msec}
Table3 [id=13, name=pandy, password=null, email=panyongzheng@163.com]
验证完成
—————————————-修改完成
12:47:13,917 INFO sqlonly:236 – update TABLE3 set EMAIL=’panyongzheng@163.com’, NAME=’New Name’, PASSWORD=NULL where ID=13
12:47:13,918 INFO sqltiming:357 – update TABLE3 set EMAIL=’panyongzheng@163.com’, NAME=’New Name’, PASSWORD=NULL where ID=13
{executed in 1 msec}
12:47:13,920 INFO sqlonly:236 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_
12:47:13,921 INFO sqltiming:357 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_ {executed in 1 msec}
Table3 [id=13, name=New Name, password=null, email=panyongzheng@163.com]
验证完成
—————————————-删除完成 id=13
12:47:13,924 INFO sqlonly:236 – delete from TABLE3 where ID=13
12:47:13,925 INFO sqltiming:357 – delete from TABLE3 where ID=13 {executed in 0 msec}
12:47:13,926 INFO sqlonly:236 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_
12:47:13,927 INFO sqltiming:357 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_ {executed in 1 msec}
验证完成
—————————————-增加两个记录来测试缓存
12:47:14,021 INFO sqlonly:236 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy1’, NULL)
12:47:14,022 INFO sqltiming:357 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy1’, NULL)
{executed in 0 msec}
12:47:14,023 WARN JdbcCoordinatorImpl:411 – HHH000387: ResultSet’s statement was not registered
12:47:14,024 INFO sqlonly:236 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy2’, NULL)
12:47:14,025 INFO sqltiming:357 – insert into TABLE3 (EMAIL, NAME, PASSWORD) values (‘panyongzheng@163.com’, ‘pandy2’, NULL)
{executed in 0 msec}
12:47:14,026 WARN JdbcCoordinatorImpl:411 – HHH000387: ResultSet’s statement was not registered
—————————————-增加两个记录信息
12:47:14,028 INFO sqlonly:236 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_
12:47:14,029 INFO sqltiming:357 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_ {executed in 1 msec}
listAll-> Table3 [id=14, name=pandy1, password=null, email=panyongzheng@163.com]
listAll-> Table3 [id=15, name=pandy2, password=null, email=panyongzheng@163.com]
—————第一次查询——————–
12:47:14,103 INFO sqlonly:236 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_
12:47:14,104 INFO sqltiming:357 – select table3x0_.ID as ID1_0_, table3x0_.EMAIL as EMAIL2_0_, table3x0_.NAME as NAME3_0_, table3x0_.PASSWORD
as PASSWORD4_0_ from TABLE3 table3x0_ {executed in 1 msec}
2
—————第二次查询——————–
2
—————缓存信息——————–
Statistics[start time=1368852423495,sessions opened=3,sessions closed=2,transactions=2,successful transactions=2,optimistic lock failures=0,flushes=3,connections obtained=3,statements prepared=10,statements closed=0,second level cache puts=2,second level cache hits=0,second level cache misses=0,entities loaded=2,entities updated=1,entities inserted=3,entities deleted=1,entities fetched=0,collections loaded=0,collections updated=0,collections removed=0,collections recreated=0,collections fetched=0,naturalId queries executed to database=0,naturalId cache puts=0,naturalId cache hits=0,naturalId cache misses=0,naturalId max query time=0,queries executed to database=5,query cache puts=1,query cache hits=1,query cache misses=1,update timestamps cache puts=7,update timestamps cache hits=1,update timestamps cache misses=0,max query time=12]
put:2
hit:0
miss:0
注意到第二次查询。不再查询数据库,就是缓存了。