使用 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,因此行为可能略有不同。
玩得开心,我希望能解决你的问题:)
阿图尔
有没有办法通过 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,因此行为可能略有不同。
玩得开心,我希望能解决你的问题:)
阿图尔