提问者:小点点

JPA EntityManager工厂对于主页、J2EE来说需要3-4秒的时间


我正在JBoss服务器上使用J2EE构建一个网站,并且我有一个通过JPA连接的数据库。

但是这一行:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceService");

大约需要3-4秒。什么是正常的做法来更快地得到它?

我读:Hibernate更快的EntityManagerFactory创建

但它在这里不适用,因为我没有应用程序,我有一个网站,我没有动态db-url,它总是一样的。

如果它是一个普通的应用程序,我会在用户需要它之前在初始化它时开始一个线程。但这是一个网站,所以我不能这样做。如果我将它存储在服务器上,让用户从前端调用它,我想当同时有太多用户请求时会出现大量问题。

这是它抛出的一些日志信息:

WARN HibernatePersistence:58 - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
INFO Environment:239 - HHH000206: hibernate.properties not found
INFO Environment:346 - HHH000021: Bytecode provider name : javassist
DEBUG BasicTypeRegistry:146 - Adding type registration boolean -> org.hibernate.type.BooleanType@764e2837 // this line about 40 times
WARN DriverManagerConnectionProviderImpl:93 - HHH000402: Using Hibernate built-in connection pool (not for production use!)
11:52:30,793  INFO DriverManagerConnectionProviderImpl:166 - HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://...]
11:52:30,793  INFO DriverManagerConnectionProviderImpl:175 - HHH000046: Connection properties: {user=******, password=****}
11:52:30,793  INFO DriverManagerConnectionProviderImpl:180 - HHH000006: Autocommit mode: false
11:52:30,795  INFO DriverManagerConnectionProviderImpl:102 - HHH000115: Hibernate connection pool size: 20 (min=1)
11:52:32,895  INFO Dialect:145 - HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect
11:52:32,913  INFO LobCreatorBuilder:123 - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
11:52:33,116  INFO ASTQueryTranslatorFactory:47 - HHH000397: Using ASTQueryTranslatorFactory

从我的持久. xml:

<persistence-unit name="PlayerService" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>

编辑:

好吧我试过用

@PersistenceContext(unitName="PlayerService") private EntityManager em;

但是当我尝试使用它时,em是null。我有正确的jar吗

<provider>org.hibernate.ejb.HibernatePersistence</provider>

<persistence-unit name="PlayerService" transaction-type="JTA">

?我有hibernate-entitymanager-4.3.1.Final。jar。

我读到一些关于我只能在bean中使用@PeristenceContext(…)的东西,但是我如何将一个类声明为bean?


共1个答案

匿名用户

您正在尝试做的是在J2SE应用程序中常用的,您需要调用持久引导来获取对EntityManagerFactory的引用并自己完成所有循环,但在J2EE中这种方法不是这样使用的。

您应该考虑用户容器管理的EntityManager

当使用容器管理的实体管理器时,持久性上下文的生命周期总是自动管理的,对应用程序透明,并且持久性上下文与JTA事务一起传播。

容器管理的持久性上下文可以定义为具有范围为单个事务的生命周期或跨越多个事务的扩展生命周期,具体取决于在创建其实体管理器时指定的PerstienceContextType。本规范将此类持久性上下文分别称为事务范围的持久性上下文和扩展持久性上下文。

考虑更改您的实现以使用这种方法,因为EntityManager可以使用@PeristenceContext可用,并且开始使用EM不需要超过ms。

@PersistenceContext(unitName="")
EntityManager em;

对其进行更改非常简单,只需在META-INF中向您的Web应用程序添加持久化. xml,确保您拥有提供的jar。

容器托管实体管理器的持久性范围默认为Transaction。事务类型始终为JTA。

为了能够使用EJB,请使用这种方法。

@Stateless
public class TriggerPersister {

    @PersistenceContext(unitName="PlayerService") 
    private EntityManager entityManager;

不要忘记到位META-INF/持久化. xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">


<!-- Add the persistence context for OrderDetail -->
<persistence-unit name="PlayerService"
    transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <jta-data-source>jdbc/myDs</jta-data-source>
            <class>our.class<class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
        <property name="hibernate.hbm2ddl.auto" value="validate" />
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
        <property name="hibernate.connection.charSet" value="UTF-8" />
        <property name="hibernate.show_sql" value="true" />
    </properties>
</persistence-unit>

您应该在jboss的部署文件夹中有一个有效的dataSource。和jta-data-source标记来指示将使用该应用程序的内容

检查此链接https://docs.jboss.org/jbossas/docs/Server_Configuration_Guide/4/html/Connectors_on_JBoss-Configuring_JDBC_DataSources.html