您好我正在尝试创建数据库连接池。以下方法是否正确。
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);
}
答案 0 :(得分:1)
完全错了。为什么每次调用getMySQLConnection方法时都会创建池。应该创建一次池,当调用getMySQLConnection时,从池中获取连接并检查连接是否有效,然后返回连接。
使用像boneCP,DBCP,C3P0这样的第三方连接池而不是自己写一个是明智的。
在创建连接池之前必须考虑很多参数
答案 1 :(得分:1)
Pascal Thivent在Need Code to create Connection Pool in java上写道:
需要代码在java中创建连接池吗?
不确定问题是什么,但不要创建另一个连接 池,使用现有的解决方案,如C3P0,Apache DBCP,Proxool或 BoneCP(该领域的新玩家)。我会用C3P0。
我们如何确保连接池不返回已使用的同一对象?
因为如果从池中借用了连接而没有 返回,它只是不在池中,不能分配给 池中的另一个客户端(资源从池中删除,直到 他们被退回了。)
如果客户端从连接池中取出连接后关闭连接会怎样?
客户端从池中获取的连接实际上不是 java.sql.Connection,它是一个包装器(代理) java.sql.Connection,用于自定义某些方法的行为。该 close()方法是其中之一,不会关闭Connection 实例但将其返回池中。
也请这个link