【问题标题】:Get the database backup/dump with EclipseLink使用 EclipseLink 获取数据库备份/转储
【发布时间】:2016-11-24 05:10:19
【问题描述】:

有没有办法通过 EclipseLink 实体管理器创建数据库转储/备份? 我想向我的 java (dropwizard) 项目添加一个功能,允许管理员下载当前数据库(并可能导入一个新数据库)。 我正在使用 H2 数据库。

谢谢

【问题讨论】:

  • 有趣的问题(至少在理论上)。我不确定是否可能,但请告诉我是否有人有解决方案。我认为最好是考虑“将所有实体从数据库导出到某个存档”
  • 2.大多数数据库(但不是全部)都可以通过 sql 命令备份,因此也许可以通过 JPA 原始 SQL 接口传递命令。这与 JPA 定义无关。

标签: java eclipselink entitymanager dropwizard


【解决方案1】:

这对你来说相当容易,但我认为 EntityManager 不会这样做

(这不是 100% 正确的 - 但我无法弄清楚如何,所以我向您展示了您也可以与 EM 一起使用的直接替代方案)

所以先决条件:

您需要拥有 H2DB 并且需要绑定数据源(或从实体管理器解包连接)。那么你要运行的命令是:

SCRIPT TO '/path/to/my/file'

例如,我是这样实现的:

    @Inject
    private DataSource ds;

    @GET
    @Path("dump")
    public Response dump() {


        try (Connection c = ds.getConnection(); Statement s = c.createStatement()) {

            s.execute("SCRIPT TO '/home/artur/tmp/test/test.sql'");

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return Response.ok().build();
    }

所以,有几点:

您不需要直接访问数据源。一个快速的谷歌透露,eclipselink 会让你像这样访问你的连接:

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();

或者,这也可以工作(并且不使用任何连接/jdbc 属性):

emp.get().createNativeQuery("SCRIPT TO '/home/artur/tmp/test/test.sql'").getResultList();

我不知道你想做什么,但你可以:

  • 将文件名传递到资源中,以便您的 DBA 知道转储的创建位置?
  • 写入临时位置,读取转储并返回流(用于下载)

我认为您不能让 h2db 为您返回转储。不过我可能是错的。

编辑:我错了

entityManager 方法将返回一个包含整个 SQL 转储的结果列表。所以你在代码和文件中都有它(你可以删除你的文件)。

试一试,看看调试器会吐出什么。就像我说的,我没有使用 EclipseLink,所以行为可能会略有不同。

玩得开心,我希望能解决你的问题:)

阿图尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多