CP30连接池。
关键代码:
(1) C3P0JdbcUtil.java
packageex4;
importjava.beans.PropertyVetoException;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importcom.mchange.v2.c3p0.ComboPooledDataSource;//重要
publicclass C3P0JdbcUtil {
public static Connection getConnection()throwsSQLException, PropertyVetoException{//完成初始化
ComboPooledDataSourcecpds = new ComboPooledDataSource();
cpds.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
cpds.setJdbcUrl("jdbc:sqlserver://localhost:1433");
cpds.setUser("sa");
cpds.setPassword("123456");
cpds.setAcquireIncrement(5);
cpds.setInitialPoolSize(10);
cpds.setMaxPoolSize(20);
returncpds.getConnection();
}
public static void release(Connection conn,Statementst,ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(Exceptione){
e.printStackTrace();
}rs=null;
}
if(st!=null){
try{
st.close();
}catch(Exception e){
e.printStackTrace();
}
st=null;
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}
conn=null;
}
}
}
(2)Main.java
packageex4;
importjava.beans.PropertyVetoException;
importjava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclass Main {
public static void main(String[] args)throws PropertyVetoException{
try{
Connectionconn=C3P0JdbcUtil.getConnection();
Statementstmt=conn.createStatement();
Stringsql="select sn,sex from [EDUCATION].[dbo].[Student]";
ResultSetrs=stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("sn")+""+rs.getString("sex"));
}
C3P0JdbcUtil.release(conn,stmt, rs);
}catch(SQLExceptione){
e.printStackTrace();
}
}
}
分析:
1、多次建立connection连接很浪费资源, 每申请一个connection并关闭,效率低下。
数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。若无空闲连接,用户则等待其他用户释放。
2、数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:
最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作。
如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放。
3、主要参数:driver、url、username、Password、initialPoolSize、maxPoolSize
4、编写连接池需实现java.sql.DataSource接口。
DataSource接口中定义了两个重载的getConnection方法:
ConnectiongetConnection()
ConnectiongetConnection(String username, String password)
实现DataSource接口,在用户关闭connetcion的实例的时候,connection实例重新进入到连接池(改写方法)。
5、实现连接池的三种方式:手写DataSource实现类、使用dpcp、使用c3p0
6、配置文件一定要放在src下面(与类在同一目录下),且配置文件中的名字都是固定的。
7、在相应方法实现时一定要先导入相应的包。
8、Java中getResourceAsStream的用法
首先,Java中的getResourceAsStream有以下几种:
1Class.getResourceAsStream(String path) : path 不以‘/’开头时默认是从此类所在的包下取资源,以‘/’开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以‘/’开头,最终是由ClassLoader获取资源。
3ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以‘/’开头无所谓,当然这和具体的容器实现有关。
4Jsp下的application内置对象就是上面的ServletContext的一种实现。
9、CP30可以实现名字绑定,连接多种数据库,常用。