设为首页 收藏本站
查看: 304|回复: 0

[经验分享] 使用DBCP创建MySQL数据库连接池

[复制链接]

尚未签到

发表于 2016-10-17 06:41:21 | 显示全部楼层 |阅读模式
          DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar。
         由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
  【1】配置文件
  

#mysql
db.className=com.mysql.jdbc.Driver
#mysql to write
wdb.url=jdbc:mysql://
wdb.username=root
wdb.pwd=123456
wdb.maxActive=30
wdb.maxIdle=10
wdb.maxWait=3600000
#mysql common config info
common.db.removeAbandoned=false
common.db.removeAbandonedTimeout=120
common.db.testOnBorrow=true
common.db.logAbandoned=true
   【2】创建数据库连接池并获得数据库连接
  

package hhf.dbcp.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
/**
* Get the connection from writing DB
*/
public class WDBConnUtils {
private static BasicDataSource dataSource = null;  
public static void init() {  
if (dataSource != null) {  
try {  
dataSource.close();  
} catch (Exception e) {  
e.printStackTrace();
}  
dataSource = null;  
}  
try {  
Properties p = new Properties();  
p.setProperty("driverClassName", SystemConstants.DB_CLASS_NAME);  
p.setProperty("url", SystemConstants.W_DB_URL);  
p.setProperty("username", SystemConstants.W_DB_USER_NAME);  
p.setProperty("password", SystemConstants.W_DB_USER_PWD);  
p.setProperty("maxActive", SystemConstants.W_DB_MAX_ACTIVE);  
p.setProperty("maxIdle", SystemConstants.W_DB_MAX_IDLE);  
p.setProperty("maxWait", SystemConstants.W_DB_MAX_WAIT);  
p.setProperty("removeAbandoned", SystemConstants.DB_REMOVE_ABANDONED);  
p.setProperty("removeAbandonedTimeout", SystemConstants.DB_REMOVE_ABANDONED_TIMEOUT);  
p.setProperty("testOnBorrow", SystemConstants.DB_TEST_ONBORROW);  
p.setProperty("logAbandoned", SystemConstants.DB_LOG_ABANDONED);  
dataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(p);  
} catch (Exception e) {  
e.printStackTrace();
}  
}  

public static synchronized Connection getConnection() throws  SQLException {  
if (dataSource == null) {  
init();  
}  
Connection conn = null;  
if (dataSource != null) {  
conn = dataSource.getConnection();  
conn.setAutoCommit(false);
}  
return conn;  
}  
/**
* 关闭资源
* @param conn
* @param pstmt
* @param rs
*/
public static void closeResources(Connection conn, PreparedStatement pstmt,ResultSet rs) {
if (null != rs) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (null != pstmt) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
}
}
}
/**
* 关闭资源
* @param conn
* @param pstmt
*/
public static void closeResources(Connection conn, PreparedStatement pstmt) {
if (null != pstmt) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
}
}

   【3】执行插入和查询操作
  

package hhf.dbcp.throughput;
import hhf.dbcp.util.WDBConnUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 数据库操作
* @author HHF
* 2014年12月29日
*/
public class InsertQueryDao {
/**
* 插入数据
* @param num
*/
public void save(String num) {
String NEWS_INFO_INSERT = "INSERT INTO table(num) values(?)";
Connection conn = null;
PreparedStatement pst = null;
try {
conn = WDBConnUtils.getConnection();
pst = conn.prepareStatement(NEWS_INFO_INSERT);
pst.setString(1, num);
pst.execute();
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
WDBConnUtils.closeResources(conn, pst);
}
}
/**
* 查询数据
* @param num
* @return
*/
public String query(String num) {
String NEWS_INFO_QUERY_LIST = "SELECT news_id FROM table num=? ";
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
String result = null;
try {
conn = WDBConnUtils.getConnection();
pst = conn.prepareStatement(NEWS_INFO_QUERY_LIST);
pst.setString(1, num);
rs = pst.executeQuery();
while(rs.next()){
result = rs.getString("news_id");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
WDBConnUtils.closeResources(conn, pst, rs);
}
return result;
}
}

   【4】测试
  

public class Main {
private static final Log log = LogFactory.getLog(Main.class);
public void doProcess(String processTime1, String processTime2, int runMode) {
InsertQueryDao dao = new InsertQueryDao();
String num = dao.query("0");//获得查询结果
log.info("num " + num);
}
}
   (PS:附上项目测试源码和相关的jar包)
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287091-1-1.html 上篇帖子: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operati 下篇帖子: 使用solr从MySQL数据库导入数据并索引
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表