J'ai une application qui utilise déjà le framework Spring et Spring JDBC avec une couche DAO en utilisant les classes SimpleJdbcTemplate et RowMapper. Cela semble fonctionner très bien avec de petites structures de classes lues à partir de la base de données. Cependant, nous avons besoin de charger des objets qui contiennent des collections d'autres objets, qui contiennent encore des collections d'autres objets. La solution «évidente» à ce problème est de créer une classe nommée RowMapper ou nos objets, et de passer des références aux objets DAO appropriés dans le constructeur. Par exemple:Spring Framework JDBC avec DAO agrgegation/composition
public class ProjectRowMapper implements ParameterizedRowMapper {
public ProjectRowMapper(AccountDAO accountDAO,) {
this.accountDAO = accountDAO;
}
public Project mapRow(ResultSet rs, int rowNum) throws SQLException {
Project project= new Project();
project.setProjecttId(rs.getString("project_id"));
project.setStartDate(rs.getDate("start_date"));
// project.setEtcetera(...);
// this is where the problems start
project.setAccounts(accountDAO.getAccountsOnProject(project.getProjectId()));
}
}
Le problème est que même si le ProjectDAO et la part de DAO compte de la même instance de DataSource (dans notre cas est un pool de connexion), tout accès de base de données sont effectués par une autre connexion.
Si la hiérarchie des objets est même trois niveaux de profondeur, en utilisant le cadre de datasource.getConnection() cette mise en œuvre entraîne (a) de nombreux appels et (2) encore pire, puisque nous limitons le nombre de connexions autorisé dans notre pool de connexions, conditions de concurrence potentielles pendant que plusieurs threads tentent de charger un projet à partir de la base de données.
Y at-il une meilleure façon au printemps (sans autre outil ORM à part entière) pour obtenir la charge de ces hiérarchies d'objets?
Merci, Paul
Un outil ORM complet est exactement ce dont vous avez besoin ici. Ces problèmes sont difficiles, ne les réinventez pas. – skaffman
Y a-t-il une transaction autour de votre code? Nous utilisons le même modèle dao imbriqué pour charger des objets complexes, mais Spring JDBC n'utilise qu'une seule connexion – Serxipc