在独力的应用程序中创建和使用连接池
在独立的应用程序中创建和使用连接池
很多时候我们都需要独立开发应用程序来处理业务,这个时候也需要利用连接也来进行数据库的访问。这里我们用Apache的DBCP来构造连接池。
DBConnPool.java
package jead.chap4; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp.ConnectionFactory; import org.apache.commons.dbcp.DriverManagerConnectionFactory; import org.apache.commons.dbcp.PoolableConnectionFactory; import org.apache.commons.dbcp.PoolingDriver; import org.apache.commons.pool.ObjectPool; import org.apache.commons.pool.impl.GenericObjectPool; public class DBConnPool { static { setupPool(); } public static void setupPool() { System.out.println("初始化线程池"); String strDBConnUrl = "jdbc:mysql://localhost:3306/test"; // 连接名称 String strPoolName = "testPool"; String strJdbcDriverName = "com.mysql.jdbc.Driver"; String strPoolingDriverName = "org.apache.commons.dbcp.PoolingDriver"; // 接连数据库用户 String strUser = "root"; // 连接数据库密码 String strPassword = "111111"; String strUseUnicode = "true"; // 数据库使用编辑 String strCharacterEncoding = "utf-8"; // 最大活动连接 int intMaxAction = 10; // 最大空闲连接数 int intMaxIdle = 5; // 最大等待连接数 int intMaxWait = 100; try { // 加载JDBC到JVM Class.forName(strJdbcDriverName); // 创建通用对象池 GenericObjectPool connectionPool = new GenericObjectPool(null); // 设置通用对象池参数 connectionPool.setMaxActive(intMaxAction); connectionPool.setMaxIdle(intMaxIdle); connectionPool.setMaxWait(intMaxWait); // 接下来创建连接工厂池,对象会利用连接工产生成数据库连接 // 这里使用的是DriverManagerConnectionFactory连接工产,利用 // 连接参数来构造这个连接工产 Properties prop = new Properties(); prop.setProperty("user", strUser); prop.setProperty("password", strPassword); prop.setProperty("useUnicode", strUseUnicode); prop.setProperty("characterEncoding", strCharacterEncoding); ConnectionFactory connectionFactory = new DriverManagerConnectionFactory( strDBConnUrl, prop); // 现在创建PoolableConnectionFactory对象,安包装了连接工产创建 的连接 使用其池的功能 @SuppressWarnings("unused") PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory( connectionFactory, connectionPool, null, null, false, true); // 最后,创建连接也驱动 Class.forName(strPoolingDriverName); PoolingDriver driver = (PoolingDriver) DriverManager .getDriver("jdbc:apache:commons:dbcp:"); // 用连接池驱动注册连接池到JVM driver.registerPool(strPoolName, connectionPool); // 完成以上步骤以后就可以使用连接池了,我们利用getConnection从池是取得一个返回 } catch (Exception e) { e.printStackTrace(); } System.out.println("连接池:" + strPoolName + "建立成功!"); } //获取连接 public static Connection getConnection(String strPoolName) throws SQLException, ClassNotFoundException { Connection conn = null; conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:" + strPoolName); return conn; } //关闭连接池 public static void closePool(String strPoolName) { try { PoolingDriver driver=(PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); driver.closePool(strPoolName); } catch (Exception e) { e.printStackTrace(); } System.out.println("连接池"+strPoolName+" 成功关闭"); } //打印连接状态 public static void printDriverStats(String strPoolName) { try { PoolingDriver driver=(PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:"); ObjectPool connectionPool= driver.getConnectionPool(strPoolName); System.out.println("NumActive:"+connectionPool.getNumActive()); System.out.println("NumIdle:"+connectionPool.getNumIdle()); } catch (Exception e) { e.printStackTrace(); } } }
TestConnPool.java
运行结果:
初始化线程池 连接池:testPool建立成功! id:1 username:张三 password:111111 desc:一个人 id:2 username:李四 password:111111 desc:一个人 id:3 username:王五 password:111111 desc:一个人 id:4 username:马拉多纳 password:10 desc:阿根足球运动员 id:5 username:坎通纳 password:10 desc:法国足球运动员 id:6 username:罗马里奥 password:10 desc:法国足球运动员 id:7 username:古利特 password:10 desc:荷兰足球运动员package jead.chap4;
import java.sql.*;
public class TestConnPool
{
private boolean stop = false;
public void testQuery()
{
Connection conn = null;
Statement smt = null;
ResultSet rs = null;
try {
conn = DBConnPool.getConnection("testPool");
smt = conn.createStatement();
String sql = "select * from login";
rs = smt.executeQuery(sql);
while (rs.next()) {
System.out.println("id:" + rs.getInt("_id") + " username:"
+ rs.getString("_username") + " password:"
+ rs.getString("_password") + " desc:"
+ rs.getString("_desc"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (smt != null)
smt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
try {
Class.forName("jead.chap4.DBConnPool");
} catch (Exception e) {
e.printStackTrace();
}
TestConnPool tcp = new TestConnPool();
tcp.testQuery();
}
}