WildFly/Jboss/persistance-unit/实体管理器-如何在每次用户调用GET API端点时创建新连接

hec6srdp  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在尝试修改现有的Java应用程序(WildFly、Jboss、oracle),当前使用持久性单元和EntityManager连接到Oracle数据库时运行良好(使用standalone.xml和persistence.xml)。但是,每次我都需要为用户创建到数据库的新连接,该用户使用HttpHeaders中的凭据调用新的GET API端点。目前,我正在创建新的entitymanager对象,该对象的会话是提交的,回滚和关闭。不幸的是,每次调用的响应时间越来越长。有警告说“PersistenceUnitUser”已经注册,内存使用量不断增加。所以这是一个糟糕的解决方案。
有没有一个合适的方法来做这件事,它的工作没有任何伤害?
P.S.当前应用程序使用standalone.xml和persistence.xml。运行良好。我使用实体管理器调用java api端点,以管理员用户/通行证身份连接,但我需要使用httpHeaders中的用户/通行证创建新连接,并调用一条sql语句以查看正确的结果,因为ORACLE使用保留字,如us:'user'。例如:从create_usr = user的表中选择 *。完成后,主EntityManager将使用其中的数据继续某些进程。
请参见下面的代码示例:

@GET
  @Path("/todo-list-enriched")
  @Produces(MediaType.APPLICATION_JSON)
  public Response getToDoListEnriched(@Context HttpHeaders httpHeaders, @QueryParam("skip") int elementNumber, @QueryParam("take") int pageSize, @QueryParam("orderby") String orderBy) 
{
    String userName = httpHeaders.getHeaderString(X_USER_NAME);
    String userName = httpHeaders.getHeaderString(X_PASSWORD);

EntityManager entityManager = null;

try {

Map<String, String> persistenceMap = new HashMap<String, String>();

persistenceMap.put("hibernate.dialect","org.hibernate.dialect.Oracle8iDialect");
persistenceMap.put("hibernate.connection.username", asUserName);
persistenceMap.put("hibernate.connection.password", asPassword);

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnitUser", persistenceMap);

entityManager = emf.createEntityManager();

if (!entityManager.getTransaction().isActive()) {
   entityManager.getTransaction().begin();
}

-- Do some works as select, update, select 
-- and after that 

if (entityManager.getTransaction().isActive()) {
     entityManager.getTransaction().commit();
 }
}
catch (Exception ex)
{
 if (entityManager != null && entityManager.getTransaction().isActive()) {
  entityManager.getTransaction().rollback();
 }
}
finally {
  if (entityManager != null && entityManager.isOpen()) {
   entityManager.close();
 }
}

}
}

``

Best Regards
Marcin
92vpleto

92vpleto1#

您应该在standalone.xml中定义联机缓冲池和数据来源(请参阅https://docs.wildfly.org/26.1/Admin_Guide.html#DataSource),然后在persistence.xml中使用它,并将EntityManager注入您的rest服务类别(请参阅https://docs.wildfly.org/26.1/Developer_Guide.html#entity-manager)。您可以查看这个范例应用程序:https://github.com/wildfly/quickstart/tree/main/todo-backend

相关问题