java - 是 public Connection getInstance(String databasename);一种连接池形式?

标签 java connection-pooling

在 javase 数据库应用程序中,我处理了很多短期对象(比如帐单等会计凭证)。
处理每个对象包括打开与数据库的连接并查找一些数据。并非所有对象都在同一个数据库中查找,但我根据某些对象属性选择了一个特定的数据库,所以我最终会打开多个连接。
我实际需要的只是每个数据库有一个连接。
所以我做了这样的事情:

public MyPool {

    Map<String, Connection> activeConnections = new TreeMap<String, Connection>();

    public Connection getConnection(String database_name) throws SQLException {

    if (activeConnections.containsKey(database_name)) {
        return activeConnections.get(database_name);
    }

    //Retrive the configuration data from a configuration object
    ConnectionConfig c = Configuration.getConnectionConfig(database_name);

    Connection connection = DriverManager.getConnection(c.url, c.user, c.password);

    return connection;

}

问题是:
1) 因为我看到很多池库、DBCP、c3p0 和其他库:所有这些库的意义是什么,它们对这样的“基本”方法有什么补充?
类似 this 的教程对回答这个问题没有多大帮助,因为这里公开的基本解决方案完全符合他们对连接池的定义。

2) 这是一段将“公开”给其他开发人员的代码,这些开发人员可能会开发程序以从具有不同结构的数据库中检索数据,可能会从这个“池对象”获取连接。
在文档和代码中,将其称为“池”是正确的,还是有所不同,以至于调用“池”会产生误导?

最佳答案

您的代码不是该术语通俗用法中的连接池实现,因为每个数据源只有一个物理连接。对象池(在这种情况下,对象是一个连接)背后的概念是一些对象需要开销来配置。如您所知,在连接池的情况下,必须先打开数据库连接才能与数据库对话。

此处的不同之处在于,您的代码对于并发环境(如您提到的流行连接池实现)来说不是线程安全的。在网络等高并发环境中运行的应用程序不需要吸收在每个请求上建立连接的开销。相反,会维护一个打开的连接池,当请求完成连接工作时,它会返回到池中供后续请求使用。

这是必需的,因为连接是有状态的。您不能让多个请求同时共享同一个连接并保证任何类型的合理事务语义。

关于java - 是 public Connection getInstance(String databasename);一种连接池形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954559/

相关文章:

java - HikeriCP : java. sql.SQLException:关闭与显式目录的连接时目录不能为空

python - 为什么在将数据上传到我的数据库时总是看到 "Resetting dropped connection"?

java - 在不使用匹配验证的情况下自动恢复 Wildfly 8.2 for Oracle 中的连接

java - 使用 for 循环将多个 Jlabel 添加到 Jframe,删除它们并将它们打印在新位置

java - JFreeChart 图表上方的网格线

java - 提交对 JDT CompilationUnit 的更改

java - Surefire 未拾取属性文件

java - 动态web项目和企业应用项目的区别

apache - Apache CXF 中的 HTTP 连接池

java - tomcat 7中的连接池