我正在尝试建立一个每周五重新索引我们的数据库的工作。我们正在使用休眠,到目前为止我尝试过的一切都失败了。有没有办法使用休眠执行 SQL 管理命令?如:
Session session = helper.getSession();
session.createQuery("DBCCREINDEX(User)").executeUpdate();
或者有没有更好的方法在 Hibernate 中重新索引?
下面引用的示例适用于 Oracle PL/SQL,但在概念上它与其他数据库相同。通过“构建作业”和“执行 SQL 管理命令”,我假设您将在需要调用的数据库中存储某种函数。
https://stackoverflow.com/a/2943733/131929有一个冗长的解释,但归结为
CallableStatement statement = session.connection().prepareCall(
"{ ? = call name_of_your_function(?) }");
这使您可以直接使用 aConnection
和PreparedStatement
/ CallableStatement
。
https://stackoverflow.com/a/1703398/131929基本相同,但它利用Session#doWork
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
CallableStatement call = connection.prepareCall("{ ? = call name_of_your_function(?) }");
请注意,在这两个示例中,都需要在 Java 代码中处理函数的返回值,您可能会也可能不会。
在出现以下解决方案的许多错误之后,我们最终以自己的方式工作。准备好的语句是在 MSSQL SSMS 中创建的用于重新索引的存储过程。
private void reindex() {
Session session = helper.getSession();
PreparedStatement ps;
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("reindexTable");
ps.execute();
}
});
}
这似乎已经给出了预期的结果并执行了......但是我们现在只需要解决超时问题。
Session.createQuery()
需要一个 HQL 查询。如果要执行 SQL,请使用Session.createSQLQuery()
.
试试这个代码 -
private void reindex() {
Session session = helper.getSession();
PreparedStatement ps;
session.doWork(new Work() {
public void execute(Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement("reindexTable");
ps.execute();
}
});
}