【发布时间】:2022-11-19 08:25:46
【问题描述】:
我的 java play 框架 (2.3) 应用程序出现了奇怪的情况。一切正常如果我已经部署了我的应用程序关闭(地理上)我的数据库 mysql。该请求与数据库的连接工作正常且快速。但是,最后一天,我将数据库远程移动到另一个国家。该应用程序运行良好,但是,每次我创建一个 JPA 实体管理器(并且我认为该应用程序创建一个到远程数据库的新连接)时,连接速度非常非常慢。结果是所有请求都非常慢。
根据您的经验,有没有办法通过应用程序优化这种情况?
在我的控制器 java 代码下面:
@Transactional
public Result testperson() {
Person person= JPAEntityManager.find(Person .class, "XXXXXX");
person.setAddress("XXXXXXX");
JPA.em().persist(person);
return ok("");
}
@Transactional 注释拦截连接的播放框架 jpa 实现:
public static <T> F.Promise<T> withTransactionAsync(String name, boolean readOnly, play.libs.F.Function0<F.Promise<T>> block) throws Throwable {
EntityManager em = null;
EntityTransaction tx = null;
try {
em = JPA.em(name);
JPA.bindForCurrentThread(em);
if(!readOnly) {
tx = em.getTransaction();
tx.begin();
}
F.Promise<T> result = block.apply();
final EntityManager fem = em;
final EntityTransaction ftx = tx;
F.Promise<T> committedResult = result.map(new F.Function<T, T>() {
@Override
public T apply(T t) throws Throwable {
try {
if(ftx != null) {
if(ftx.getRollbackOnly()) {
ftx.rollback();
} else {
ftx.commit();
}
}
} finally {
fem.close();
}
return t;
}
});
committedResult.onFailure(new F.Callback<Throwable>() {
@Override
public void invoke(Throwable t) {
if (ftx != null) {
try { if (ftx.isActive()) ftx.rollback(); } catch(Throwable e) {}
}
fem.close();
}
});
return committedResult;
} catch(Throwable t) {
if(tx != null) {
try { tx.rollback(); } catch(Throwable e) {}
}
if(em != null) {
em.close();
}
throw t;
} finally {
JPA.bindForCurrentThread(null);
}
}
JPA.em() 创建一个新的 EntityManager ...
播放框架的所有连接详细信息都是默认的:https://www.playframework.com/documentation/2.3.x/SettingsJDBC
也许在远程连接期间MySQl数据库有问题? 可以在数据库端设置一些设置来改善远程连接吗?
提前致谢!
【问题讨论】:
-
通常这种情况发生在 JPA 开始急切地加载数据时,突然有 100 到 100 条语句进入数据库。如果数据库和应用程序未并置,这将变得更加明显。如果您在本地运行应用程序并配置休眠以显示 SQL 语句,您是否看到正在执行大量查询?而且我假设您正在使用连接池,了解它的配置会很好。
-
连接池默认由应用程序管理。我没有看到在启动时执行了很多查询...每当创建新的实体管理器时,所有调用都会出现这种延迟,因此我认为这不是急切/延迟加载数据...
标签: java mysql hibernate jpa playframework