-1

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

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);
    }
4

2 回答 2

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 实例,而是将其返回到池中。

也检查这个链接

于 2013-10-08T09:51:29.947 回答
1

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

明智的做法是使用第 3 方连接池,例如 boneCP、DBCP、C3P0,而不是自己编写。

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

于 2013-10-08T09:16:21.843 回答