有没有办法通过 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/