2010-05-05 278 views
1

每次我调用JPA方法创建实体和绑定查询。JPA实体管理器资源处理

我的持久性属性是:

<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/> 
<property name="hibernate.cache.use_second_level_cache" value="true"/> 
<property name="hibernate.cache.use_query_cache" value="true"/> 

而且我创建实体管理器如下方式:

emf = Persistence.createEntityManagerFactory("pu"); 
em = emf.createEntityManager(); 
em = Persistence.createEntityManagerFactory("pu").createEntityManager(); 

有管理的实体管理器的资源,而不是创造新的每次或任何好方法任何属性都可以设置为持久性。请记住它是JPA。

参见绑定日志下面每次:

 
15:35:15,527 INFO [AnnotationBinder] Binding entity from annotated class: * 
15:35:15,527 INFO [QueryBinder] Binding Named query: * => * 
15:35:15,527 INFO [QueryBinder] Binding Named query: * => * 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [QueryBinder] Binding Named query: 
15:35:15,527 INFO [EntityBinder] Bind entity com.* on table * 
15:35:15,542 INFO [HibernateSearchEventListenerRegister] Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 
15:35:15,542 INFO [NamingHelper] JNDI InitialContext properties:{} 
15:35:15,542 INFO [DatasourceConnectionProvider] Using datasource: 
15:35:15,542 INFO [SettingsFactory] RDBMS: 
and Real Application Testing options 
15:35:15,542 INFO [SettingsFactory] JDBC driver: Oracle JDBC driver, version: 9.2.0.1.0 
15:35:15,542 INFO [Dialect] Using dialect: org.hibernate.dialect.Oracle10gDialect 
15:35:15,542 INFO [TransactionFactoryFactory] Transaction strategy: org.hibernate.transaction.JDBCTransactionFactory 
15:35:15,542 INFO [TransactionManagerLookupFactory] No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recomm 
ended) 
15:35:15,542 INFO [SettingsFactory] Automatic flush during beforeCompletion(): disabled 
15:35:15,542 INFO [SettingsFactory] Automatic session close at end of transaction: disabled 
15:35:15,542 INFO [SettingsFactory] JDBC batch size: 15 
15:35:15,542 INFO [SettingsFactory] JDBC batch updates for versioned data: disabled 
15:35:15,542 INFO [SettingsFactory] Scrollable result sets: enabled 
15:35:15,542 INFO [SettingsFactory] JDBC3 getGeneratedKeys(): disabled 
15:35:15,542 INFO [SettingsFactory] Connection release mode: auto 
15:35:15,542 INFO [SettingsFactory] Default batch fetch size: 1 
15:35:15,542 INFO [SettingsFactory] Generate SQL with comments: disabled 
15:35:15,542 INFO [SettingsFactory] Order SQL updates by primary key: disabled 
15:35:15,542 INFO [SettingsFactory] Order SQL inserts for batching: disabled 
15:35:15,542 INFO [SettingsFactory] Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 
15:35:15,542 INFO [ASTQueryTranslatorFactory] Using ASTQueryTranslatorFactory 
15:35:15,542 INFO [SettingsFactory] Query language substitutions: {} 
15:35:15,542 INFO [SettingsFactory] JPA-QL strict compliance: enabled 
15:35:15,542 INFO [SettingsFactory] Second-level cache: enabled 
15:35:15,542 INFO [SettingsFactory] Query cache: enabled 
15:35:15,542 INFO [SettingsFactory] Cache region factory : org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge 
15:35:15,542 INFO [RegionFactoryCacheProviderBridge] Cache provider: net.sf.ehcache.hibernate.SingletonEhCacheProvider 
15:35:15,542 INFO [SettingsFactory] Optimize cache for minimal puts: disabled 
15:35:15,542 INFO [SettingsFactory] Structured second-level cache entries: disabled 
15:35:15,542 INFO [SettingsFactory] Query cache factory: org.hibernate.cache.StandardQueryCacheFactory 
15:35:15,542 INFO [SettingsFactory] Statistics: disabled 
15:35:15,542 INFO [SettingsFactory] Deleted entity synthetic identifier rollback: disabled 
15:35:15,542 INFO [SettingsFactory] Default entity-mode: pojo 
15:35:15,542 INFO [SettingsFactory] Named query checking : enabled 
15:35:15,542 INFO [SessionFactoryImpl] building session factory 
15:35:15,542 INFO [SessionFactoryObjectFactory] Not binding factory to JNDI, no JNDI name configured 
15:35:15,542 INFO [UpdateTimestampsCache] starting update timestamps cache at region: org.hibernate.cache.UpdateTimestampsCache 
15:35:15,542 INFO [StandardQueryCache] starting query cache at region: org.hibernate.cache.StandardQueryCache 

回答

1

创建EntityManager并不昂贵,并且典型地为每一个请求完成的;然而,创建一个EntityManagerFactory非常昂贵,应该只做一次。

在Java SE应用程序中,这通常在应用程序的开始时完成。基本上,将EMF保存在工厂或助手类的静态变量中。只要不要忘记emf.close()它在你的申请结束。对于一些示例,参见this postthis one

+1

感谢您的回复。我在Java EE应用程序中使用JPA。它在容器外面。纯粹的JPA。但是,要频繁使用应用程序,并且流量非常大,因此需要进行高效编码和配置才能获得高性能。 对不起,创建实体经理工厂是错字。那么,我怎样才能高效地处理实体经理工厂,而不是每次创建。 – user333800 2010-05-06 14:41:23