java - 使用 eclipselink 和 java.sql 的 JPA : when connect to DB

标签 java mysql database jpa eclipselink

我更好地解释了我的问题,因为从标题来看它可能不是很清楚,但我没有找到一种方法来总结问题。基本上我有一个网络应用程序,其数据库有 5 个表。其中 3 个是使用 JPA 和 eclipselink 实现进行管理的。另外 2 个表是使用 java.sql 包直接使用 SQL 进行管理的。当我说“托管”时,我的意思只是查询、插入、删除和更新以两种不同的方式执行。 现在的问题是我必须监视每次调用数据库的响应时间。为了做到这一点,我有一个使用方面的库,并且在运行时我可以监视任何代码片段的执行时间。现在的问题是,如果我想监视数据库请求的响应时间(假设数据库位于远程,因此响应时间还包括网络延迟,但实际上这很好),所描述的两种不同情况是什么高于必须考虑执行时间的指令。 为了更清楚,我举一个例子。 假设使用 JPA 并执行数据库更新的情况。我有以下代码:

EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnit);
EntityManager em=emf.createEntityManager();
EntityToPersist e=new EntityToPersist();
em.persist(e);    

实际上,假设只有 em.persist(e) 指令连接并向数据库发出请求是正确的吗? 对于使用 java.sql 的问题也是如此:

Connection c=dataSource.getConnection();
Statement statement = c.createStatement();
statement.executeUpdate(stm);
statement.close();
c.close();    

在这种情况下,假设只有statement.executeUpdate(stm) 连接并向数据库发出请求是正确的吗? 如果知道的话可能会有用,实际上远程 DBMS 是 mysql。

我尝试在网络上搜索,但这是一个特殊的问题,我不确定要寻找什么才能在不阅读 JPA 或 java.sql 完整规范的情况下找到解决方案。 如果您有任何疑问或者我的描述中有任何不清楚的地方,请随时询问我。 提前非常感谢您。

最佳答案

在 JPA 中(在 EcliplseLink 中也是如此),您必须区分 SELECT 查询(不需要任何事务)和更改数据的查询(DELETE、CREATE、UPDATE:所有这些都需要事务)。当您选择数据时,测量Query.getResultList()的时间就足够了。 (和类似的调用)。对于其他操作(EntityManager.persist()merge()remove()),有 flushing 机制。 ,这基本上强制缓存中的查询队列(或单个查询)命中数据库。问题是 EntityManager 何时刷新:通常在事务提交时或当您调用 EntityManager.flush() 时。这里还有另一个问题:事务何时提交:答案是:这取决于您的连接设置(如果自动提交是否为 true),但非常正确的设置是 autocommit=false 以及何时开始并提交事务在您的代码中。

使用statement.executeUpdate(stm)时,仅测量此类调用就足够了。

PS:通常您不会直接连接到任何数据库,因为这是由池完成的(即使您使用 DataSource ),它只是为您提供一个已经建立的连接,但这又取决于您的设置.

PS2:对于 EclipseLink 来说,最正确的方法可能是查看源代码,以便找到何时进行内部刷新并测量该部分。

关于java - 使用 eclipselink 和 java.sql 的 JPA : when connect to DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29072847/

相关文章:

php - Laravel Dompdf 如何一起下载两个pdf文件

.net - 转义 SQL 查询 - 支持 .Net 中的不同数据库平台

java - 使用相关表中的 FK 列值更新表

java - 扫描可用的 wifi,检测特定的最强 Wifi SSID 以启动 XML Activity 布局

java 帮助文件未获取(.hs)

java - 来自 android market 的 NullPointerException 报告

php - 使用邻接列表模型管理 MySQL 中的分层数据

检查表信息是否存在时的 PHP/SQL 问题

java - 从 Android 应用程序比较其他表的表中删除一行

PHP 标准值为 NULL 并且不会更新