diff --git a/Sda2/P/Jpa/HibernateCacheDemo/pom.xml b/Sda2/P/Jpa/HibernateCacheDemo/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3183ab898eff31df25392d197d0210e7cad7721 --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/pom.xml @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<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.mastertheboss</groupId> + <artifactId>EclipseJPAExample</artifactId> + <version>1.0-SNAPSHOT</version> + <repositories> + <repository> + <id>EclipseLink Repo</id> + <url>http://download.eclipse.org/rt/eclipselink/maven.repo</url> + <name>EclipseLink Repo</name> + </repository> + </repositories> + <dependencies> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>5.1.33</version> + </dependency> + +<!-- + <dependency> + <groupId>org.hibernate.javax.persistence</groupId> + <artifactId>hibernate-jpa-2.1-api</artifactId> + <version>1.0.0.Final</version> + </dependency> + + <dependency> + <groupId>net.sf.ehcache</groupId> + <artifactId>ehcache</artifactId> + <version>2.8.3</version> + </dependency> + + --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + <version>4.2.16.Final</version> + </dependency> + + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-entitymanager</artifactId> + <version>4.2.16.Final</version> + </dependency> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-ehcache</artifactId> + <version>4.2.16.Final</version> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>1.7.9</version> + </dependency> + + </dependencies> +</project> diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java new file mode 100644 index 0000000000000000000000000000000000000000..825b1c63c94f3ae438542920c5e02ed59e14acf1 --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/JpaTest.java @@ -0,0 +1,126 @@ +package de.hdm_stuttgart.mi.sda2.ehcache; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.CacheManager; +import de.hdm_stuttgart.mi.sda2.ehcache.domain.Department; +import de.hdm_stuttgart.mi.sda2.ehcache.domain.Employee; + +public class JpaTest { + + private static EntityManager manager1, manager2, manager3; + + /** + * @param args + */ + public static void main(String[] args) { + + + EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit"); + manager1 = factory.createEntityManager(); + manager2 = factory.createEntityManager(); + manager3 = factory.createEntityManager(); + + System.out.println("manager1 == manager2:" + (manager1 == manager2)); + + + try { + createEmployees(manager1); + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("Reading employees by manager 1"); + final Employee emp1[] = listEmployees(manager1); + System.out.println("-------------------"); + + findEmployees(manager2, emp1); + findEmployees(manager3, emp1); + + displayCacheState(); + + System.out.println("Reading employees by manager 3"); + listEmployees(manager3); + System.out.println("-------------------"); + + displayCacheState(); + } + + private static void findEmployees(final EntityManager manager, final Employee[] employees) { + final EntityTransaction tx = manager.getTransaction(); + + tx.begin(); + { + for (final Employee e: employees) { + System.out.println("Loading employee #" + e.getId() + " by manager " + manager); + System.out.println(" ->" + manager.find(Employee.class, e.getId())); + } + } + tx.commit(); + } + + private static void displayCacheState() { + for (CacheManager cm : CacheManager.ALL_CACHE_MANAGERS) { + System.out.println("----------- CacheManager:" + cm.getName()); + for (final String item: cm.getCacheNames()) { + System.out.println("Cache:" + item); + analyzeCache(cm, item); + System.out.println("-------------------"); + } + } + } + + private static void analyzeCache(final CacheManager cm, final String cacheName) { + Cache cache = cm.getCache(cacheName); + + System.out.println("isDisabled=" +cache.isDisabled()); + + System.out.println("hit count:" + cache.getLiveCacheStatistics().getCacheHitCount()); + + List<?> cachedObjects = cache.getKeys(); + System.out.println("Num of objects in cache:" + cachedObjects.size()); + for (final Object key: cachedObjects) { + System.out.println("key:" + key); + } + } + + private static void createEmployees(final EntityManager manager) { + final EntityTransaction tx = manager.getTransaction(); + tx.begin(); + { + int numOfEmployees = manager.createQuery("Select a From Employee a", Employee.class).getResultList().size(); + if (numOfEmployees == 0) { + Department department = new Department("java"); + manager.persist(department); + + manager.persist(new Employee("Jakab Gipsz",department)); + manager.persist(new Employee("Captain Nemo",department)); + } + } + tx.commit(); + } + + private static Employee[] listEmployees(final EntityManager manager) { + final EntityTransaction tx = manager.getTransaction(); + + List<Employee> resultList; + tx.begin(); + { + resultList = manager.createQuery("Select a From Employee a", Employee.class). + setHint("org.hibernate.cacheable", true).getResultList(); + System.out.println("num of employess:" + resultList.size()); + for (Employee next : resultList) { + manager.find(Employee.class, next.getId()); + System.out.println("next employee: " + next); + } + } + tx.commit(); + return resultList.toArray(new Employee[0]); + } +} diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java new file mode 100644 index 0000000000000000000000000000000000000000..081cb52e75748ddb8b8977f010c1f4f7e1349e45 --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Department.java @@ -0,0 +1,52 @@ +package de.hdm_stuttgart.mi.sda2.ehcache.domain; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Cacheable; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +@Entity +@Cacheable(true) +public class Department { + + @Id + @GeneratedValue + private Long id; + + private String name; + + @OneToMany(mappedBy="department",cascade=CascadeType.PERSIST) + private List<Employee> employees = new ArrayList<Employee>(); + + + + public Department() { + super(); + } + public Department(String name) { + this.name = name; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public List<Employee> getEmployees() { + return employees; + } + public void setEmployees(List<Employee> employees) { + this.employees = employees; + } +} diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java new file mode 100644 index 0000000000000000000000000000000000000000..0c1bcfa3904618d8cc1422696739a89f7e7e972f --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/java/de/hdm_stuttgart/mi/sda2/ehcache/domain/Employee.java @@ -0,0 +1,63 @@ +package de.hdm_stuttgart.mi.sda2.ehcache.domain; + +import javax.persistence.Cacheable; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +@Cacheable(true) +public class Employee { + @Id + @GeneratedValue + private Long id; + + private String name; + + @ManyToOne + private Department department; + + public Employee() {} + + public Employee(String name, Department department) { + this.name = name; + this.department = department; + } + + + public Employee(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", name=" + name + ", department=" + + department.getName() + "]"; + } + +} diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..00e20063de5d3f50ef6013a82f308bdaa2cdfd0a --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" + version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> + <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> + + <provider>org.hibernate.ejb.HibernatePersistence</provider> + + <class>de.hdm_stuttgart.mi.sda2.ehcache.domain.Employee</class> + <class>de.hdm_stuttgart.mi.sda2.ehcache.domain.Department</class> + + <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> + <properties> + + <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> + <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hdm" /> + <property name="javax.persistence.jdbc.user" value="hdmuser" /> + <property name="javax.persistence.jdbc.password" value="XYZ" /> + + <property name="hibernate.show_sql" value="true"/> + <property name="hibernate.hbm2ddl.auto" value="create-drop" /> + <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> + + + <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> + <property name="hibernate.cache.use_second_level_cache" value="true" /> + <property name="hibernate.cache.use_query_cache" value="true" /> + <property name="hibernate.generate_statistics" value="true" /> + + + </properties> + + </persistence-unit> +</persistence> \ No newline at end of file diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml new file mode 100644 index 0000000000000000000000000000000000000000..fbc01fcfd6835ea080a0d9638d0b449e2234c8d5 --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/ehcache.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ehcache> + <diskStore path="/tmp/ehcache"/> + <defaultCache maxElementsInMemory="10000" + eternal="false" + timeToIdleSeconds="300" + timeToLiveSeconds="600" + diskSpoolBufferSizeMB="30" + maxElementsOnDisk="10000" + diskExpiryThreadIntervalSeconds="120" + memoryStoreEvictionPolicy="LRU" statistics="true"> + </defaultCache> + + <cache + name="org.hibernate.cache.spi.UpdateTimestampsCache" + maxElementsInMemory="10000" + eternal="false"> + </cache> + + <cache + name="org.hibernate.cache.internal.StandardQueryCache" + maxElementsInMemory="10000" + eternal="false" + timeToLiveSeconds="300"> + </cache> + + <!-- + <cache name="XXX" + maxElementsInMemory="500" + eternal="true" + timeToIdleSeconds="0" + timeToLiveSeconds="0" + overflowToDisk="false" + /> + --> +</ehcache> \ No newline at end of file diff --git a/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..510abca9e3a412d0d4267772ac300083245ced29 --- /dev/null +++ b/Sda2/P/Jpa/HibernateCacheDemo/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ +log4j.rootLogger=INFO, 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file