我正在尝试将部分SELECT查询从主DB移动到我们的只读副本。这些查询主要用于统计数据和类似的事情,并且如上所述都是只读的。
我在我的application.conf中添加了副本数据库,并修改了查询以使用
JPA.getJPAConfig("replica").getJPAContext().em().createNativeQuery(query)
每次我在副本上打电话,玩!给我以下错误:
JPA error
A JPA error occurred (No JPAConfig is found with the name replica)
我发现阻止此错误的唯一方法是在其上添加一些无用的类@PersistenceUnit(name =“replica”)以强制为副本创建JPA conf。
我相信这更像是一个肮脏的黑客,而不是一个干净的修复,并且因为副本数据库是只读的,在它上面创建新表,即使是空的也很烦人。
如果有人找到另一种方法来解决这个问题,我会很高兴听到它!
早上/晚上/下午/晚上好!
答案 0 :(得分:0)
我想出了另一个解决方法,仍然不完美,但比以前更不凌乱。
想法是使用
DB.getDBConfig("replica").executeQuery(query)
而不是
JPA.getJPAConfig("replica").getJPAContext().em().createNativeQuery(query)
如果您已经有一些代码需要List<Object[]>
输出createNativeQuery(query).getResultList();
,我会快速转换您现在收到的ResultSet
:
public static List<Object[]> formatResult(ResultSet rs) {
List<Object[]> resultList = new ArrayList<Object[]>();
try {
while(rs.next()) {
Object[] array = new Object[rs.getMetaData().getColumnCount()];
for (int i = 0; i < array.length; i++) {
array[i] = rs.getObject(i+1);
}
resultList.add(array);
}
} catch (SQLException e) {
e.printStackTrace();
}
return resultList;
}
我仍然在我们的代码的整个部分上测试这个函数,这些代码正在转移到副本数据库,如果出现任何问题,我会更新。