使用 EclipseLink 获取数据库 backup/dump

Get the database backup/dump with EclipseLink

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

谢谢

这对您来说相当容易,但我认为 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();
    }

所以,有几点:

您不需要直接访问数据源。快速 google 显示 eclipselink 将使您能够像这样访问您的连接:

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

或者,这也有效(并且不使用任何 connection/jdbc 属性):

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

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

  • 将文件名传递到资源中以便您的 DBA 知道在何处创建转储?
  • 写入临时位置,读取转储和return流(供下载)

我不认为你可以让 h2db 为你 return 转储。但是我可能是错的。

编辑:我错了

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

试一试,看看调试器输出了什么。正如我所说,我没有使用 EclipseLink,因此行为可能略有不同。

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

阿图尔