java - 在其他对象之间共享 JDBC Connection 对象

标签 java jdbc connection

我创建了一个数据库类,它使用静态连接对象以便在其自身实例之间通用。我的问题是这种方法是否有任何问题?

class Database {
    private static Connection connection = null;

    public Database() {
        if(connection == null){
            ...
            connection = DriverManager.getConnection(...);
            ...
        }
    }
}

最佳答案

如果您每秒要处理很多(数百)个查询,那么实现连接池是可行的方法。查看 this 的答案问题了解更多详情。但是,如果您是 Java 新手(我们都曾是 Java 新手!),那么我不认为您会需要此要求,并且可能很难实现它。

相反,如果需要,创建新连接然后在完成后关闭它的简单模式将是您继续前进的最佳方式。下面是您的 Database 类的修改版本,我认为这是向前推进的好方法。

class Database {
    private Connection con = null;
    private final String connectionString;

    public Database(String connectionString) {
        this.connectionString = connectionString;
    }

    public void connect() throws SQLException {
        if (con != null // if the connection exists
             && !con.isClosed() // and has not been closed 
             && con.isValid(0)) { // and appears to be functioning (with a test timeout of 0ms)
             return; // skip connection creation
        }

        // create the connection
        con = DriverManager.getConnection(connectionString);        
    }

    public void testFunction() {
        try {
            connect();
            // .. do some stuff with the connection ..
        } catch (Exception e) {
            // log or otherwise deal with the error
        } finally {
            try {
                con.close();
            } catch (Exception e) {
                System.err.println("Failed to close connection: " + e.toString());
            }
        }

    }
}

关于此解决方案的一些注意事项:

  • 不是非常有效 - 创建新连接总是比使用现有连接花费更多时间
  • 如果线程安全,则此类 - 如果您需要此要求,我建议使用线程池。但是,如果您为每个线程创建一个此类的新实例,那么它是线程安全的(因为不需要担心静态连接!)
  • 确实完成了这项工作 - 当然是针对简单的情况。我将该模型用于容量相对较小的数据库,该数据库每分钟建立/关闭大约 50-100 个连接,并且不会增加明显的滞后
  • 非常健壮 - 没有什么比每次查询打开和关闭连接更安全的了。您保证能够处理每个查询的连接失败,并且连接将始终关闭(除非它已经关闭)。

免责声明 上面的解决方案并不是特别神奇的解决方案。但是,我相信它实现起来很简单,并且是 Java 新手在使用外部库之前了解基本情况的好方法。

关于java - 在其他对象之间共享 JDBC Connection 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16613629/

相关文章:

c# - 无法从远程机器连接

java - 如何将复杂的java对象(嵌套映射和列表)从一个apache nifi处理器传递到另一个?

java - IntelliJ IDEA - 双引号和字母更改为 Unicode 字母

java - 获得所需的结果集后关闭连接对象

java - 请问java中这个自动Mysql DB连接可能有什么问题

java - 在 hsqldb 1.8.1.3 之上基于 Hibernate 的代码的单元测试不再适用于 hsqldb 2.2.9

php - 将数据保存到文件和。将其保存到 MySQL DB

java - 已知文件的mimeType如何获取对应的文件扩展名

java - 使用 JAVA+Eclipse 时在 Windows 和 Linux 中访问文件

java - 如何在Java中的两个混合器之间创建 "connection"?