打算做一个数据库连接池的实现,结果遇到了对java运行顺序理解的困惑。麻烦大家帮忙看看,具体问题在下面给出。
这个是工具类。
package com.jdbc.comm;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdbc.connection.DataSource;
public class JdbcUtils {
//非常不解,这一步为什么要在static块前运行!!!
//初始化的时候应该是静态方法(包括静态块)要在非静态属性前面嘛!
private DataSource dataSource = new DataSource();
private JdbcUtils() {
}
private static JdbcUtils instance = new JdbcUtils();
public static JdbcUtils getInstance() {
return instance;
}
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
Connection conn = dataSource.getConnection();
return conn;
}
public void free(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (conn != null) {
dataSource.free(conn);
}
}
}
}
}
这个是自己写的一个DataSource。
package com.jdbc.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
public class DataSource {
private Connection conn = null;
private String url = "jdbc:mysql://localhost:3306/jdbc";
private String username = "root";
private String password = "zzx";
private int maxCount = 5;
private int currentCount = 0;
private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
public DataSource(){
this.createConnection();
}
private LinkedList<Connection> createConnection(){
try {
for(int i=0;i<maxCount;i++){
conn = DriverManager.getConnection(url, username, password);
currentCount++;
connectionPool.addLast(conn);
}
return connectionPool;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public Connection getConnection(){
if(conn != null){
conn = connectionPool.removeFirst();
currentCount--;
}
return conn;
}
public void free(Connection conn){
if(currentCount < maxCount){
connectionPool.addLast(conn);
currentCount++;
}
}
}
下面这个是测试代码
package com.jdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.jdbc.comm.JdbcUtils;
public class DataSourceTest {
public static void main(String[] args) throws SQLException{
Connection conn = null;
PreparedStatement ps =null;
ResultSet rs = null;
JdbcUtils jdbcUtils = JdbcUtils.getInstance();
for(int i=0;i<10;i++){
conn = jdbcUtils.getConnection();
System.out.println(conn);
}
}
}
这个程序运行出错,我已经知道出错的地方,简单来说就是Class.forName("com.mysql.jdbc.Driver")出现在conn = DriverManager.getConnection(url, username, password)后面,所以抛了异常。我也知道怎么改,但是我非常想不通的一点就是,当条用jdbc的构造函数的时候,为什么不先执行JdbcUtils里的静态块,而是先实例化了DataSource。
本人很菜,麻烦各位指点一下。