2010-07-19 10 views
8

Gracias por leer esto.Spring: origen de datos separado para transacciones de solo lectura

Tengo 2 bases de datos MySQL: maestro para escrituras, esclavo para lecturas. El escenario perfecto que imagino es que mi aplicación utiliza la conexión al maestro para las transacciones readOnly=false, esclavo para las transacciones readOnly=true.

Para implementar esto, necesito proporcionar una conexión válida dependiendo del tipo de transacción actual. Mi capa de servicio de datos no debe saber qué tipo de conexión utiliza y simplemente usa el inyectado SqlMapClient (yo uso iBatis) directamente. Esto significa que (si lo hago bien) se deben aproximar los SqlMapClient s inyectados y se debe elegir el delegado en el tiempo de ejecución.

public class MyDataService { 

    private SqlMapClient sqlMap; 

    @Autowired 
    public MyDataService (SqlMapClient sqlMap) { 
     this.sqlMap = sqlMap; 
    } 

    @Transactional(readOnly = true) 
    public MyData getSomeData() { 
     // an instance of sqlMap connected to slave should be used 
    } 

    @Transactional(readOnly = false) 
    public void saveMyData(MyData myData) { 
     // an instance of sqlMap connected to master should be used 
    } 
} 

Entonces la pregunta es, ¿cómo puedo hacer esto?

Muchas gracias

Respuesta

4

Es una idea interesante, pero que tendría un trabajo duro en sus manos. El atributo readOnly es una sugerencia para el administrador de transacciones, y realmente no se consulta en ninguna parte significativa. Tendría que reescribir o extender varias clases de infraestructura de Spring.

De modo que, a menos que esté empeñado en hacer que funcione, la mejor opción es inyectar dos objetos SqlMapClient en su DAO, y los métodos para elegir el que corresponda. Las anotaciones @Transactional también necesitarían indicar qué administrador de transacciones usar (suponiendo que esté usando DataSourceTransactionManager en lugar de JpaTransactionManager), teniendo cuidado de hacer coincidir el administrador de transacciones con el DataSource utilizado por el SqlMapClient.

+0

¿Hay alguna manera más fácil con AspectJ, por ejemplo? – artemb

+0

@artemb: Estoy seguro de que AspectJ me ayudaría, pero todavía no será fácil. – skaffman

Cuestiones relacionadas