【问题标题】:Slow connection between java jpa application and a remote Mysql database?java jpa 应用程序和远程 Mysql 数据库之间的连接速度慢?
【发布时间】: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


【解决方案1】:

SELECT 1需要多长时间?这给了你一个很好的线索新的的开销每一个SQL 语句,因为到达“另一个国家”。

如果事实证明存在“太多”查询,请考虑将一组查询包装在存储过程中。然后让您的应用程序CALLSP——这将是一次往返,不多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2011-12-06
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多