У меня проблема с дизайном db, с которой я столкнулся с одним из моих проектов. Я пытаюсь реализовать службу, и часть этой службы является слоем db. Это настройка, так что у меня есть вспомогательные классы, которые выполняют методы get/update в базе данных и слой поверх них, который является janitor. Для примера:
public class GetStudentDBHelper {
public List<Student> get(List<Integer> ids) {
Conn getConnection...
// run sql query and construct returning Student objects
}
public List<Student> get(List<Classroom> byClassroom) {
// get all students in passed in classrooms
// run sql query and construct returning Student objects
}
}
public class StudentJanitor {
public GetStudentDBHelper getStudentDBHelper;
public UpdateStudentDBHelper updateStudentDBHelper;
public UpdateClassroomDBHelper updateClassroomDBHelper;
public List<Student> getStudents(List<Integer> ids) {
return getStudentDBHelper.get(ids);
}
public void saveStudents(List<Students> students, int classRoomid) {
Connection conn = Pool.getConnection(); // assume this gives a jdbc
conn.autocommit(false);
try {
try
{
updateStudentDBHelper.saveForClassroom(students, classRoomid, conn);
updateClassroomDBHelper.markUpdated(classRoomid, conn);
conn.commit();
}
catch
{
throw new MyCustomException(ErrorCode.Student);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}
}
public class ClassroomJanitor{
public void saveClassRoon(List<Classrooms> classrooms) {
Connection conn = Pool.getConnection()// assume this gives a jdbc
conn.autocommit(false);
try {
try {
updateClassroomDBHelper.save(classrooms, conn);
updateStudentDBHelper.save(classrooms.stream().map(Classroom::getStudents).collect(Collections.toList()), conn);
conn.commit();
}
catch {
throw new MyCustomException(ErrorCode.ClassRoom);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}
}...
public class GetClassroomDBHelper{}...
public class UpdateClassroomDBHelper{}...
В классах обновления db все составляются несколько других обновителей, если им нужно обновлять значения в других таблицах (т.е. сохранение студента означает, что я должен коснуться таблицы классов, в которой ученик должен обновить свое последнее обновленное время, например).
Проблема, с которой я столкнулась, связана с классами обновления db, я должен передать соединение из моего класса Janitor, если я касаюсь нескольких таблиц, чтобы иметь транзакции и их возможности отката. См. Выше, что я имею в виду. Есть лучший способ сделать это? Этот тип try, catch, pass to connect to db helpers должен быть выполнен для любой операции с несколькими транзакциями в моих janitors.
Короче говоря, вы можете видеть, что код, как правило, подобен этому дублируемому по нескольким методам:
Connection conn = Pool.getConnection()// assume this gives a jdbc
conn.autocommit(false);
try {
try {
//do some business logic requiring Connection conn
}
catch {
throw new MyCustomException(ErrorCode);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}