2015-02-25 3 views
0

Я храню его в общественном статическом полеГде я должен хранить соединение DBI и когда его следует закрыть?

public class DB { 

    private static final String url = "jdbc:sqlite:file:target/todo"; 
    public static final DBI dbi = new DBI(url); 


    public static void migrate() { 
     Flyway flyway = new Flyway(); 
     flyway.setDataSource(url, "", ""); 
     flyway.migrate(); 
    } 
} 

И никогда не закрыть его, есть лучший вариант?

+1

Лучший вариант - не обрабатывать их :) используйте что-то, что делает это для вас, например, весна –

+0

использует статический блок/метод для подключения. и закрыть написать общий метод. – Prashant

+0

@ran Я пытаюсь использовать jdbi без каких-либо других зависимостей. – tarrsalah

ответ

1

Это сводится к тому, как вы справляетесь с получением какой-либо зависимости в своем приложении. Лучшая общая модель, IMHO, передает ее конструктору вещей, которые в ней нуждаются. Если вы хотите разместить какой-то фасад DAO вокруг доступа к базе данных, передайте DBI в ctor вашего DAO. Если вы используете инфраструктуру DI, привяжите экземпляр DBI к структуре и @Inject.

Для вашего конкретного вопроса о соединениях эквивалентом DBI соединения JDBC является ручка. Вы должны получить Ручку, использовать ее и закрыть, как только вы закончите. Типичное использование экземпляра DBI - предоставить ему DataSource, который управляет действительными соединениями с базой данных, освободив дескриптор, как только вы закончите с ним, вы лучше используете пул соединений.

В большинстве случаев вы только закрываете экземпляр DBI, если хотите закрыть источник данных, это все, что закрывает экземпляр DBI. 98% случаев, в мире Java-для-сервера, закрытие источника данных не имеет смысла, поэтому беспокоиться о закрытии DBI (по сравнению с Handle) не имеет большого значения.

При использовании JDBI, имейте в виду:

DBI -> Datasource 
Handle -> Connection 
Query/SQLStatement -> Statement 

This doc конкретизирует их.

0

Лучшим вариантом является создание класса обработчика. Этот класс «раздаёт» ручки, как им нужно. Вам нужно больше всего беспокоиться о закрытии ручек. Если вам действительно нужна быстрая система, что-то вроде c3p0 отлично. Как правило, лучше всего сделать изменчивые объекты частными и окончательными, используя getters/seters. Вы можете сохранить статичность DBI, если хотите. Когда вы совершаете вызов для проверки Handle, вы должны использовать try-with-resources.

public Handle getHandle(){ 
    dbi.open(dataSource); 
} 

public void doSomething(){ 
    try(Handle handle = getHandle()){ 
     // Do something 
    } 
    catch(DBIException e){ 
     // TODO Handle it... 
    } 
} 

Я бы, вероятно, сделать мой обработчик autocloseable и закрыть все оставшиеся (как и любые пулов соединений), когда она закрывается. Это, кстати, позволяет вам извлекать ваши учетные данные в обработчике и хранить эти данные в безопасности.

Смежные вопросы