如何在整个应用程序中使用一个数据库连接对象?

时间:2013-12-18 19:21:44

标签: java mysql java-ee jdbc odbc

我创建了这个返回连接对象的类。我使用过MySQL数据库。

public class Connect_db {        
    public Connection getConnection(String db_name,String user_name,String password)
    {
        Connection con=null;
        try
        {
        Class.forName("com.mysql.jdbc.Driver");
        con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
}  

现在我要做的就是实例化一次这个类并获取连接对象。 我想在整个应用程序中使用同一个对象。 另一个解决方案也将受到赞赏。

3 个答案:

答案 0 :(得分:9)

我想你需要单身模式,这里有一个简单的例子:

public class Connect_db {        
    static Connection con=null;
    public static Connection getConnection()
    {
        if (con != null) return con;
        // get db, user, pass from settings file
        return getConnection(db, user, pass);
    }

    private static Connection getConnection(String db_name,String user_name,String password)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return con;        
    }
} 

然后你就可以使用这样的连接:

Connect_db.getConnection().somemethods();

但是,你应该想一想 - 当多个线程试图向数据库发出请求时,这在多线程环境中是如何工作的。

答案 1 :(得分:1)

非常原始的方式,您可以通过

获取Connection实例

Connect_db.getConnection(DBNAME,用户名,passwd中);

在任何类中,因为它是静态方法。

public class Connect_db {   
static {
     try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("MySQL db driver isnot on classpath");
    }
}
public static Connection getConnection(String db_name,String user_name,String password) throws SQLException
{
    return DriverManager.getConnection("jdbc:mysql://localhost/"+db_name+"?user="+user_name+"&password="+password);    
}

}

如果您的应用程序是多线程的,并且应该很好地使用池

答案 2 :(得分:1)

我真的很喜欢Lashane的回复,我用代码创建了DataSource解决方案。我还将其重新设计为仅存储DataSource而不是Connection,以防您想要打开多个。

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class SignalDB {

    private static MysqlDataSource ds = null;

    public static MysqlDataSource getDataSource(String db_name) {
        if (ds == null) {
            // db variables set here
            getDataSource(db_url, db_user, db_password, db_port);
        }
        ds.setDatabaseName(db_name);
        return ds;
    }

    private static void getDataSource(String db_url, String db_user, String db_password, int db_port) {
        try {
            ds = new MysqlDataSource();
            ds.setServerName(db_url);
            ds.setUser(db_user);
            ds.setPassword(db_password);
            ds.setPort(db_port);
        } catch (Exception e) {
            System.out.println("MysqlDataSource err: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

然后你可以使用:

创建连接

con = SignalDB.getDataSource("database_name").getConnection();

我每次都添加了连接到不同数据库的能力,在某些情况下,就像我们一样,它是你需要做的动态。

希望这有帮助。