2012-01-14 2 views
1

Да, я знаю .. Я бы не сделал это с одним соединением, если бы не был обязан.JDBC Singleton final Переменная соединения с синтаксическим разбором файла

С учетом сказанного предположим, что я хочу сделать одноэлементный класс, скажем DBConnection, с помощью переменной sql Connection, и, допустим, я хочу, чтобы класс загружал информацию из файла о базе данных ip, пользователе и т. Д. Внутри своего конструктора ,

Как я могу установить переменную Connection как final static, если мне нужно сначала проанализировать данные из файла перед назначением на него значения?

кода до сих пор (игнорировать недостающую синхронизацию на GetConnection):

final public class DBConnection { 
    transient private static Connection con; 

    private DBConnection() 

     [parse file, make url] 
      con = DriverManager.getConnection(url); 
     [...] 
    } 

    public static Connection getConnection(){ 
     if (con == null) 
     new DBConnection(); 

    return con; 

    } 
} 

Пожалуйста, расскажите, если есть что-то неловко, на классе, синглтон-накрест. В некотором смысле, может быть, я не должен иметь его окончательным, если соединение закрывается, и я должен выполнить новый getConnection, но это, вероятно, будет плохой класс singleton, не так ли?

EDIT решил изменить свой ПОДХОД и сделать его перечислимого путь

public enum Connect { 
    INSTANCE; 
    private Connection con; 
    Connect(){ 
     [parse file] 
     con = DriverManager.getConnection(url); 
    [...] 
} 

public Connection getCon(){ 
    return con; 
} 

Однако, как я могу убедиться, никто не пытается

Channel.INSTANCE.getCon

до того, как конструктор закончен?

ответ

0

Если вызывается Connect.INSTANCE.getCon(), то необходимо перечислить перечисление INSTANCE, тогда его конструктор должен быть выполнен раньше. Такой код не может быть выполнен, если конструктор ранее не выполнялся.

+1

Ι'м немного беспокоит доступ к getCon, например, к второму потоку, в то время как первый поток инициирует конструктор и, похоже, назначается экземпляр. (см. тест Symantec JIT по адресу http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html: «присвоение синглонам [i] .режим выполняется до того, как конструктор для Singleton называется" , хотя я не уверен, что этот случай может быть применен к перечислению. – Bimp

+0

перечисления являются потокобезопасными. Не беспокойтесь. –

+0

Я вижу, спасибо. – Bimp

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