我正在尝试修改现有的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
1条答案
按热度按时间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