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

Java 使用EclipseLink获取数据库备份/转储,java,eclipselink,entitymanager,dropwizard,Java,Eclipselink,Entitymanager,Dropwizard,有没有办法通过EclipseLink实体管理器创建数据库转储/备份? 我想在我的java(dropwizard)项目中添加一个功能,允许管理员下载当前数据库(也许还可以在中导入一个新数据库)。 我正在使用H2数据库 谢谢这对您来说相当容易,但是我认为EntityManager不会这么做 (这不是100%正确-但我不知道如何解决,所以我向您介绍了一个简单的替代方案,您也可以使用EM) 因此,必须: 您需要拥有H2DB,并且需要绑定数据源(或者从实体管理器中打开连接)。那么您要运行的命令是: SCR

有没有办法通过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();
    }
因此,有几点:

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

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
或者,这也可以工作(并且不使用任何连接/jdbc属性):

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

  • 将文件名传递到资源中,以便DBA知道在哪里创建转储
  • 写入临时位置,读取转储并返回流(用于下载)
我认为你不能让h2db为你归还垃圾场。然而,我可能错了

编辑:我错了

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

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

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


Artur

这对您来说相当容易做到,但是我认为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属性):

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

  • 将文件名传递到资源中,以便DBA知道在哪里创建转储
  • 写入临时位置,读取转储并返回流(用于下载)
我认为你不能让h2db为你归还垃圾场。然而,我可能错了

编辑:我错了

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

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

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

艺术

有趣的问题(至少在理论层面)。我不确定这是否可行,但请告诉我是否有人有解决办法。我认为最好的想法是“将所有实体从数据库导出到某个归档文件”2。大多数数据库(但不是全部)都可以通过sql命令进行备份,所以可能可以通过JPA原始sql接口传递命令。这与JPA的定义无关。有趣的问题(至少在理论层面上)。我不确定这是否可行,但请告诉我是否有人有解决办法。我认为最好的想法是“将所有实体从数据库导出到某个归档文件”2。大多数数据库(但不是全部)都可以通过sql命令进行备份,所以可能可以通过JPA原始sql接口传递命令。这与JPA的定义无关。