2012-01-05 106 views
0

我有一个swing应用程序必须连接到数据库的一些资源,为此我用.properties文件来存储数据库属性,并可以在运行时读取。
为此,我现在用的是下面的代码如何在初始化后始终提供变量/常量?

public void readPropertiesFile(){ 
     try{ 
     InputStream is = ReadValues.class.getResourceAsStream(PROP_FILE); 
     Properties prop = new Properties(); 
     prop.load(is); 
     String URL = prop.getProperty("DB_URL"); 
     String user = prop.getProperty("DB_USER"); 
     String pwd = prop.getProperty("DB_PWD"); 
     is.close(); 
     /* code to use values read from the file*/ 
     }catch(Exception e){ 
     System.out.println("Failed to read from " + PROP_FILE + " file."); 
     } 
    } 

,但我已经调用此方法,每当我想连接到数据库(Connection对象)。 我知道现在的处理速度足够快,可以在微秒内运行这些行,但是我的知识建议我在应用程序启动时或第一次用户尝试连接时可以存储这些DB值的方式DB用于objectsvariablesconstants中的任何操作,这些操作在应用程序重新启动之前可用,并且可以在不读取文件的情况下直接调用。

P.S. :我知道DB值不会经常变化,如果发生的事情比我会很乐意重新启动我的应用程序:)

回答

2

通过使这些静态字段在一个单独的类中,它们将不会被加载,直到第一个一次访问URL,USER或PASSWORD。

public class DbProps { 
    public static final String URL; 
    public static final String USER; 
    public static final String PASSWORD; 

    static { 
     try{ 
     InputStream is = ReadValues.class.getResourceAsStream(PROP_FILE); 
     try { 
      Properties prop = new Properties(); 
      prop.load(is); 
      URL = prop.getProperty("DB_URL"); 
      USER = prop.getProperty("DB_USER"); 
      PASSWORD = prop.getProperty("DB_PWD"); 
     } finally { 
      is.close(); 
     } 
     }catch(Exception e){ 
     throw new RuntimeException("Failed to read from " + PROP_FILE + " file.", e); 
     } 
    } 
} 
+0

整洁简单..谢谢! :) – Asif 2012-01-05 14:50:50

+0

我创建了一个类“常量”来保存应用程序中的所有静态常量值,其中当DBProps类首次初始化应用程序的启动时,我将存储这些值,然后将进一步利用它。 – Asif 2012-01-05 14:55:33

+0

put classpath上正确的类? – jtahlborn 2012-01-05 17:45:16

2

可以纳克检查条件,这将检查它是否是第一次然后将该值设置其他明智的利用现有的值

public static boolean isFirstTime = true; 
public static String URL = true; 
public static String user = true; 
public static String pwd = true; 
public void readPropertiesFile(){ 
if(isFirstTime){ 
     try{ 

     InputStream is = ReadValues.class.getResourceAsStream(PROP_FILE); 
     Properties prop = new Properties(); 
     prop.load(is); 
     URL = prop.getProperty("DB_URL"); 
     user = prop.getProperty("DB_USER"); 
     pwd = prop.getProperty("DB_PWD"); 
isFirstTime = false; 
     is.close(); 
     /* code to use values read from the file*/ 
     }catch(Exception e){ 
     System.out.println("Failed to read from " + PROP_FILE + " file."); 
     } 
} 
    } 
//use this URL user and pwd in your application 
+0

谢谢...... :) – Asif 2012-01-05 14:56:45

2

这儿有你一个通用的环境类。你可以得到你的DB道具如Environment.getEnvironment().getProperty("DB_URL")等。

public class Environment { 
    private static final String PROP_FILE = "somefilename"; 

    private static final Environment singleton = new Environment(); 

    public static Environment getEnvironment() { 
     return singleton; 
    } 

    private Properties properties = new Properties(); 

    protected Environment() { 
     super(); 
     loadProperties(); 
    } 

    public Properties getProperties() { 
     return properties; 
    } 

    public String getProperty(String propertyName) { 
     return getProperty(propertyName, System.getProperty(propertyName)); 
    } 

    public String getProperty(String propertyName, String defaultValue) { 
     return getProperties().getProperty(propertyName, defaultValue); 
    } 

    public void loadProperties() { 
     URL resourceURL = null; 

     try { 
     resourceURL = Thread.currentThread().getContextClassLoader() 
       .getResource(PROP_FILE); 
     getProperties().load(resourceURL.openStream()); 
     System.out.println("Loaded properties from " 
       + resourceURL.toExternalForm()); 
     } catch (IOException ioe) { 
     System.err.println("Failed to load properties from " 
       + resourceURL.toExternalForm()); 
     } 
    } 
} 
+0

同样的事情,我正在与'恒常'类的我..感谢您的建议:) – Asif 2012-01-05 15:00:57