好久没直接使用jdbc了,今天重温了一下相关知识,并对连接池的使用写了简单的示例,记录在此以便需要的同行参考和方便自己查阅,不足之处欢迎批评指正。
1、dbcp数据源
所需jar包 dbcp:连接池的实现,commons-pool2:连接池实现的依赖
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>dbcp</artifactId> <version>6.0.29</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.0</version> </dependency>在这里我使用了单例模式来创建dbcp数据源,具体代码输入附上注释
private static Connection connection; private static String url="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf-8"; private static String user = "root"; private static String password="root"; private static String driverClassName="com.mysql.jdbc.Driver"; private static Object obj=new Object();
//数据源对象 private static BasicDataSource bds = null;
public static Connection getConnectionByPool(){ if (bds == null) { synchronized (obj) { if (bds == null) { //创建数据源对象 bds = new BasicDataSource(); //设置连接池所需的驱动 bds.setDriverClassName(driverClassName); bds.setUrl(url); bds.setUsername(user); bds.setPassword(password); //设置连接池的初始连接数 bds.setInitialSize(10); //设置连接池最多可以有多少个活动连接数 bds.setMaxActive(20); //设置连接池最少有两个空闲的连接 bds.setMinIdle(2); //通过数据源获取连接 } } } try { return bds.getConnection(); } catch (SQLException e) { e.printStackTrace(); return null; } }
2、c3p0数据源
c3p0相比之下性能更胜一筹,Hibernate推荐使用c3p0连接池。可以自动清理不用的Connection、statement和resultset。
示例中同样采用单例模式来创建连接池,然后从连接池中获取Connection对象。
public static void initc3p0DataSource(){ synchronized (obj){ if (dataSource == null){ dataSource = new ComboPooledDataSource(); try { //注册驱动 dataSource.setDriverClass(driverClassName); //设置数据库url dataSource.setJdbcUrl(url); //设置数据库用户名 dataSource.setUser(user); //设置数据库密码 dataSource.setPassword(password); //设置连接池最大连接数 dataSource.setMaxPoolSize(40); //设置最小连接数 dataSource.setMinPoolSize(2); //设置初始连接数 dataSource.setInitialPoolSize(10); //设置最大statement缓存数 dataSource.setMaxStatements(20); } catch (PropertyVetoException e) { e.printStackTrace(); } } } } public static Connection getConnectionFromc3p0(){ if (dataSource == null){ initc3p0DataSource(); } if (dataSource != null){ try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); return null; } } return null; }