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

2022-09-04 20:25:08

我创建了这个返回连接对象的类。我用过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;        
    }
}  

现在我想做的就是实例化一次这个类并获取连接对象。我想在整个应用程序中使用相同的对象。另一种解决方案也将不胜感激。


答案 1

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

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();

但是,您应该考虑 - 当多个线程尝试向数据库发出请求时,这将如何在多线程环境中工作。


答案 2

我真的很喜欢Lashane的回应,我用代码创建了一个解决方案。我还重新设计了它,只存储而不是,以防万一你想打开多个。DataSourceDataSourceConnection

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();

我添加了每次都连接到不同数据库的功能,在某些情况下,就像我们一样,这是您需要即时执行的操作。

希望这有帮助。


推荐