数据库连接池

时间:2013-10-08 09:11:44

标签: java jdbc

您好我正在尝试创建数据库连接池。以下方法是否正确。

public Connection getMySQLConnection(){
            Connection conn = null;

            String url = "jdbc:mysql://" +  Config.getInstance().getProperty("DB_SERVER_HOST") + ":" + Config.getInstance().getProperty("DB_SERVER_PORT") + "/" + Config.getInstance().getProperty("DB_NAME");


            try {
                poolConn = new DbPool("com.mysql.jdbc.Driver", url, Config.getInstance().getProperty("DB_USERNAME"), Config.getInstance().getProperty("DB_PASSWORD"));
            } catch (SQLException e) {
                LOGGER.error("error while creating the connection pool : "+e);

            }
            try {
                conn = poolConn.getConnection();
            } catch (SQLException e) {
                LOGGER.error("Error while getting connection from db pool"+e);

            }
            return conn;
    }

这是我的自定义DbPool类的构造函数。在上面的代码中,我创建了这个类的对象。

public DbPool(String classname, String url, String username,
            String password) throws java.sql.SQLException {
        try {
            Class.forName(classname).newInstance();
        } catch (Exception e) { // Catch any exception from JDBC driver failure
           LOGGER.error("Failed to load JDBC driver: "+classname
                               +", Exception: "+e);
        }

        maxConnections = defaultMaxConnections;
        timeout = defaultTimeout;
        if (DEBUG) {
            maxConnections = debugDefaultMaxConnections;
            timeout = debugDefaultTimeout;
        }
        totalConnections = 0;
        freeList = new java.util.LinkedList<DBPoolConnection>();
        busy = new java.util.HashMap<Connection, DBPoolConnection>();
        this.url = url;
        connectionProperties = new java.util.Properties();
        if (username == null) LOGGER.info("ERROR: Null JDBC username");
        else connectionProperties.setProperty("user",username);
        if (password == null) LOGGER.info("ERROR: Null JDBC password");
        else connectionProperties.setProperty("password",password);
    }

2 个答案:

答案 0 :(得分:1)

完全错了。为什么每次调用getMySQLConnection方法时都会创建池。应该创建一次池,当调用getMySQLConnection时,从池中获取连接并检查连接是否有效,然后返回连接。

使用像boneCP,DBCP,C3P0这样的第三方连接池而不是自己写一个是明智的。

在创建连接池之前必须考虑很多参数

答案 1 :(得分:1)

Pascal ThiventNeed Code to create Connection Pool in java上写道:

  
    

需要代码在java中创建连接池吗?

  
     

不确定问题是什么,但不要创建另一个连接   池,使用现有的解决方案,如C3P0,Apache DBCP,Proxool或   BoneCP(该领域的新玩家)。我会用C3P0。

     
    

我们如何确保连接池不返回已使用的同一对象?

  
     

因为如果从池中借用了连接而没有   返回,它只是不在池中,不能分配给   池中的另一个客户端(资源从池中删除,直到   他们被退回了。)

     
    

如果客户端从连接池中取出连接后关闭连接会怎样?

  
     

客户端从池中获取的连接实际上不是   java.sql.Connection,它是一个包装器(代理)   java.sql.Connection,用于自定义某些方法的行为。该   close()方法是其中之一,不会关闭Connection   实例但将其返回池中。

也请这个link