2012-08-14 27 views
1

在一个javase数据库应用程序中,我处理了很多短暂的对象(比如帐单等会计凭证)。
处理每个对象包括打开到数据库的连接并查找一些数据。并不是所有的对象都在同一个数据库上查找,但是我根据某些对象属性选择了一个特定的数据库,所以我最终会打开几个连接。
我实际需要的是每个数据库不超过一个连接。
所以我做了这样的事情:
是public Connection getInstance(String databasename);连接池的一种形式?

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)这段代码将“暴露”给其他开发者,反过来可能开发过程从不同结构的数据库检索数据,可能从这个“池对象”获取连接。
在文档和代码中,它是否正确地将其称为“池”,或者它是不同的,因此调用“池”会引起误解?

+0

你会使用多线程吗? – SLaks 2012-08-14 14:32:03

+0

他们经过测试,他们是可配置的,他们是通用的。 – 2012-08-14 14:33:20

+0

我确实使用多个线程,但所有数据库活动都将在一个线程中执行。 – AgostinoX 2012-08-14 14:33:58

回答

2

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

这里的区别在于,您的代码对于像您提到的流行连接池实现这样的并发环境不是线程安全的。在Web等高并发环境下运行的应用程序不需要消耗每个请求建立连接的开销。而是维护一个开放连接池,当请求完成连接时,它将返回到池以供后续请求使用。

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

+1

所以,如果我明白了,在我的代码中,我实例化每个数据库只有一个连接,然后我将它返回到正在使用它的单线程(但在多个调用中),而WHILE连接池实例化一个集合)的同一个数据库的连接,返回给每个请求线程自己的(已初始化的)连接,最终从先前的请求者释放。那么我的语义根本就不是一个池。池将abololutely误导,更好的名称可能是像*连接注册表* *我想 – AgostinoX 2012-08-14 16:39:48

+0

你的理解是正确的,我会留给你的名字,但我同意你说:_pool会误导你的代码。 – 2012-08-14 18:29:04

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 }