Java 是公共连接getInstance(字符串数据库名);连接池的一种形式?

Java 是公共连接getInstance(字符串数据库名);连接池的一种形式?,java,connection-pooling,Java,Connection Pooling,在javase数据库应用程序中,我处理许多短期对象(比如账单等会计文档)处理每个对象包括打开与数据库的连接并查找某些数据。并非所有对象都在同一个数据库上查找,但我根据某个对象属性选择了一个特定的数据库,因此我将打开多个连接。 我实际上需要的是每个数据库不超过一个连接。 所以我做了这样的事情: public MyPool { Map<String, Connection> activeConnections = new TreeMap<String, Connectio

在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;

}
公共MyPool{
Map activeConnections=newtreemap();
公共连接getConnection(字符串数据库名称)引发SQLException{
if(activeConnections.containsKey(数据库名称)){
返回activeConnections.get(数据库名称);
}
//从配置对象检索配置数据
ConnectionConfig c=Configuration.getConnectionConfig(数据库名称);
Connection Connection=DriverManager.getConnection(c.url、c.user、c.password);
回路连接;
}
问题是:
1) 因为我看到了很多池库、DBCP、c3p0和其他库:所有这些库的意义是什么,它们为这样的“基本”方法添加了什么?
像这样的教程对回答这个问题没有多大帮助,因为这里介绍的基本解决方案完全符合他们对连接池的定义。

2) 这是一段将“公开”给其他开发人员的代码,这些开发人员反过来可能会开发从具有不同结构的数据库检索数据的过程,可能会从这个“池对象”获取连接。

在文档和代码中,将其称为“池”是正确的,还是有所不同,因此调用“池”会产生误导?

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

这里的区别在于,对于您提到的流行连接池实现这样的并发环境,您的代码不是线程安全的。在web等高并发环境中运行的应用程序不需要承担在每个请求上建立连接的开销。相反,开放连接池是aintened,当请求完成连接工作时,它将返回到池中,供后续请求使用


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

使用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 }

你会使用多个线程吗?它们经过测试,是可配置的,是通用的。我确实使用多个线程,但所有的数据库活动都将在一个线程中执行。@Dave Newton:问题是:这些库除了查找地图之外还做什么?因为它是一个“加法”,能够被执行“一般用途”和“正在测试”"。在一个简单的查找中没有什么可测试的!@AgostinoX然后我的答案仍然有效——它们是经过测试的,它们是可配置的,它们是通用的。您的测试没有达到测试的程度,您的是不可配置的,您的不是通用的。因此,这就是他们添加的内容,这就是您所要求的。因此,如果我理解,在我的代码中,我是instantia每个数据库只创建一个连接,然后将其返回给使用它的单个线程(但在多个调用之间),而连接池为同一数据库实例化一组连接(大小可变),并返回给每个请求线程自己的连接(已初始化)连接,最终从以前的请求者那里释放。我的语义根本不是池。池将是绝对误导性的,更好的名称可能类似于连接注册表。我假设您的理解是正确的,我将把名称留给您,但我同意您的说法:池将误导您的代码。