如果我对数据库连接使用单例类,一个用户是否可以为每个人关闭连接?

2022-09-01 23:00:51

我编写了一个用于获取数据库连接的单例类。

现在我的问题是这样的:假设有100个用户访问该应用程序。如果一个用户关闭连接,对于其他 99 个用户,连接是否关闭?

这是我的示例程序,它使用单例类来获取数据库连接:

public class GetConnection {

    private GetConnection() { }

    public Connection getConnection() {
        Context ctx = new InitialContext();
        DataSource ds = ctx.lookup("jndifordbconc");
        Connection con = ds.getConnection();
        return con;
    }

    public static  GetConnection   getInstancetoGetConnection () {
        // which gives GetConnection class instance to call getConnection() on this .
    }
}

请指导我。


答案 1

只要您不在通话中返回相同的实例,就无需担心。然后,每个调用方都将获得自己的实例。到目前为止,您正在为每个调用创建一个全新的连接,因此不会返回一些静态或实例变量。所以这是安全的。ConnectiongetConnection()getConnection()

但是,这种方法很笨拙。它不需要是单例。帮助程序/实用程序类也完全没问题。或者,如果你想要更多的抽象,一个由抽象工厂返回的连接管理器。我只在类初始化期间更改它以获取一次数据源,而不是每次都在 .无论如何,每次都是相同的实例。保持便宜。下面是一个基本的启动示例:getConnection()

public class Database {

    private static DataSource dataSource;

    static {
        try {
            dataSource = new InitialContext().lookup("jndifordbconc");
        }
        catch (NamingException e) { 
            throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI", e);
        }
    }

    public static Connection getConnection() {
        return dataSource.getConnection();
    }

}

根据正常的JDBC成语,这将使用如下。

public List<Entity> list() throws SQLException {
    List<Entity> entities = new ArrayList<Entity>();

    try (
        Connection connection = Database.getConnection();
        PreparedStatement statement = connection.prepareStatement("SELECT id, foo, bar FROM entity");
        ResultSet resultSet = statement.executeQuery();
    ) {
        while (resultSet.next()) {
            Entity entity = new Entity();
            entity.setId(resultSet.getLong("id"));
            entity.setFoo(resultSet.getString("foo"));
            entity.setBar(resultSet.getString("bar"));
            entities.add(entity);
        }
    }

    return entities;
}

另请参阅:


答案 2

下面的代码是一个工作和测试的 Java 单例模式。

public class Database {

    private static Database dbIsntance;
    private static Connection con ;
    private static Statement stmt;


    private Database() {
      // private constructor //
    }

    public static Database getInstance(){
    if(dbIsntance==null){
        dbIsntance= new Database();
    }
    return dbIsntance;
    }

    public  Connection getConnection(){

        if(con==null){
            try {
                String host = "jdbc:derby://localhost:1527/yourdatabasename";
                String username = "yourusername";
                String password = "yourpassword";
                con = DriverManager.getConnection( host, username, password );
            } catch (SQLException ex) {
                Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return con;
    }

在任何类中获得连接时,只需使用下面的行

Connection con = Database.getInstance().getConnection();

希望它能帮助:)


推荐