1

在 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 和其他库:所有这些库的意义何在,它们为这样的“基本”方法添加了什么?像这样
的 教程对回答这个问题没有多大帮助,因为这里公开的基本解决方案完全符合他们对连接池的定义。

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

4

2 回答 2

2

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

这里的区别在于您的代码对于并发环境(如您提到的流行的连接池实现)不是线程安全的。在 Web 等高并发环境中运行的应用程序不需要承担在每个请求上建立连接的开销。相反,维护一个打开的连接池,当请求完成连接处理时,它会返回到池中以供后续请求使用。

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

于 2012-08-14T15:21:19.567 回答
1

使用 BoneCP 并像这样包装连接池:不要尝试创建自己的连接池,这就是 BoneCP 或任何数量的其他非常好的和经过良好测试的池的用途。

object ConnectionPool { 
    Class.forName("[ENTER DRIVER]")
    private val connstring = [ENTER YOUR STRING]

private var cp : BoneCP = _
createConnectionPool()  //upon init create the cp

/**
 * Create a new connection pool
 */
def createConnectionPool() = {
    if(cp == null) {
        try {
            val config = new BoneCPConfig()
            config.setJdbcUrl(connstring)
            config.setMaxConnectionsPerPartition(3)
            config.setMinConnectionsPerPartition(1)
            config.setPartitionCount(1)
            cp = new BoneCP(config)
        }
        catch {
            case e: SQLException => e.printStackTrace()     
        }
    }
}

def getConnection () = { cp.getConnection }
于 2013-07-30T11:27:26.233 回答