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

标签 java eclipselink entitymanager dropwizard

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

谢谢

最佳答案

这对你来说相当容易做到,但我不认为 EntityManager 能做到这一点

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

所以必要条件:

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

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,因此行为可能略有不同。

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

阿图尔

关于java - 使用 EclipseLink 获取数据库备份/转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38490159/

相关文章:

java - 如何告诉 Maven 将所有依赖项重新打包到单个 jar 文件中

java - Eclipselink 合并/保留连接的对象

java - primefaces 试图添加 p :message for validation errors and p:growl for success messages

java - 同义词 HashMap 的正确用法

jpa-2.0 - JPA,带有外键的复合键+持久化oneToMany

spring-boot - Spring 启动错误:请考虑在您的配置中定义一个名为“entityManagerFactory”的bean

java - 管理多个数据库连接

java - EJB 容器上的 CDI EntityManager 注入(inject) VS @PersistenceContext entitymanager

java - 在进行字符识别(tesseract)之前使用 OpenCV 进行图像预处理

java - 如何将实体分布在 Spring-data-jpa 和 eclipselink 中的不同模块上?