使用EclipseLink获取数据库备份/转储

时间:2016-07-20 20:21:31

标签: java eclipselink entitymanager dropwizard

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

由于

1 个答案:

答案 0 :(得分:0)

这对你来说相当容易,但我不认为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,所以行为可能略有不同。

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

Artur