java 数据库连接池
1. About
java 利用 jdbc 直接连接数据库,经常取得连接,用完释放,很浪费系统资源
2. Code
Java 代码
package com.cdv.mam.db;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;
/
- tomcat 数据库连接池管理类 <br>
- 使用为 tomcat 部署环境 <br>
- 需要在类路径下准备数据库连接配置文件 dbcp.properties
*/
public class DBManager {
private static final Log log = LogFactory.getLog(DBManager.class);
private static final String configFile = "dbcp.properties";
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> DataSource dataSource;
</span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> {
Properties dbProperties </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Properties();
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
dbProperties.load(DBManager.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">.getClassLoader()
.getResourceAsStream(configFile));
dataSource </span>=<span style="color: rgba(0, 0, 0, 1)"> BasicDataSourceFactory.createDataSource(dbProperties);
Connection conn </span>=<span style="color: rgba(0, 0, 0, 1)"> getConn();
DatabaseMetaData mdm </span>=<span style="color: rgba(0, 0, 0, 1)"> conn.getMetaData();
log.info(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Connected to </span><span style="color: rgba(128, 0, 0, 1)">"</span> + mdm.getDatabaseProductName() + <span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span>
+<span style="color: rgba(0, 0, 0, 1)"> mdm.getDatabaseProductVersion());
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (conn != <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">) {
conn.close();
}
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
log.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">初始化连接池失败:</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> e);
}
}
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> DBManager() {
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 获取链接,用完后记得关闭
*
* @see {@link DBManager#closeConn(Connection)}
* @return
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> final Connection getConn() {
Connection conn </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
conn </span>=<span style="color: rgba(0, 0, 0, 1)"> dataSource.getConnection();
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
log.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">获取数据库连接失败:</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> e);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> conn;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 关闭连接
*
* @param conn
* 需要关闭的连接
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> closeConn(Connection conn) {
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (conn != <span style="color: rgba(0, 0, 255, 1)">null</span> && !<span style="color: rgba(0, 0, 0, 1)">conn.isClosed()) {
conn.setAutoCommit(</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
conn.close();
}
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (SQLException e) {
log.error(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关闭数据库连接失败:</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> e);
}
}
}
properties 文件(dbcp.properties)
#数据库驱动 driverClassName=com.mysql.jdbc.Driver #数据库连接地址 url=jdbc:mysql://192.168.1.41:3306/dmc #用户名 username=root #密码 password=root#连接池的最大数据库连接数。设为 0 表示无限制
maxActive=30
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
#接将被标记为不可用,然后被释放。设为 0 表示无限制
maxIdle=10
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1 表示无限制
maxWait=1000#超过 removeAbandonedTimeout 时间后,是否进 行没用连接(废弃)的回收(默认为 false,调整为 true)
removeAbandoned=true
#超过时间限制,回收没有用 (废弃) 的连接(默认为 300 秒,调整为 180)
removeAbandonedTimeout=180
用到的 jar