2013-06-04 34 views
0

我目前正试图从主数据库移动SELECT查询的一部分,我们只读副本不创建JPA配置。这些查询主要用于统计和类似的事情,正如陈述的所有只读。玩!在只读副本

我加入到我的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 =“复制品”)在它的上面逼的创作JPA为副本conf。

我相信这更是一个肮脏的黑客不是一个干净的修复,而且由于复制数据库是只读的,建立在其上的新表,即使是空是很烦人的。

如果有人已经找到另一种方式来解决这个问题,我会非常高兴听到它!

有一个愉快的早晨/晚上好/下午/晚上!

回答

0

我想出了另外一个办法,还不够完美,但比以前少凌乱。

的想法是使用

DB.getDBConfig("replica").executeQuery(query) 

而不是

JPA.getJPAConfig("replica").getJPAContext().em().createNativeQuery(query) 

如果你已经有一些代码期待的createNativeQuery(query).getResultList();List<Object[]>输出我做了一个快速功能改造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; 
} 

我是st在我们将代码的整个部分都交给副本数据库的时候,我们不能对这个函数进行测试,如果出现任何问题,我会进行更新。