# Hibernate OSCache 配置示例教程

> 原文： [https://howtodoinjava.com/hibernate/hibernate-oscache-configuration-example-tutorial/](https://howtodoinjava.com/hibernate/hibernate-oscache-configuration-example-tutorial/)

[**OSCache**](//howtodoinjava.com/category/frameworks/oscache/ "oscache tutorials") 是 OpenSymphony 开发的 Java 框架，可轻松在 Web 应用中缓存内容。 使用 Hiberate ，可以将其配置为充当[**二级缓存**](//howtodoinjava.com/hibernate/how-hibernate-second-level-cache-works/ "How hibernate second level cache works?") 。

在我的前一篇文章中，我们了解了[**为 Hiberate**](//howtodoinjava.com/hibernate/hibernate-ehcache-configuration-tutorial/ "Hibernate EhCache configuration tutorial") 配置 EhCache 的过程，这是 Hiberate 中的默认二级缓存。 在本文中，我以使用 [**Hiberate**](//howtodoinjava.com/hibernate-tutorials/ "hibernate tutorials") 配置 OSCache 为例。

```java
Sections in this post: 
Runtime dependencies
Hibernate configuration
In memory cache example
Physical cache example
```

## 运行时依赖项

我已经使用 [**Maven**](//howtodoinjava.com/maven/ "maven tutorials") 来管理项目依赖项，并且`pom.xml`文件中的必要补充是：

```java
<repositories>
	<repository>
	  <id>repository.jboss.org-public</id>
	  <name>JBoss.org Maven repository</name>
	  <url>https://repository.jboss.org/nexus/content/groups/public</url>
	</repository>  
</repositories>

<!-- OSCache dependencies -->
<dependency>
	<groupId>opensymphony</groupId>
	<artifactId>oscache</artifactId>
	<version>2.4.1</version>
</dependency>
<dependency>
  <groupId>javax.jms</groupId>
  <artifactId>jms</artifactId>
  <version>1.1</version>
</dependency>

```

如果您不使用 maven，则**在项目构建路径中添加相应的 jar 文件**。

## Hiberate 配置

在项目中配置 OSCache 的唯一更改是，必须在 Hiberate 配置文件中创建 `hibernate.cfg.xml`文件：

```java
	<!-- Cache provider class -->
	<property name="hibernate.cache.provider_class">org.hibernate.cache.OSCacheProvider</property>

```

## 内存中的缓存示例

这是默认实现，如果未配置物理缓存属性，则会得到它。 让我们看一下测试代码示例：

```java
	try
	{
		//Open the hibernate session
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		//fetch the department entity from database first time
		DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		//fetch the department entity again; Fetched from first level cache
		department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		//Let's close the session
		session.getTransaction().commit();
		session.close();

		//Try to get department in new session
		Session anotherSession = HibernateUtil.getSessionFactory().openSession();
		anotherSession.beginTransaction();

		//Here entity is already in second level cache so no database query will be hit
		department = (DepartmentEntity) anotherSession.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		anotherSession.getTransaction().commit();
		anotherSession.close();
	}
	finally
	{
		System.out.println(HibernateUtil.getSessionFactory().getStatistics().getEntityFetchCount()); //Prints 1
		System.out.println(HibernateUtil.getSessionFactory().getStatistics().getSecondLevelCacheHitCount()); //Prints 1

		HibernateUtil.shutdown();
	}

	Output in console:

	Hibernate: insert into DEPARTMENT (NAME) values (?)
	Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=?
	Human Resource
	Human Resource
	Human Resource
	1
	1

```

您将一次又一次地获得此输出，因为每次关闭 Hiberate 时，都会刷新内存并在下次运行时构建二级缓存。

## 物理缓存示例

如果您要构建的缓存非常大，则最好在文件系统中构建它（例如 Windows 中的 C 驱动器）。 这将防止 Hiberate 在每次重新启动应用时建立高速缓存。 同样，[二级缓存提取规则](//howtodoinjava.com/hibernate/how-hibernate-second-level-cache-works/ "How hibernate second level cache works?")仍然适用。

要启用物理缓存，请下载[**`oscache.properties`**](https://svn.apache.org/repos/asf/db/ojb/trunk/src/config/oscache.properties "download oscache.properties")文件，并取消注释以下几行：

```java
cache.memory=false
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
cache.path=c:/temp/cache
cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache
```

让我们看一下测试代码示例：

```java
	try
	{
		//Open the hibernate session
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		//fetch the department entity from database first time
		DepartmentEntity department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		//fetch the department entity again; Fetched from first level cache
		department = (DepartmentEntity) session.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		//Let's close the session
		session.getTransaction().commit();
		session.close();

		//Try to get department in new session
		Session anotherSession = HibernateUtil.getSessionFactory().openSession();
		anotherSession.beginTransaction();

		//Here entity is already in second level cache so no database query will be hit
		department = (DepartmentEntity) anotherSession.load(DepartmentEntity.class, new Integer(1));
		System.out.println(department.getName());

		anotherSession.getTransaction().commit();
		anotherSession.close();
	}
	finally
	{
		System.out.println(HibernateUtil.getSessionFactory().getStatistics().getEntityFetchCount()); //Prints 1
		System.out.println(HibernateUtil.getSessionFactory().getStatistics().getSecondLevelCacheHitCount()); //Prints 1

		HibernateUtil.shutdown();
	}

	Output in console:

	Hibernate: insert into DEPARTMENT (NAME) values (?)
	Hibernate: select department0_.ID as ID0_0_, department0_.NAME as NAME0_0_ from DEPARTMENT department0_ where department0_.ID=?
	Human Resource
	Human Resource
	Human Resource
	1
	1

```

上面的代码将在“`c:/tempcache`”位置创建物理缓存。

![physical oscache example](img/ba6c259b602d65bbb3ac198dfba33d21.png "physical oscache example")

下次再次运行示例代码时，将获得以下输出：

```java
	Hibernate: insert into DEPARTMENT (NAME) values (?)
	Human Resource
	Human Resource
	Human Resource
	0
	2

```

将部门实体存储在物理二级缓存中并从那里获取的原因很简单。 因此 Hiberate 将不会再次进入数据库。

要下载该项目的源代码，请遵循给定的链接。


**祝您学习愉快！**