1,直接连接数据库的情形: ,直接连接数据库的情形:
public class DBUtil {
/** * 单例模式创建数据库对象 */
private static DBUtil instance=null;
private DBUtil(){} //为了保证单例性,必须使用同步关键字
public synchronized static DBUtil getInstance(){
if(instance==null) instance=new DBUtil();
return instance;
} //连接必要的信息
public String driver="com.mysql.jdbc.Driver";
public String url="jdbc:mysql://localhost:3306/test";
public String username="root";
public String password="8921498YW";
public Connection getConnection(){
Connection conn=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
} //测试连接的效率
public static void main(String[] args) throws SQLException {
long begin=System.currentTimeMillis();//开始时刻
for(int i=0;i<1000;i++){//获得1000次连接
Connection conn=DBUtil.getInstance().getConnection();
conn.close();
}
long end=System.currentTimeMillis();
System.out.println("直接连接数据库所需要的时 间:"+(end-begin)); //在我的机子上1000次直接连接耗时:12031
}
}
2, 使用 DBCP 连接池: , 连接池: /** * 数据库连接池: * 它是程序启动时建立足够的数据库连接,并将这些连接组成一个连 接池,由程序动态的对池中的连接进行申请,使用,释放 * * DBCP是apache组织下的一个开源项目 * 需要两个jar包,commons-dbcp-1.2.2和commons-pool * 这种连接池效率很高,但经常出现连接丢失现象,用的不是很多, 用的多的是c3p0 * */
public class DBUtilOfDBCP {
private static BasicDataSource dataSource=null;// 数据源
private static DataSourceConnectionFactory factory;//连接工厂
private static DBUtilOfDBCP instance=null; private DBUtilOfDBCP(){
dataSource=new BasicDataSource(); //设置jdbc相关信息
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driver); //连接池设置
dataSource.setInitialSize(20);//初始连接数
dataSource.setMaxActive(100);//最大获取连接数
dataSource.setMaxIdle(30);//最大可用空闲连接数
dataSource.setMinIdle(10);//最小可用空闲连接数
factory=new DataSourceConnectionFactory(dataSource);
} //为了保证单例性,必须使用同步关键字
public synchronized static DBUtilOfDBCP getInstance(){
if(instance==null) instance=new DBUtilOfDBCP();
return instance;
} //连接必要的信息
public String driver="com.mysql.jdbc.Driver";
public String url="jdbc:mysql://localhost:3306/test";
public String username="root";
public String password="8921498YW";
public Connection getConnection() throws SQLException{ //使用工厂创建连接 return factory.createConnection();
}
public static void main(String[] args) throws SQLException {
long begin=System.currentTimeMillis();//开始时刻
for(int i=0;i<1000;i++){//获得1000次连接
Connection conn=DBUtilOfDBCP.getInstance().getConnection();
conn.close();
}
long end=System.currentTimeMillis();
System.out.println("DBCP连接数据库所需要的时 间:"+(end-begin)); //在我的机子上1000次DBCP连接耗时:1000毫秒
}
}
3,使用 C3P0 连接池: , 连接池: * C3P0,比较稳定 * 需要jar包:c3p0-0.9.1
public class DBUtilOfC3P0 {
private static ComboPooledDataSource dataSource;
private static DBUtilOfC3P0 instance=null;
private DBUtilOfC3P0(){ dataSource=new ComboPooledDataSource(); //设置jdbc连接信息
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setJdbcUrl(url);
try { dataSource.setDriverClass(driver);
} catch (PropertyVetoException e) {
e.printStackTrace();
} //设置连接池
dataSource.setInitialPoolSize(30);
dataSource.setMaxPoolSize(100);
dataSource.setMinPoolSize(10); } //为了保证单例性,必须使用同步关键字
public synchronized static DBUtilOfC3P0 getInstance(){
if(instance==null) instance=new DBUtilOfC3P0();
return instance;
} //连接必要的信息
public String driver="com.mysql.jdbc.Driver";
public String url="jdbc:mysql://localhost:3306/test";
public String username="root";
public String password="8921498YW";
public Connection getConnection() throws SQLException{ //使用工厂创建连接
return dataSource.getConnection();
}
public static void main(String[] args) throws SQLException {
long begin=System.currentTimeMillis();
//开始时刻 for(int i=0;i<1000;i++){//获得1000次连接
Connection conn=DBUtilOfC3P0.getInstance().getConnection(); conn.close();
}
long end=System.currentTimeMillis();
System.out.println("C3P0连接数据库所需要的时 间:"+(end-begin)); //在我的机子上1000次C3P0连接耗时:1813毫秒
}
}